Perl

什麼 perl 腳本會 scp 目錄名稱中有空格?

  • July 1, 2014

我已經嘗試了幾個小時來弄清楚如何將 perl 獲取到scp名稱中帶有空格的目錄。我目前遇到了錯誤

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;

有人看到我做錯了什麼嗎?

我究竟做錯了什麼?

使用system. 這將使用您的其餘參數作為選項來分叉一個外殼。換句話說,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

引用自:https://unix.stackexchange.com/questions/140033