Primeiro, você tem certeza de que scp
suporta transferências remotas para remotas? Até onde eu sei, algumas versões fazem isso com a opção -3
.
De qualquer forma, mantenho este script sempre que tenho problemas com argumentos:
#!/usr/bin/perl
my $count;
for (@ARGV) {
s/([\x00-\x1F\x7F])/'\x'.unpack('H*',$1)/ge;
printf "%d: '%s'\n", ++$count, $_;
}
Vamos tentar seu código:
$ 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'
Sim, o escape é bom - minha versão de scp
precisa das barras invertidas no caminho de destino (mas NÃO no caminho local); Eu acho que tem a ver com a execução de ssh
nos bastidores.
Vamos tentar com a coisa real:
$ 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