无法使用未定义的值作为HASH参考

时间:2017-02-14 20:59:05

标签: perl snmp nagios

我试图在wlc上对AP状态进行snmpwalk。我对perl很陌生,所以请耐心等待我,但我正在和this guide合作。我能够很好地获得CPU利用率,但这只是一个获取请求,因为这是一个散步。

我的输入:perl test.pl -H 10.192.54.30 -C public -O .1.3.6.1.4.1.14179.2.2.1.1.6.0 -w 20 -c 30

代码:

#!/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.

1 个答案:

答案 0 :(得分:2)

几个问题:

  • 您正在调用$session->get_request错误。至少,您必须传递-varbindlist选项和一个OID的arrayref。请参阅documentation

  • get_request在出错时返回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;