当我尝试使用Net :: SNMP连接到我的设备时,为什么会收到错误“Received usmStatsUnknownUserNames.0 Report-PDU with value 1”?

时间:2015-01-30 09:06:30

标签: linux perl snmp net-snmp

我正在尝试编写一个Perl脚本来执行SNMP get。它应该像以下命令一样工作:

snmpget -v 3 -l authNoPriv -a MD5 -u V3User -A V3Password 10.0.1.203 sysUpTime.0

返回:

SNMPv2-MIB::sysUpTime.0 = Timeticks: (492505406) 57 days, 0:04:14.06

但我的Perl脚本返回以下内容:

ERROR: Received usmStatsUnknownUserNames.0 Report-PDU with value 1 during synchronization.

最后但同样重要的是,这是Perl脚本:

use strict;
use warnings;

use Net::SNMP;

my $desc = 'sysUpTime.0';

my ($session, $error) = Net::SNMP->session(
   -hostname     => '10.0.1.202',
   -version      => 'snmpv3',
   -username     => 'V3User',
   -authprotocol => 'md5',
   -authpassword => 'V3Password'
);

if (!defined($session)) {
      printf("ERROR: %s.\n",  $error);
      exit 1;
}
my $response = $session->get_request($desc);
my %pdesc = %{$response};

my $err = $session->error;
if ($err){
   return 1;
}
print %pdesc;
exit 0;

我在同一台(Linux)机器上调用了Perl脚本和snmpget。可能导致这种情况的原因以及如何解决?

2 个答案:

答案 0 :(得分:3)

作为PrgmError points out,您在Perl脚本中使用的IP地址与snmpget命令中使用的IP地址不同;我会仔细检查一下。您收到的特定错误表明您的用户名错误;如果IP不匹配只是你问题中的拼写错误,我会仔细检查下一个用户名。

关于Perl脚本的其他几点:

使用die

您应该使用die代替printfexit,因为die会打印调用它的行号。如果有多个地方可能会失败,这将使调试脚本变得更容易:

die "Error: $error" if not defined $session;

将打印类似

的内容
Error: foo bar at foo.pl line 17.

另外,在return语句中使用if没有任何意义;我认为你打算使用

if ($err) {
    exit 1;
}

但是您应该die使用您获得的特定错误消息,而不是默默地失败:

die $err if $err;

修复get_request

的参数

您对get_request方法的调用看起来不对。根据{{​​3}},您应该这样称呼它:

my $response = $session->get_request(-varbindlist => [ $oid ]);

请注意,Net::SNMP仅适用于数字OID,因此您必须将sysUpTime.0更改为1.3.6.1.2.1.1.3.0

答案 1 :(得分:1)

查看您的脚本我发现主机名值为10.0.1。 202

但您使用的snmpget命令有10.0.1。 203

任何机会错误的IP?