使用Perl Net::OpenSSH来sudo测试文件是否存在,使用命令连接



简单的问题,如何使用 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::OpenSSHsystem() 代替capture(),只检查返回值 — 这样就不需要使用 &&|| 了。

最新更新