新手求助:用pysnmp-lextudio的walkCmd遍历指定OID子节点遇错误求示例
解决pysnmp-lextudio walkCmd使用问题及遍历指定OID子节点示例
错误原因
await关键字只能在异步函数(用async def定义)内部使用,直接在脚本顶层或命令行中调用会触发语法错误。
正确遍历指定OID直接子节点的示例代码
以下代码使用walkCmd遍历ciscoSmartLicMIB(.1.3.6.1.4.1.9.9.831)的直接子OID,对应旧方法中lexicographicMode=False的行为:
from pysnmp.hlapi.asyncio import * import asyncio async def main(): # 配置SNMP参数并执行walk errorIndication, errorStatus, errorIndex, varBinds = await walkCmd( SnmpEngine(), CommunityData('public'), # 替换为设备实际的社区字符串 UdpTransportTarget(('your_device_ip', 161)), # 替换为设备IP和SNMP端口 ContextData(), ObjectType(ObjectIdentity('.1.3.6.1.4.1.9.9.831')), lexicographicMode=False, # 仅返回基础OID的直接子节点 lookupMib=False # 直接输出OID字符串,关闭MIB符号解析(可选) ) # 处理结果 if errorIndication: print(errorIndication) elif errorStatus: print(f'{errorStatus.prettyPrint()} at {errorIndex and varBinds[int(errorIndex)-1][0] or "?"}') else: for oid, value in varBinds: print(f'{oid.prettyPrint()} = {value.prettyPrint()}') if __name__ == '__main__': asyncio.run(main())
代码说明
- 必须将
await walkCmd()放在async def定义的异步函数内,通过asyncio.run()启动异步程序(Python 3.7+支持) lexicographicMode=False:限制仅返回指定基础OID的直接子节点,不会递归遍历更深层级lookupMib=False:输出原始OID字符串,若需要显示MIB符号名(如ciscoSmartLicMIB::xxx)可移除该参数- 需替换代码中的社区字符串和设备IP为实际配置
遍历所有子OID(含深层节点)
如果需要遍历基础OID下的所有层级子节点,只需移除lexicographicMode=False参数即可。
内容的提问来源于stack exchange,提问作者Gary Giesen
相关产品推荐
相关产品推荐

