![공백을 포함하는 scp 디렉토리 이름을 지정하는 Perl 스크립트는 무엇입니까?](https://linux55.com/image/39067/%EA%B3%B5%EB%B0%B1%EC%9D%84%20%ED%8F%AC%ED%95%A8%ED%95%98%EB%8A%94%20scp%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%A7%80%EC%A0%95%ED%95%98%EB%8A%94%20Perl%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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.'"' ;