공백을 포함하는 scp 디렉토리 이름을 지정하는 Perl 스크립트는 무엇입니까?

공백을 포함하는 scp 디렉토리 이름을 지정하는 Perl 스크립트는 무엇입니까?

scp나는 Perl이 이름에 공백이 있는 디렉토리에 들어가도록 하는 방법을 알아내기 위해 몇 시간 동안 노력해 왔습니다 . 현재 오류가 발생했습니다.

scp: ambiguous target

다음은 작동하지 않는 스크립트입니다.

#!/usr/bin/perl
# Assuming you already have passwordless ssh setup from some account to root on HOST
# On HOST, setup test files and directories
# root@HOST$ mkdir /tmp/from/spaced\ mydir
# root@HOST$ touch /tmp/from/spaced\ mydir/t1
# root@HOST$ mkdir /tmp/to

my $HOST='localhost';
my $escaped_component_name = 'spaced mydir';

# try to form scp from-arg that will preserve the space
# in the directory name by escaping whitespace with backslash
$escaped_component_name =~ s/(\s)/\\$1/g;
my $scp_from = '/tmp/from/'.$escaped_component_name.'/*';
my $scp_to = '/tmp/to/'.$escaped_component_name;

system 'scp', '-vr', '--', 'root@'.$HOST.':'.$scp_from, 'root@'.$HOST.':'.$scp_to;

내가 뭘 잘못하고 있는지 아는 사람이 있나요?

답변1

내가 뭘 잘못했나요?

사용 system. 이는 쉘을 포크하고 나머지 인수를 옵션으로 사용합니다. 즉, sh따옴표를 먹어라.

노력하다:

system 'scp', '-vr', '--', '"root@'.$HOST.':'.$scp_from.'"', '"root@'.$HOST.':'.$scp_to.'"' ;`

답변2

scp첫째, 원격 간 전송을 지원합니까 ? 내가 아는 한 일부 버전에서는 스위치를 통해 이 작업을 수행합니다 -3.

어쨌든 저는 매개변수에 문제가 있을 때마다 이 스크립트를 편리하게 사용합니다.

#!/usr/bin/perl
my $count;
for (@ARGV) {
  s/([\x00-\x1F\x7F])/'\x'.unpack('H*',$1)/ge;
  printf "%d: '%s'\n", ++$count, $_;
}

코드를 시험해 보겠습니다.

$ perl
my $HOST='localhost';
my $escaped_component_name = 'spaced mydir';

# try to form scp from-arg that will preserve the space
# in the directory name by escaping whitespace with backslash
$escaped_component_name =~ s/(\s)/\\$1/g;
my $scp_from = '/tmp/from/'.$escaped_component_name.'/*';
my $scp_to = '/tmp/to/'.$escaped_component_name;
system 'sandbox/args.pl', '-vr', '--', 'root@'.$HOST.':'.$scp_from, 'root@'.$HOST.':'.$scp_to;
# (Control-D)
1: '-vr'
2: '--'
3: 'root@localhost:/tmp/from/spaced\ mydir/*'
4: 'root@localhost:/tmp/to/spaced\ mydir'

예, 이스케이프는 괜찮습니다. 내 버전에서는 scp대상 경로에 백슬래시가 필요하지만(로컬 경로에는 필요하지 않음) ssh뒤에서 무슨 일이 일어나고 있는지와 관련이 있는 것 같습니다.

실제적인 것으로 시도해 봅시다:

$ perl
$local_dir = "some dir/";
$remote_dir = "/tmp/some dir/";
$remote_dir  =~ s/(\s)/\\$1/g;
system 'scp', $local_dir."login.sql", 'user@host:'.$remote_dir;

# (Control-D)
login.sql            100% |********************************************|   434       00:00

답변3

이것은 나를 위해 일한 최종 스크립트입니다. 의견을 주신 @Ricky Beam과 @arielCo에게 감사드립니다. 파일::사양 사용;

      my $escaped = $component_name;
      $escaped =~ s/(\s)/\\$1/g;

      # scp-from-path
      my $scp_from = File::Spec->catdir($REMOTE_MV_HOME, $escaped,'*');

      # scp-to-path
      my $scp_to = File::Spec->catdir($REMOTE_MV_HOME, $escaped, '\.');

      # use double-quotes on only the to-path because
      # of the double-shelling (local fork of 'sh' and then the remote execution 'sh')

      system 'scp', '-vr', '--', 'root@'.$HOST.':'.$scp_from, 'root@'.$HOST.':"'.$scp_to.'"' ;

관련 정보