обновите свой репозиторий сначала и затем установите Ваш пакет
sudo apt-get update && sudo apt-get install squashfs-tools
Вот окончательный сценарий, который работал на меня. Спасибо за ввод @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.'"' ;
Во-первых, вы уверены, что 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
Что я делаю не так?
Используя систему
. Это вставит оболочку с остальными аргументами в качестве опции. Другими словами, sh
ест цитату.
Попробуйте:
system 'scp', '-vr', '--', '"root@'.$HOST.':'.$scp_from.'"', '"root@'.$HOST.':'.$scp_to.'"' ;`