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 命令的方法:
'--rsh="ssh -q"'
q{--rsh='ssh -q'}
q{--rsh="ssh -q"}
(加上更多)所有这些都给出相同的退出代码 (14)。
我尝试过但没有成功的其他事情:
- 将
ssh
替换为 /usr/bin/ssh
,以防 rsync 无法找到 ssh 二进制文件。
- 使用短选项格式
-e 'ssh -q'
。
- 使用 File::Rsync 模块(rsync 的 perl 包装器)尽量避免引用问题。
- 通过
$ENV{'RSYNC_RSH'}=q{ssh -q}
设置 RSYNC_RSH
环境变量。
- 出于测试目的删除
--archive
和 --update
选项。
所有这些都导致相同的退出代码 14。我无计可施,请帮忙。
system(..., "--rsh=ssh -q", ...)
您正在使用 system LIST
语法,该语法已将每个未插入的参数传递给被调用程序。 Perl 中的 "--rsh=ssh -q"
等同于 shell 中的 --rsh='ssh -q'
。引号会将 ssh
和 -q
视为命令的同一参数的一部分,但引号本身将在 shell 中插入,因此 rsync
将接收参数 --rsh=ssh -q
.
我需要 运行 来自 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 命令的方法:
'--rsh="ssh -q"'
q{--rsh='ssh -q'}
q{--rsh="ssh -q"}
(加上更多)所有这些都给出相同的退出代码 (14)。
我尝试过但没有成功的其他事情:
- 将
ssh
替换为/usr/bin/ssh
,以防 rsync 无法找到 ssh 二进制文件。 - 使用短选项格式
-e 'ssh -q'
。 - 使用 File::Rsync 模块(rsync 的 perl 包装器)尽量避免引用问题。
- 通过
$ENV{'RSYNC_RSH'}=q{ssh -q}
设置RSYNC_RSH
环境变量。 - 出于测试目的删除
--archive
和--update
选项。
所有这些都导致相同的退出代码 14。我无计可施,请帮忙。
system(..., "--rsh=ssh -q", ...)
您正在使用 system LIST
语法,该语法已将每个未插入的参数传递给被调用程序。 Perl 中的 "--rsh=ssh -q"
等同于 shell 中的 --rsh='ssh -q'
。引号会将 ssh
和 -q
视为命令的同一参数的一部分,但引号本身将在 shell 中插入,因此 rsync
将接收参数 --rsh=ssh -q
.