2

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 = 文字列: "SATA1"

...

NET::SNMP で問題が解決する可能性があることがわかりましたが、Linux OS が強化されており、インストール オプションがないため、インストールできません。

うまくいかない理由がよくわかりません。

パール -v: 5.8.8

ありがとう!

4

1 に答える 1

1

問題は"-c public v1"引数です:

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

IPC::Open3 open3()関数はfork実行してからexecを実行します。exec引数のリストを指定すると、シェルをバイパスします。したがって、リストを個々の引数に分割する必要があります。

($res, $err) = run_cmd("snmpwalk", "-c", "public", "-v1", "somehostname", "NETAPP-MIB::aggrName")
于 2014-05-07T21:45:17.607 に答える