Perl
什麼 perl 腳本會 scp 目錄名稱中有空格?
我已經嘗試了幾個小時來弄清楚如何將 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