当我尝试运行我的perl脚本进行snmp检查时,我遇到了这样的错误:
Use of uninitialized value in division (/) at test.pl line 45.
Use of uninitialized value in division (/) at test.pl line 46.
Illegal division by zero at test.pl line 47.
有我的剧本:
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use Net::SNMP;
my $mem_used = "1.3.6.1.4.1.9.9.48.1.1.1.5";
my $mem_free = "1.3.6.1.4.1.9.9.48.1.1.1.6";
my $mem_used_asr = "1.3.6.1.4.1.9.9.221.1.1.1.1.18.7000.1";
my $mem_free_asr = "1.3.6.1.4.1.9.9.221.1.1.1.1.20.7000.1";
my $dev_check = "1.3.6.1.2.1.47.1.1.1.1.13.1";
my ($session,$error);
($session, $error) = Net::SNMP->session(
-hostname => "some_IP_address",
-version => 2,
-community => "some_community",
-port => 161,
-timeout => 15
);
my @oidlists = ($dev_check);
my $resultat = $session->get_request(-varbindlist => \@oidlists);
$session->close;
$resultat = "@{[%${resultat}]}";
print $resultat;
if ($resultat =~ /some_string/) {
my @oidlist = ($_mem_used_asr, $_mem_free_asr);
43. my $result = $session->get_request(-varbindlist => \@oidlist);
or warn $session->error;
$session->close;
print Dumper $result;
$session->close;
my @load = undef;
45. $load[0]=int($$result{$mem_used_asr}/1024/1024);
46. $load[1]=int($$result{$mem_free_asr}/1024/1024);
47. $load[2]=int($load[0]/($load[0]+$load[1])*100);
print "Memory : used = $load[0] MB, free = $load[1] MB, utilization = $load[2] % :";
} else {
my @oidlist = ($_mem_used, $_mem_free);
my $result = $session->get_request(-varbindlist => \@oidlist);
$session->close;
my @load = undef;
$load[0]=int($$result{$mem_used}/1024/1024);
$load[1]=int($$result{$mem_free}/1024/1024);
$load[2]=int($load[0]/($load[0]+$load[1])*100);
print "Memory : used = $load[0] MB, free = $load[1] MB, utilization = $load[2] % :";
}
exit;
这就是我从print Dumper获得的结果:$ VAR1 = undef;
但如果我将删除条件,则snmp请求正常工作。请你帮助我好吗? (是的,它非常新手perl脚本,因为我不擅长)
例如,这样的代码工作正常:
my @oidlist = ($mem_used_asr, $mem_free_asr);
my $result = $session->get_request(-varbindlist => \@oidlist);
$session->close;
print $result;
my @load = undef;
$load[0]=int($$result{$mem_used_asr}/1024/1024);
$load[1]=int($$result{$mem_free_asr}/1024/1024);
$load[2]=int($load[0]/($load[0]+$load[1])*100);
print "Memory : used = $load[0] MB, free = $load[1] MB, utilization = $load[2] % :";
exit;
答案 0 :(得分:1)
您没有收到错误,您会收到警告。
这意味着$$result{$mem_used}
和$$result{$mem_free}
都未定义。这意味着$load[0]
和$load[1]
都将是未定义的,这会导致您的第三个错误。
所以我们需要仔细看看$result
,看看那里发生了什么。我们从这行代码中获得$result
:
my $result = $session->get_request(@oidlist);
我们很难确定,因为我们无法确切知道什么类型的对象$session
。你提到" snmp",所以让我们猜它是Net::SNMP个对象。该类有一个get_request()方法,它返回一个哈希引用 - 所以它可能是我的猜测是一个很好的(但作为未来的注释 - 要求帮助你调试问题的人做出像这样的猜测并不是很有礼貌。
除此之外,您在这里使用的$$result{$mem_used}
语法非常不标准。大多数Perl程序员都会在$result->{$mem_used}
处写出来。
如果$result->{$mem_used}
未定义,则表示两件事之一。密钥$mem_used
存在且关联值为undef
。或者密钥不存在于散列中。您可以使用exists
函数来检查这两种可能性中的哪一种。
我对SNMP知之甚少,但似乎您正确使用-varbindlist
参数,所以我不认为我可以在追踪问题方面提供更多帮助。我会建议您使用类似Data::Dumper之类的内容,以便在您获得$result
时显示-varbindlist
的内容 - 这可能会让您更好地了解此处发生的事情。
更新:坚持下去。当我说你正确使用get_request()
时,看起来我错了。您有两次拨打my $result = $session->get_request(@oidlist);
$session->get_request(-varbindlist => \@oidlist);
。
-varbindlist
其中第二个调用具有正确的my $result = $session->get_request(-varbindlist => \@oidlist);
参数。第一个(以及你使用结果的那个)是不正确的。
我敢打赌,如果你把这两行合并到:
undef
然后它会起作用。
更新2 :从您的问题的更新中,我发现您从get_request()
的电话回复my $result = $session->get_request(-varbindlist => \@oidlist)
or warn $session->error.
。文档说:
在任一模式下,错误时都会返回未定义的值 发生了。 error()方法可用于确定原因 失败。
所以你接下来的步骤似乎非常明显。
SELECT