2015-08-31 77 views
1

當我使用pysnmp並嘗試在一個getCmd命令中獲取多個oid,但其中一個oid不存在時,我無法接收到任何該OID的值,除非我使用的SNMPv2或SNMPv3(代碼變化mpmodel)如果其中一個未使用SNMPv1找到,Pysnmp無法獲得多個oid

from pysnmp.entity.rfc3413.oneliner import cmdgen 
from pysnmp.smi import builder, view, error 

def cbFun_OID(sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): 
    (authData, transportTarget) = cbCtx 
    for oid, val in varBinds: 
     print val.prettyPrint() 
ip='192.168.0.101' 
cmdGen = cmdgen.AsynCommandGenerator() 
cmdGen.getCmd(
    cmdgen.CommunityData('public', mpModel=0), 
    cmdgen.UdpTransportTarget((ip, 161)), 
    ((1,3,6,1,2,1,43,10,2,1,4,1,1),(1,3,6,1,2,1,43,5,1,1,1,1,123456)), 
    (cbFun_OID, (cmdgen.CommunityData('public', mpModel=0), cmdgen.UdpTransportTarget((ip, 161))))) 
cmdGen.snmpEngine.transportDispatcher.runDispatcher() 

如果這兩個OID的存在,我得到兩個值。
如果至少有一個oid不存在,那麼所有的值都是'No This Object Object currently exist at this OID'。
我可以使用asyncGetCmd命令獲取多個oid,但這不是我想要的。
我基本上需要爲每個oid打開一個線程,並單獨掃描它,這是一個非常低效的方法。
例如:

from pysnmp.entity.rfc3413.oneliner import cmdgen 
from pysnmp.smi import builder, view, error 

def cbFun_OID(sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): 
(authData, transportTarget) = cbCtx 
for oid, val in varBinds: 
    print val.prettyPrint() 
ip='192.168.0.101' 
cmdGen = cmdgen.AsynCommandGenerator() 
cmdGen.asyncGetCmd(
    cmdgen.CommunityData('public', mpModel=0), 
    cmdgen.UdpTransportTarget((ip, 161)), 
    ((1,3,6,1,2,1,43,10,2,1,4,1,1),), 
    (cbFun_OID, (cmdgen.CommunityData('public', mpModel=0), cmdgen.UdpTransportTarget((ip, 161))))) 
cmdGen.asyncGetCmd(
    cmdgen.CommunityData('public', mpModel=0), 
    cmdgen.UdpTransportTarget((ip, 161)), 
    ((1,3,6,1,2,1,43,5,1,1,1,1,123456),), 
    (cbFun_OID, (cmdgen.CommunityData('public', mpModel=0), cmdgen.UdpTransportTarget((ip, 161))))) 
cmdGen.snmpEngine.transportDispatcher.runDispatcher() 

如何使用pysnmp獲得多個OID即使一些的OID不存在?

回答

3

您是否試圖從包含不存在變量的SNMP v1響應收集現有變量?在這種情況下,我不確定這是否符合SNMP標準。按照RFC 2576:

4.1.2.3.1. If the error-status is anything other than noError, 
    ... 
    - The variable binding list of the response PDU SHALL be made 
    exactly the same as the variable binding list that was received 
    in the original request. 

由於GET請求通常包含NULL作爲值,則是不會[可靠]接收來自SNMP代理V1每當至少一個變量缺失的任何值。

我指的是v1-> v2c PDU轉換,因爲您使用的pysnmp API在PDU API級別上作爲v2c實體工作,無論對等體在說什麼SNMP版本。

如果您認爲您的特定v1代理程序仍然返回一些有意義的事情,即使報告了錯誤狀態,您也可以使用packet-level API來使用SNMPv1 PDU,因爲它不會調用v1-> v2c PDU轉換代碼在v1中廢除所有內容響應。在嘗試之前,您可能希望enable pysnmp debugging查看您正在獲取的v1 RESPONSE PDU中的實際內容。

如果您認爲此pysnmp行爲違反SNMP標準,請詳細說明您的觀點。

相關問題