【问题标题】:Using Perl Net::OpenSSH to sudo test if a file exists, using command concatenation使用 Perl Net::OpenSSH 来 sudo 测试文件是否存在,使用命令连接
【发布时间】:2013-09-19 08:45:32
【问题描述】:

简单的问题,如何使用Net::OpenSSH sudo 测试文件是否存在?我真的很努力想弄清楚这一点,但没有结果。好的,我可以使用包装脚本,但这不是我想要的。

这是我的包装子。它大部分时间都可以正常工作,但它不是在测试文件?!

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 中检查 cmd,这只是一个示例。当然,我也在&amp;sudo() 之后“咀嚼”了结果。 如此简单的任务......我被困住了!

似乎我无法让命令串联工作:有一个extra argument &amp;&amp; 警告。 sub 总是返回undef

这是一个限制吗?这完全支持吗?使用

$f->{ssh}->capture('test -e /user/local/bin/cmd && echo 1 || echo 0');

工作正常,这就是我现在正在使用的。所以前面的额外sudo 应该不是什么大问题...

谁能帮忙?

【问题讨论】:

  • 工作代码的第 1 步是正确缩进的代码。你能修复你的帖子的格式吗?需要markdown帮助的,编辑框右上角有帮助菜单。
  • 嗨!我已经解决了一些问题。我希望现在更好!

标签: perl openssh file-exists


【解决方案1】:

提供给 sudo 的命令的工作方式类似于 perl 的 system()exec() 的列表形式——也就是说,不使用任何 shell。所以像&amp;&amp;|| 这样的shell 元字符在这里都不起作用。要解决此问题,请显式使用 shell:

sudo($f, [], ['sh', '-c', 'test -e /user/local/bin/cmd && echo 1 || echo 0']);

或者,您可以使用Net::OpenSSHsystem() 而不是使用capture(),而只需检查返回值——那么就不需要使用&amp;&amp;||

【讨论】:

  • 非常感谢!对,就是这样!
猜你喜欢
  • 2012-09-20
  • 2016-05-29
  • 2017-07-25
  • 2010-12-28
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多