gpt4 book ai didi

linux - IPC::Open3 以不同于独立 snmwalk 命令的行为运行 snmpwalk

转载 作者:太空狗 更新时间:2023-10-29 12:32:09 27 4
gpt4 key购买 nike

我制作了一个自定义 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: No securityName specified

如果我在终端中运行完全相同的命令,它会返回我的结果:

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")

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com