Pysnmp:SnmpWalk从下一个oid开始

时间:2015-10-19 10:05:58

标签: python snmp pysnmp

我想从我提供给NextCmd的oid开始走路,而不是之后从oid走。 这是我的代码:

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

def __cbFun_Walk(sendRequestHandle, errorIndication, errorStatus, errorIndex, varBindTable, cbCtx):
    (authData, transportTarget) = cbCtx
    for varBindTableRow in varBindTable:
        for oid, val in varBindTableRow:
            print 'OID: ' + str(oid) + ' VAL: ' + str(val.prettyPrint())
    return False

cmdGen = cmdgen.AsynCommandGenerator()
cmdGen.asyncNextCmd(
        cmdgen.CommunityData('public', mpModel=1),
        cmdgen.UdpTransportTarget(('192.168.0.101', 161)),
        (str('1.3.6.1.2.1.4.1.0'),),
        (__cbFun_Walk, (cmdgen.CommunityData('public', mpModel=1), cmdgen.UdpTransportTarget(('192.168.0.101', 161)))))
cmdGen.snmpEngine.transportDispatcher.runDispatcher() 

此代码打印“OID:1.3.6.1.2.1.4.2.0 VAL:64” 正如你所看到的,它给了我在我提供的oid之后出现的oid的价值 我想使用NextCmd得到oid“1.3.6.1.2.1.4.1.0”的值。

1 个答案:

答案 0 :(得分:1)

您观察到的是GETNEXT / GETBULK SNMP命令应该如何工作。如果要获取一个特定的OID,则应该使用GET命令和GETNEXT迭代。

换句话说,您可以使用两阶段脚本 - 首先针对要读取的OID运行asyncGetCmd()。然后针对相同的OID启动asyncNextCmd()。对于这两个步骤,您可以使用与示例相同的代码。最终,您将获取初始OID和所有后续OID。

或者,一种黑客方法,就是人为地“减少”你所瞄准的OID,以便“减少”的OID的“下一个”OID将成为你想要阅读的OID。在这里,您有两个选择:要么可以剥离最后一个子OID(例如,最终得到1.3.6.1.2.1.4.1),要么递减最右边的大于零的子OID(例如1.3.6.1.2.1。 4.0.0)。

这里的问题是,通常你不能完全确定没有OID介于两者之间。然后你可能最终得到错误的OID作为回应。然而剥离最后的'0'可能是保存(因为它是一个标量)。

作为旁注:考虑尝试latest high-level APU,可能会更容易处理。