Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:rsync与';ssh-q';退出代码为14时失败_Perl_Rsync_Quoting - Fatal编程技术网

Perl:rsync与';ssh-q';退出代码为14时失败

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

我需要从perl脚本运行rsync任务。(下面的代码是一个较大脚本的一部分,使用perl是不可避免的。)由于rsync是非交互式运行的,因此我希望避免从上传文件的服务器打印ssh登录横幅。我已经看到,使用命令
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”}
(再加上一些)所有这些都给出了相同的退出代码(14)

其他我尝试过但没有成功的事情:

  • /usr/bin/ssh
    替换
    ssh
    ,以防rsync在查找ssh二进制文件时遇到问题
  • 使用短选项格式
    -e'ssh-q'
  • 使用模块(rsync的perl包装器)尝试避免引用问题
  • 通过
    $ENV{'RSYNC\u RSH'}=q{ssh-q}
    设置
    RSYNC\u RSH
    环境变量
  • 出于测试目的,删除
    --archive
    --update
    选项
所有这些导致相同的退出代码14。我束手无策,请帮忙。

system(…,“-rsh=ssh-q”,…)

您使用的是
系统列表
语法,它已经传递了与被调用程序无关的每个参数<来自Perl的code>“--rsh=ssh-q”相当于shell中的
--rsh='ssh-q'
。引号将把
ssh
-q
视为命令的同一参数的一部分,但引号本身将被插入shell中,因此
rsync
将接收参数为
--rsh=ssh-q

,您可以使用它的方法进行尝试。