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

Perl: rsync with 'ssh -q' fails with exit code 14

我需要 运行 来自 perl 脚本的 rsync 任务。 (下面的代码是一个更大的脚本的一部分,使用 perl 是不可避免的。)由于 rsync 是 运行 非交互的,我想避免从我正在上传文件的服务器打印 ssh 登录横幅。我已经看到使用命令 rsync -e 'ssh -q' 是执行此操作的方法,并且 这可以从命令行 进行。 (好吧,为了脚本的可读性,我使用长选项格式 --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;

第一个命令工作正常 returns 0。第二个命令 returns 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]

正如我所说,但是,运行ning rsync with --rsh='ssh -q' 从命令行确实工作正常,所以我不确定这里发生了什么。我尝试了各种其他引用 ssh 命令的方法:

(加上更多)所有这些都给出相同的退出代码 (14)。

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

所有这些都导致相同的退出代码 14。我无计可施,请帮忙。

system(..., "--rsh=ssh -q", ...)

您正在使用 system LIST 语法,该语法已将每个未插入的参数传递给被调用程序。 Perl 中的 "--rsh=ssh -q" 等同于 shell 中的 --rsh='ssh -q'。引号会将 ssh-q 视为命令的同一参数的一部分,但引号本身将在 shell 中插入,因此 rsync 将接收参数 --rsh=ssh -q.