简单的问题,如何使用 sudo 测试文件是否存在Net::OpenSSH
?我真的很努力地想弄清楚这一点,但没有结果。好的,我可以使用包装脚本,但这不是我想要的。
这是我的包装子。它大部分时间都工作正常,但它不是在测试文件?!
sub sudo {
my $f = shift;
my $h = shift;
my $cmd = shift;
my @out = $f->{ssh}->capture(
{ stdin_data => ["$f->{pwd}n", @$h ] },
'/usr/bin/sudo','-Sk','-p','','--',
@{$cmd}
);
return @out;
}
&sudo($f, [], ['test', '-e', '/user/local/bin/cmd', '&&', 'echo', '1', '||', 'echo', '0']); # <= fails
&sudo($f, [], ['test -e /user/local/bin/cmd && echo 1 || echo 0']); # <= fails too
... # arbitrary other $str/$array combinations ...
我知道,我不必在/usr/local/bin
中sudo检查cmd,这只是一个例子。当然,我也在&sudo()
后"刁碎"了结果. 这么简单的任务...我被困住了!
似乎我无法使命令串联正常工作:有一个extra argument &&
警告。子总是返回undef
.
这是一个限制吗?这是否完全支持?用
$f->{ssh}->capture('test -e /user/local/bin/cmd && echo 1 || echo 0');
工作正常,这就是我现在正在使用的。所以前面的额外sudo
应该不是那么大的问题......
谁能帮忙?
提供给 sudo 的命令的工作方式类似于 perl 的 system()
或 exec()
的列表形式——也就是说,不使用任何 shell。因此,任何像 &&
或 ||
这样的 shell 元字符在这里都不起作用。要解决此问题,请显式使用 shell:
sudo($f, [], ['sh', '-c', 'test -e /user/local/bin/cmd && echo 1 || echo 0']);
或者,您可以使用 Net::OpenSSH
的 system()
代替capture()
,只检查返回值 — 这样就不需要使用 &&
和 ||
了。