2010-08-03 96 views
0

我是新來的perl,但是我正在爲nagios寫一個插件。我有一個簡單的get請求失敗,但如果我使用snmpwalk嘗試相同的請求,它將起作用。當snmpwalk工作時,Perl Net :: SNMP返回noSuchName

我的代碼是:

#!/usr/bin/perl -w 

use strict; 
use Net::SNMP; 

my $host = '10.10.10.203'; 
my $community = 'myComm'; 
my $session; 
my $error;  
my $response = undef; 

($session, $error) = Net::SNMP->session( 
    -hostname => $host, 
    -version => 2, 
    -community =>$community, 
    -port => 161, 
    -timeout => 20 
); 

my $uptimeOID = '1.3.6.1.2.1.1.3.0'; 
my $myOID = '1.3.6.1.4.1.7933'; 

if(!defined($response = $session->get_request($myOID))) 
{ 
    if($session->error_status == 2) 
    { 
    my $sessionError = $session->error; 
    print ("($sessionError) OID not supported ($myOID).\n"); 
    } 
} 
else 
{ 
    print ("$response"); 
} 

如果我運行此腳本就會失敗說的noSuchName,但如果運行:

snmpwalk -v 2c -c myComm 10.10.10.203 1.3.6.1.4.1.7933 

我得到我想要的響應。有人知道爲什麼這不會工作?
如果我用這個腳本檢查正常運行時間OID,它將按照它應該的方式工作。

回答

0

我發現我的問題。當我使用snmpwalk時,它會抓住整棵樹並返回一個值。 perl模塊不會。即使認爲它下面只有一個東西,它並沒有將樹遍歷到最後,它只是說不。

2

你已經發現,通過命令行你正在做一個「散步」而不是「獲得」。如果您想要在腳本中「獲取」某個特定值,請輸入標識目標的完整OID。

表格記錄中有些東西可能是您想要查看的(並且它看起來像FASTTRAKIDERAID-MIB中的所有內容實際上都是表格式的),所以僅僅使用一個簡單的get就是不夠的。查看Net::SNMP附帶的snmpwalk.pl腳本,或者查看SNMP::Util是否可以輕鬆提供您正在查找的功能。

1

使用get_next_request,而不是get_request。它會在你傳遞的第一個有效的oid之後返回。

相關問題