You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:26:12