Какой сценарий жемчуга будет scp каталог с пробелами на имя?

обновите свой репозиторий сначала и затем установите Ваш пакет

sudo apt-get update && sudo apt-get install squashfs-tools 
3
01.07.2014, 02:04
3 ответа

Вот окончательный сценарий, который работал на меня. Спасибо за ввод @Ricky Beam и @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.'"' ;
0
27.01.2020, 21:28

Во-первых, вы уверены, что 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
0
27.01.2020, 21:28

Что я делаю не так?

Используя систему . Это вставит оболочку с остальными аргументами в качестве опции. Другими словами, sh ест цитату.

Попробуйте:

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

Теги

Похожие вопросы