当我试图运行用于snmp检查的perl脚本时,我遇到了这样的错误:
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;
这就是我从打印Dumper$result:$VAR1=undef中得到的;
但如果我将删除if条件,则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;
你没有得到错误,你得到的是警告。
这意味着$$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);
那么它就会起作用。
更新2:从您问题的更新中,我看到您正在从呼叫get_request()
获得undef
。文件上写着:
在任一模式下,当出现错误时,都会返回未定义的值发生。error()方法可用于确定失败。
所以你的下一步行动似乎很明显。
my $result = $session->get_request(-varbindlist => @oidlist)
or warn $session->error.