【问题标题】:IPC::Open3 run snmpwalk with different behavior than standalone snmwalk commandIPC::Open3 以与独立 snmwalk 命令不同的行为运行 snmpwalk
【发布时间】:2023-03-07 02:56:01
【问题描述】:

我已经制作了一个自定义 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:未指定安全名称

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

NETAPP-MIB::aggrName.1 = STRING: "SAS2"

NETAPP-MIB::aggrName.2 = STRING: "SATA1"

...

我发现 NET::SNMP 可以解决我的问题,但我无法安装它,因为 linux OS 没有安装选项。

我真的不明白为什么它不起作用。

perl -v: 5.8.8

谢谢!

【问题讨论】:

  • 如果您有足够的权限来安装脚本,那么您就有足够的权限来安装模块。
  • $out = &lt;$outfh&gt;; $err = &lt;$errfh&gt;; 如果子级输出足够多到 STDERR 将导致死锁。我建议使用 IPC::Run3 或 IPC::Run 而不是仍然非常低级的 IPC::Open3。如果要坚持使用 IPC::Open3,则必须使用 IO::Select、线程或某种形式的异步 IO,以避免死锁的可能性。

标签: linux perl snmp linux-from-scratch popen3


【解决方案1】:

问题在于"-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")

【讨论】:

  • 没错。更详细地说,打印消息“未指定安全名称”是因为 snmpwalk 认为您需要 SNMP v3,如果没有给出 -v 标志,这是默认版本。因此,正如 snoopy 指出的那样,显然没有收到 -v1 标志。
猜你喜欢
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
相关资源
最近更新 更多