如何让 pysnmp 在遍历完指定表列后停止?
数据小许
解决方法
在题目使用的同步生成器接口中,为 nextCmd() 添加 lexicographicMode=False,就可以将遍历限制在初始 OID 的子树内。对当前代码来说,读取完 dot1dTpFdbPort 的所有实例后,遍历就会停止。
该接口默认使用 lexicographicMode=True,允许继续遍历后续 OID。参数行为和子树判断参见 PySNMP 同步 nextCmd 源码与说明。
修改后的代码
保留原来的查询对象,在最后增加参数,并整理 Python 缩进:
from pysnmp.hlapi import *
for errorIndication, errorStatus, errorIndex, varBinds in nextCmd(
SnmpEngine(),
CommunityData('public', mpModel=0),
UdpTransportTarget(('localhost', 161)),
ContextData(),
ObjectType(ObjectIdentity('BRIDGE-MIB', 'dot1dTpFdbPort')),
lexicographicMode=False,
):
if errorIndication or errorStatus:
print(errorIndication or errorStatus)
break
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
为什么会继续读取其他表?
nextCmd() 会反复执行 SNMP GETNEXT,沿 OID 的字典序获取下一个可访问对象。目标列结束后,后面仍可能有其他有效对象。此时原来的错误检查不会触发,程序就会继续输出 dot1dTpFdbStatus 等数据。
设置 lexicographicMode=False 后,生成器会检查返回的 OID 是否仍属于初始 OID 子树,越界后结束迭代。为了识别边界,仍可能收到一次包含越界 OID 的响应,但当前单列查询不会将它作为正常结果输出。
注意事项
dot1dTpFdbPort是表中的一列,当前设置限制的是这一列的子树。如果需要读取整张表,应选择相应的表或条目 OID 作为起点。maxRows可以限制返回行数,但不能代替 OID 边界判断。行数设得过小会截断有效数据。- 示例适用于题目中的
pysnmp.hlapi.nextCmd同步接口。如果安装环境提供的是其他接口,应按对应接口的文档调整调用方式。
备注:内容仅供参考。
