使用Perl的Net :: SNMP发送陷阱

时间:2012-06-20 22:16:30

标签: perl snmp cpan net-snmp

我正在尝试将陷阱作为更大的Perl脚本的一部分发送。我已经将trapsending代码复制到另一个文件,并且我自己运行它。代码似乎认为陷阱发送成功,但我没有在任何一台机器上看到我有一个陷阱监听器运行的陷阱。

以下是代码:

#! /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. 运行debug时出现此错误。这是什么意思?

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

1 个答案:

答案 0 :(得分:1)

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