当前位置: 代码迷 >> python >> Pysnmp:SnmpWalk从下一个oid开始
  详细解决方案

Pysnmp:SnmpWalk从下一个oid开始

热度:73   发布时间:2023-06-13 14:59:44.0

我想从我提供给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”的值。

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

换句话说,您可能有两个阶段的脚本-首先,对要读取的OID运行asyncGetCmd()。 然后,您针对相同的OID启动asyncNextCmd()。 对于这两个步骤,您都可以使用示例中几乎相同的代码。 最终,您将同时获取初始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”可能会节省(因为它是标量)。

附带说明:考虑试用 ,可能会更容易处理。