Perl:rsync与';ssh-q';退出代码为14时失败
我需要从perl脚本运行rsync任务。(下面的代码是一个较大脚本的一部分,使用perl是不可避免的。)由于rsync是非交互式运行的,因此我希望避免从上传文件的服务器打印ssh登录横幅。我已经看到,使用命令Perl:rsync与';ssh-q';退出代码为14时失败,perl,rsync,quoting,Perl,Rsync,Quoting,我需要从perl脚本运行rsync任务。(下面的代码是一个较大脚本的一部分,使用perl是不可避免的。)由于rsync是非交互式运行的,因此我希望避免从上传文件的服务器打印ssh登录横幅。我已经看到,使用命令rsync-e'ssh-q'是实现这一点的方法,并且可以从命令行中运行。(为了脚本的可读性,我使用了long选项格式--rsh='ssh-q') 然而,我似乎无法从我的perl脚本中实现这一点。以下是守则的相关部分: #!/usr/bin/env perl use strict; use
rsync-e'ssh-q'
是实现这一点的方法,并且可以从命令行中运行。(为了脚本的可读性,我使用了long选项格式--rsh='ssh-q'
)
然而,我似乎无法从我的perl脚本中实现这一点。以下是守则的相关部分:
#!/usr/bin/env perl
use strict;
use warnings;
my $src = '/path/to/myfile';
my $dest = 'remote:/path/to/target';
my @rsync_cmd;
# this one works, returns 0
@rsync_cmd = ('rsync', '--archive', '--update', '--rsh=ssh', $src, $dest);
system(@rsync_cmd);
print "Exit code: ", $? >> 8, "\n\n";
# this one doesn't, returns 14
@rsync_cmd = ('rsync', '--archive', '--update', '--rsh=\'ssh -q\'', $src, $dest);
system(@rsync_cmd);
print "Exit code: ", $? >> 8;
第一个命令工作正常并返回0。第二个命令返回14(IPC代码错误),并给出以下输出:
rsync: Failed to exec ssh -q: No such file or directory (2)
rsync error: error in IPC code (code 14) at pipe.c(85) [sender=3.1.1]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in IPC code (code 14) at io.c(226) [sender=3.1.1]
但是,正如我所说的,从命令行运行rsync和--rsh='ssh-q'
确实可以很好地工作,所以我不确定这里发生了什么。我尝试了引用ssh命令的各种其他方式:
'--rsh=“ssh-q”
q{--rsh='ssh-q'}
q{--rsh=“ssh-q”}
- 用
替换/usr/bin/ssh
,以防rsync在查找ssh二进制文件时遇到问题ssh
- 使用短选项格式
-e'ssh-q'
- 使用模块(rsync的perl包装器)尝试避免引用问题
- 通过
设置$ENV{'RSYNC\u RSH'}=q{ssh-q}
环境变量RSYNC\u RSH
- 出于测试目的,删除
和--archive
选项--update
system(…,“-rsh=ssh-q”,…)
您使用的是系统列表
语法,它已经传递了与被调用程序无关的每个参数<来自Perl的code>“--rsh=ssh-q”相当于shell中的--rsh='ssh-q'
。引号将把ssh
和-q
视为命令的同一参数的一部分,但引号本身将被插入shell中,因此rsync
将接收参数为--rsh=ssh-q
,您可以使用它的方法进行尝试。