IPC :: Open3运行与独立snmwalk命令不同行为的snmpwalk

我已经做了一个自定义的子使用Open3在Perl中运行各种terminal命令。

我遇到了snmpwalk的一个奇怪的问题,当我在terminal运行命令它的工作,但与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

如果我在terminal运行完全一样的命令,它会返回我的结果:

NETAPP-MIB :: aggrName.1 = STRING:“SAS2”

NETAPP-MIB :: aggrName.2 = STRING:“SATA1”

我发现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然后执行exec 。 当给定参数列表时, exec绕过shell。 所以这个列表需要分解成单个的参数:

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