Perl Can';t使用未定义的值作为哈希引用
我正在尝试在wlc上进行snmpwalk,以了解AP状态。我对perl真的是个新手,所以请容忍我,但我一直在与perl合作。我能够很好地获得CPU利用率,但这只是一个get请求,因为这是一次散步Perl Can';t使用未定义的值作为哈希引用,perl,snmp,nagios,Perl,Snmp,Nagios,我正在尝试在wlc上进行snmpwalk,以了解AP状态。我对perl真的是个新手,所以请容忍我,但我一直在与perl合作。我能够很好地获得CPU利用率,但这只是一个get请求,因为这是一次散步 我的输入:perltest.pl-h10.192.54.30-cpublic-O.1.3.6.1.4.1.14179.2.2.1.1.6.0-w20-c30 守则: #!/bin/perl use strict; use warnings; use Net::SNMP; use Getopt::Long
我的输入:
perltest.pl-h10.192.54.30-cpublic-O.1.3.6.1.4.1.14179.2.2.1.1.6.0-w20-c30
守则:
#!/bin/perl
use strict;
use warnings;
use Net::SNMP;
use Getopt::Long qw(:config no_ignore_case);
my $hostaddr = '';
my $community = '';
my $crit = '';
my $warn = '';
my $oid = '';
GetOptions(
"host|H=s" => \$hostaddr,
"community|C=s" => \$community,
"crit|c:s" => \$crit,
"warn|w:s" => \$warn,
"oid|O=s" => \$oid);
print "$hostaddr $community $crit $warn $oid\n";
my ($session, $error) = Net::SNMP->session(
-hostname => "$hostaddr",
-community => "$community",
-timeout => "30",
-port => "161");
if (!defined($session)) {
printf("ERROR: %s.\n", $error);
exit 1;
}
my $response = $session->get_table( -baseoid => $oid );
if (! defined $response) {
die "Failed to get OID '$oid': " . $session->error;
}
foreach my $key (keys %$response) {
print "$key: $response->{$key}\n";
}
my $err = $session->error;
if ($err){
return 1;
}
print "\n";
exit 0;
输出:
10.192.54.30 public 30 20 .1.3.6.1.4.1.14179.2.2.1.1.6.0
Can't use an undefined value as a HASH reference at test.pl line 26.
几个问题:
- 你打错了
。至少,您必须传递$session->get\u request
选项和OID的arrayref。看-varbindlist
在出错时返回get\u请求
,并且由于undef
不是散列引用,因此不能取消对它的引用。在尝试使用undef
执行某些操作之前,必须检查错误$response
- 您不应该仅为了打印而将
的内容复制到单独的散列中$response
my $response = $session->get_request( -varbindlist => [$desc] );
if (! defined $response) {
die "Failed to get OID '$desc': " . $session->error;
}
foreach my $key (keys %$response) {
print "$key: $response->{$key}\n";
}
# Alternatively,
# use Data::Dumper; print Dumper $response;
get_request()在代码中失败。因此,$response对象未定义。您尝试访问未定义的值。Print$err以获取更多信息。我在第29行添加了Print$err并获得相同的输出。您确定吗$session->error()应该打印get_request()中的错误。请参阅:您的代码有
严格
和警告
!而你的教程没有。太棒了!即使您声称自己对Perl非常陌生,但您正在正确地完成最关键的事情。干得好:)您可以直接使用Data::Dumper查看$session
<代码>使用数据::转储程序;打印转储程序$session代码>。这是一个对象,但它只会显示与它关联的数据。大多数情况下,这是开始调试的最佳位置。请注意,use
语句位于顶部,但如果它只是用于调试,您稍后会将其取出,请将其放在需要的地方。这样,您将记得稍后删除它。这似乎解决了一个问题,但现在我得到“错误索引1处的Received noSuchName(2)错误状态”,但是我可以用snmpwalk.snmpwalk-cpublic 10.192.54.30-v1.1.3.6.1.4.1.14179.2.1.1.6iso.3.6.1.4.1.14179.2.2.1.1.6.176.170.119.98.152.208=整数:1iso.3.1.4.1.1.14179.2.2.2.2.1.1.1.6.176.170.119.119.204.244.0=整数:1iso.3.6.1.1.1.1.4.1.1.1.1.1.2.2.2.2.244.244.2.224.1=整数:244.224.1=整数:1.224.224.1.224.1.224.1=整数:244.1.11.18.18.180.18.16=整数:整数:整数:整数:整数:整数:整数:整数:整数:整数:整数:整数:整数:整数:整数:1 iso.3.6.6.6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.1.14179.2.2.1.1.6-w 20-C 3010.76.64.12 r350urc31 30 20.1.3.6.1.4.1.14179.2.2.1.1.6未能获取OID'.1.3.6.1.4.1.14179.2.2.1.1.6':在test.pl第28行的错误索引1处接收到noSuchName(2)错误状态。@red_eagle要进行苹果对苹果的比较,应使用snmpget
而不是snmpwalk
。我在您的snmpwalk
输出中没有看到OID.1.3.6.1.4.1.14179.2.2.1.1.6
,因此我认为您的SNMP代理不提供它。OID是第一部分。我理解你的意思,所以我正在尝试用get_next_请求设置一个while循环,只要定义了$response,它就可以工作。真的,如果你想知道真正的目标是什么,我用Nagios/icinga写的,但是Nagios/icinga似乎更喜欢perl。