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

标签 linux perl snmp net-snmp

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

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。可能是什么原因造成的,我该如何解决?

最佳答案

作为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.

此外,在 if 语句中使用 return 没有任何意义;我想你是想用

if ($err) {
    exit 1;
}

但是你应该你得到的特定错误消息而不是默默地失败:

die $err if $err;

修复 get_request 的参数

您对 get_request 方法的调用看起来有误。根据docs ,你应该这样调用它:

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

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

关于linux - 当我尝试使用 Net::SNMP 连接到我的设备时,为什么会收到错误 "Received usmStatsUnknownUserNames.0 Report-PDU with value 1"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28232457/

相关文章:

c - Linux : Check if message queue is empty

linux - "source"命令的参数有什么作用?

perl - CSV 数据中的换行符 Text::CSV reading

java - 不适用于 TCP 的 SNMP 代码

python - 发送到() python

python - 树莓派使用中断方式关机(关机时出现垃圾代码)

linux - 当系统用完进程表时检查当前目录列表?

dbi - [perl]如何强制perl在我自己的路径中使用模块?

Perl, "closure"使用哈希

python - 访问 MIB 对象