より大きなPerlスクリプトの一部としてトラップを送信しようとしています。トラップ送信コードを別のファイルにコピーし、それを単独で実行しています。コードはトラップが正常に送信されたと考えているようですが、トラップリスナーを実行しているどちらのマシンにもトラップが表示されていません。
コードは次のとおりです。
#! /usr/local/bin/perl
use strict;
use warnings;
use Net::SNMP;
#messy hardcoding
my $snmp_target = '192.168.129.50';
#my $snmp_target = '10.200.6.105'; # Server running trap listener
my $enterprise = '1.3.6.1.4.1.27002.1';
my ($sess, $err) = Net::SNMP->session(
-hostname => $snmp_target,
-version => 1, #trap() requires v1
);
if (!defined $sess) {
print "Error connecting to target ". $snmp_target . ": ". $err;
next;
}
my @vars = qw();
my $varcounter = 1;
push (@vars, $enterprise . '.' . $varcounter);
push (@vars, OCTET_STRING);
push (@vars, "Test string");
my $result = $sess->trap(
-varbindlist => \@vars,
-enterprise => $enterprise,
-specifictrap => 1,
);
if (! $result)
{
print "An error occurred sending the trap: " . $sess->error();
}
編集:$ sess-> debug(255)呼び出しを追加しました。出力は次のとおりです。
debug: [440] Net::SNMP::Dispatcher::_event_insert(): created new head and tail [ARRAY(0x1af1fea8)]
debug: [687] Net::SNMP::Message::send(): transport address 192.168.129.50:161
debug: [2058] Net::SNMP::Message::_buffer_dump(): 70 bytes
[0000] 30 44 02 01 00 04 06 70 75 62 6C 69 63 A4 37 06 0D.....public.7.
[0016] 09 2B 06 01 04 01 81 D2 7A 01 40 04 C0 A8 81 85 .+......z.@.....
[0032] 02 01 06 02 01 01 43 01 00 30 1B 30 19 06 0A 2B ......C..0.0...+
[0048] 06 01 04 01 81 D2 7A 01 01 04 0B 54 65 73 74 20 ......z....Test
[0064] 73 74 72 69 6E 67 string
debug: [517] Net::SNMP::Dispatcher::_event_delete(): deleted [ARRAY(0x1af1fea8)], list is now empty
編集:トラップリスナーを実行している人は、自分のマシンでこのコードを試して、それが機能するかどうかを知らせてもらえますか?
編集:私のMBPから試してみました。同じ結果。次に、デバッグ情報がポート161に送信していることを示していることに気付きました。-port => 162
パラメータを強制し、動作します。それは私にいくつかの質問を残します:
- トラップ送信者がデフォルトで161になるのはなぜですか?
デバッグをオンにして実行すると、このエラーが発生します。どういう意味ですか?
エラー:[97] Net :: SNMP :: Transport :: IPv4 :: UDP :: agent_addr():切断に失敗しました:アドレスファミリはプロトコルファミリでサポートされていません