
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.'"' ;