2017-02-14 35 views
2

Я пытаюсь сделать snmpwalk для статуса AP на wlc. Я действительно новичок в Perl, так голый со мной, но я работал с this guide. Я смог получить утилиту CPU просто отлично, но это был просто запрос на получение, когда это прогулка.Невозможно использовать неопределенное значение в качестве ссылки HASH

Мой вход: 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. 
+0

get_request() терпит неудачу в своем коде. Поэтому объект $ response не определен. Вы пытаетесь получить доступ к неопределенному значению. Распечатайте $ err, чтобы получить дополнительную информацию. – user3606329

+0

Я добавил print $ err в строке 29 и получаю тот же результат. – cflinspach

+0

Вы уверены? $ session-> error() должен печатать вам ошибку из get_request(). См. Http://search.cpan.org/~dtown/Net-SNMP-v6.0.1/lib/Net/SNMP.pm#error()_-_get_the_current_error_message_from_the_object – user3606329

ответ

2

Несколько проблем:

  • Вы звоните $session->get_request неправильно. Как минимум, вы должны передать опцию -varbindlist и arrayref из OID. См. 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; 
+0

Это, казалось, исправить одну проблему, но теперь я получаю «Полученный статус ошибки noSuchName (2) при ошибке-index 1», но я могу просто отлично подобрать OID с помощью snmpwalk. – cflinspach

+0

@red_eagle Можете ли вы показать полную команду 'snmpwalk', которую вы запустили? – ThisSuitIsBlackNot

+0

snmpwalk -c public 10.192.54.30 -v 1 .1.3.6.1.4.1.14179.2.2.1.1.6 iso.3.6.1.4.1.14179.2.2.1.1.6.176.170.119.98.152.208 = INTEGER: 1 iso. 3.6.1.4.1.14179.2.2.1.1.6.176.170.119.204.244.0 = INTEGER: 1 iso.3.6.1.4.1.14179.2.2.1.1.6.244.207.226.84.120.224 = INTEGER: 1 iso.3.6. 1.4.1.14179.2.2.1.1.6.244.207.226.133.180.16 = INTEGER: 1 iso.3.6.1.4.1.14179.2.2.1.1.6.244.207.226.137.75.224 = INTEGER: 1 iso.3.6.1.4.1.14179.2.2.1.1.6.244.207.226.137.116.80 = INTEGER: 1 iso.3.6.1.4.1.14179.2.2.1.1.6.244.207.226.137.117.144 = INTEGER: 1 – cflinspach