Que script perl conterá o diretório scp com espaços no nome?

3

Eu tenho tentado por várias horas descobrir como obter perl para scp um diretório com um espaço no nome. Atualmente estou recebendo o erro

scp: ambiguous target

Aqui está o script que não está funcionando:

#!/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;

Alguém vê o que estou fazendo errado?

    
por buzz3791 30.06.2014 / 22:34

3 respostas

0

Aqui está o roteiro final que funcionou para mim. Graças à entrada de @Ricky Beam e @arielCo.           use File :: Spec;

      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.'"' ;
    
por 01.07.2014 / 15:44
2

What am I doing wrong?

Usando system . Isso vai bifurcar um shell com o resto de seus argumentos como opções. Em outras palavras, sh está comendo a citação.

Tente:

system 'scp', '-vr', '--', '"root@'.$HOST.':'.$scp_from.'"', '"root@'.$HOST.':'.$scp_to.'"' ;'
    
por 01.07.2014 / 01:04
0

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
    
por 01.07.2014 / 03:48