问题描述
我想从我提供给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楼
您所观察到的正是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”可能会节省(因为它是标量)。
附带说明:考虑试用 ,可能会更容易处理。