Pysnmp 7.0.3 Bulk Walk返回未请求额外数据的问题求助
解决pysnmp BulkWalk返回额外数据的问题
问题根源
你遇到的情况是因为pysnmp的BulkWalk默认会持续遍历SNMP OID树,直到没有更多结果返回。你指定的目标OID是接口名称1.3.6.1.2.1.2.2.1.2(ifDescr),但同一接口表(ifTable)下还有其他OID(比如ifType、ifMtu等,OID前缀是1.3.6.1.2.1.2.2.1.x),这些OID会在ifDescr的实例之后被返回,导致你拿到额外数据。而Linux的snmpbulkwalk命令默认会自动过滤,只保留与起始OID前缀完全匹配的结果,所以只返回接口名称。
解决方案
不要用exit(0)终止脚本,而是在回调函数里检查返回的OID是否属于目标分支,当超出目标OID范围时,返回False告诉pysnmp停止继续遍历。
修改后的回调函数示例:
from pysnmp.smi import ObjectIdentity # 定义目标OID TARGET_OID = ObjectIdentity('1.3.6.1.2.1.2.2.1.2') def cbRecvFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBindTable, cbCtx): if errorIndication: print(errorIndication) return False # 出错时停止遍历 elif errorStatus: print(f'{errorStatus.prettyPrint()} at {errorIndex and varBindTable[-1][int(errorIndex)-1][0] or "?"}') return False # 出错时停止遍历 else: keep_walking = True for varBindRow in varBindTable: for oid, val in varBindRow: # 检查当前OID是否是目标OID的子节点(即属于ifDescr的实例) if not TARGET_OID.isPrefixOf(oid): keep_walking = False break print(f'{oid.prettyPrint()} = {val.prettyPrint()}') if not keep_walking: break return keep_walking # 返回是否继续遍历
原理说明
TARGET_OID.isPrefixOf(oid)会检查当前返回的OID是否以目标OID为前缀,只有ifDescr的实例(比如1.3.6.1.2.1.2.2.1.2.1、1.3.6.1.2.1.2.2.1.2.2)会满足这个条件。- 当遇到第一个不属于目标分支的OID时,将
keep_walking设为False,并返回这个值,pysnmp就会停止发起后续的BulkWalk请求。 - 这样既可以拿到所有接口名称数据,又不会返回额外的OID数据,同时脚本也不会被强制终止。
内容的提问来源于stack exchange,提问作者Theyouth1
相关产品推荐
相关产品推荐

