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
ありがとう!