Perl Can';t使用未定义的值作为哈希引用

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

我正在尝试在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 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
    。至少,您必须传递
    -varbindlist
    选项和OID的arrayref。看

  • 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。