2013-12-17 60 views
0

我正在使用PHP 5.3和SNMP在沒有按正確順序返回的OID節點上執行snmpwalk。因此,我得到錯誤「錯誤:OID不增加」,我無法找到一種方法來忽略這一點。使用php snmpwalk「錯誤:OID不增加」

或者,我認爲我可以執行一系列snmpgetnext命令來手動執行漫遊,但我不知道要獲取下一個OID值來發出下一個getnext命令。

http://www.php.net/manual/en/ref.snmp.php

上任何一個解決方案任何意見將是一個巨大的幫助。 謝謝。

什麼我試圖獲取bash腳本是:

snmpwalk -c public -v 1 -Cc 10.3.1.42 1.0.8802.1.1.2.1.4.1.1.9

無序的結果是:

iso.0.8802.1.1.2.1.4.1.1.9.340550.15.15 = STRING: "Switch Name" 
iso.0.8802.1.1.2.1.4.1.1.9.29566.16.16 = STRING: "Switch Name" 
iso.0.8802.1.1.2.1.4.1.1.9.29486.17.17 = STRING: "Switch Name" 
iso.0.8802.1.1.2.1.4.1.1.9.101547.18.18 = STRING: "Switch Name" 
iso.0.8802.1.1.2.1.4.1.1.9.399668.19.19 = STRING: "Switch Name" 
+0

你捕獲網絡數據包,看看這是否是一個SNMP代理端問題? –

+0

我已經用bash腳本執行了snmpwalk,它顯示OID值沒有排序。使用-Cc開關查找遞減的OID值時,我可以忽略中止的默認操作。可悲的是我無法找到一種方法來做到這一點與PHP。 –

回答

1

編輯:它看起來像這可能僅僅是可能使用PHP 5.4或更高; 「getnext」系列函數返回實際的OID的能力直到那時才被引入。中的「GETNEXT」功能神奇

部分原因是,它給你的下一個OID價值。不過,你需要哄騙PHP以一種合理的格式提供給你。直觀的方法最終會給你提供下一個OID的而沒有別的,這沒有幫助。

但是,首先,您可以使用這些選項使PHP返回更有意義的一組信息。特別是,我們希望OID以其原始數字形式。此外,我們希望有一個對象持有的價值,使我們可以檢查類型的值是回來了,妥善處理這個問題(例如,文本,整數,計數器等來區分):

// Note: Prior to PHP 5.4.0, SNMP_VALUE_OBJECT implied SNMP_VALUE_PLAIN. 
snmp_set_valueretrieval(SNMP_VALUE_OBJECT | SNMP_VALUE_PLAIN); 
snmp_set_quick_print(1); 
snmp_set_enum_print(0); 
snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC); 

基本上,所有這些一起使得它的輸出是機器可讀的,而不是相當愚蠢的默認值。

有了這樣的方式,你可以再問問PHP讓你的下一個OID:

$result = @snmp2_getnext($ipAddress, $communityString, [ $oidString ]); 

這是非常需要注意的是,你在(「$ oidString」通過OID )作爲數組的唯一元素傳入。這會導致PHP返回一個數組,其中該數組的索引下一個OID。因爲我們告訴PHP我們需要數字輸出,所以我們可以有意義地讀取/解析這個OID。

$nextOid = key($result); 
$nextValue = $result[ $nextOid ]; 

例如,您可以嘗試「.1.3.6.1」(「internet」)的OID。在這種情況下,下一個 OID可能會是「.1.3.6.1.2.1.1.1.0」(「sysDescr。0「)或其他一些OID(即無論哪一個是」下一個「)。然後您可以拿」$ nextOid「並將其反饋回去,直到完成爲止。不要在你給它的原始OID「之下」,因此,你可能需要檢查以確保返回的OID在你給它的第一個OID的範圍內(如果你對「snmpwalk的」更換)。

此外,由於OID回來爲文本,你可能希望使用PHP具有自然排序函數來確定下一個OID是否被「增加」。

最後,記住t PHP爲不同版本的SNMP使用不同的功能。他們確實添加了一個可以實例化的「SNMP」類,但我還沒有玩過那麼多。

+0

感謝您的回覆。我得到錯誤「snmp2_getnext()期望參數3是字符串,數組給出」這是由[文檔](http://www.php.net/manual/en/function.snmp2-getnext.php) –

+0

你是對的;看起來他們只是在5.4中添加了支持數組(我概述它的方式):http://php.net/manual/en/snmp.getnext.php –

0

NetSNMP的對象版本有一個標誌可以繞過需要的有序OID。

<?php 
    $dataSNMP = array(); 
    $ipDevice = "10.206.4.38"; 

    $SNMP = new SNMP(1, $ipDevice, "public"); 
    $SNMP->oid_increasing_check = false; 
    $dataSNMP = $SNMP->walk("1.3.6.1.4.1.14988.1.1.1.3.1.8"); 
    $SNMP->close(); 
?> 

使用這個,你將得到所有的數據沒有任何警告。唯一的問題是,你需要PHP> = 5.4.0