我已经制作了一个自定义的sub来使用open3在perl中运行各种终端命令。
我在snmpwalk中遇到了一个奇怪的问题,当我在终端中运行这个命令时,它可以工作,但是在open3中它不会。
潜艇是这样的:

sub run_cmd {
    my ( $cmd, @args ) = @_;
    my ( $infh, $outfh, $errfh, $pid, $out, $err );

    use Symbol 'gensym';
    $errfh = gensym();    # open3 does not init stderr, we have to do it.

    output( "run_cmd: $cmd @args\n", 2, 1 ); #for debug
    eval { $pid = open3( $infh, $outfh, $errfh, $cmd, @args ); } or do {
        if ($@) {
            output("Error: open3 error $@\n");
            exit $CODES{CRITICAL}; #exit 2;
        }
    };
    {   # anonym block to limit $/ redefinition
        local $/ = undef;
        $out = <$outfh>;
        $err = <$errfh>;
    }
    return ( $out, $err );
}

我称之为:
 ($res, $err) = run_cmd("snmpwalk", "-c public -v1", "somehostname", "NETAPP-MIB::aggrName");

如果要运行以下命令:
snmpwalk-c public-v1 somehostname netapp-mib::aggrname
返回$err:
snmpwalk:未指定securityname
如果我在终端中运行完全相同的命令,它将返回我的结果:
netapp-mib::aggrname.1=字符串:“sas2”
netapp-mib::aggrname.2=字符串:“sata 1”

我发现net::snmp可以解决我的问题,但是我无法安装它,因为强化的linux操作系统没有安装选项。
我真不明白为什么它不起作用。
perl-v:5.8.8版本
谢谢!

最佳答案

问题是"-c public v1"参数:

($res, $err) = run_cmd("snmpwalk", "-c public -v1", "somehostname", "NETAPP-MIB::aggrName");

IPC::Open3 open3()函数执行fork然后execexec在给定参数列表时绕过shell。因此,需要将列表分解为各个参数:
($res, $err) = run_cmd("snmpwalk", "-c", "public", "-v1", "somehostname", "NETAPP-MIB::aggrName")

关于linux - IPC::Open3以与独立snmwalk命令不同的行为运行snmpwalk,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23525992/

10-11 08:09