一个简单的问题,如何使用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 ...
我知道,我不必在sudo中检查cmd /usr/local/bin
,这只是一个示例。当然,我也将结果“砍掉” &sudo()
。如此简单的任务...我被困住了!
看来我无法使命令串联工作:有extra argument &&
警告。子总是返回undef
。
这是一个限制吗?完全支持吗?使用
$f->{ssh}->capture('test -e /user/local/bin/cmd && echo 1 || echo 0');
工作正常,这就是我现在正在使用的。因此sudo
,前面的其他问题不应该太大。
有人可以帮忙吗?
提供给sudo的命令的工作方式类似于perlsystem()
或exec()
-的列表形式,即不使用任何shell。因此,任何shell元字符都喜欢&&
或||
不会在这里工作。要解决此问题,请显式使用外壳程序:
sudo($f, [], ['sh', '-c', 'test -e /user/local/bin/cmd && echo 1 || echo 0']);
或者,而不是使用capture()
您可以使用Net::OpenSSH
的system()
,而不是,只是检查返回值-那么就没有必要使用&&
和||
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句