2

我正在尝试将陷阱作为更大 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参数,它可以工作。这给我留下了几个问题:

  1. 为什么陷阱发送者默认为 161?
  2. 当我在调试时运行时出现此错误。这是什么意思?

    错误:[97] Net::SNMP::Transport::IPv4::UDP::agent_addr():断开连接失败:协议族不支持地址族

4

1 回答 1

1

通过将“端口”设置从默认值 161 更改为 162 来修复。

于 2012-06-28T20:06:29.083 回答