如何解决pysnmp出现的「Bad IP address syntax」协议错误?
问题:pysnmp读取路由器SNMP信息报错,但snmpwalk可正常运行
问题描述
使用pysnmp读取路由器sysName时出现IP地址格式错误,但执行snmpwalk -v2c -c public 192.168.88.254 SNMPv2-MIB::sysName.0可正常返回结果。
测试代码
from pysnmp.hlapi import * router_ip = '192.168.88.254' community = 'public' errorIndication, errorStatus, errorIndex, varBinds = next( getCmd(SnmpEngine(), CommunityData(community), UdpTransportTarget((router_ip, 161)), ContextData(), ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0)), ) ) if errorIndication: print(errorIndication) elif errorStatus: print('%s at %s' % (errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) else: for varBind in varBinds: device_name = varBind[1].prettyPrint() print(device_name)
报错信息
python3 snmp.py Traceback (most recent call last): File "/home/lamzaks/.local/lib/python3.10/site-packages/pysnmp/smi/rfc1902.py", line 505, in resolveWithMib instIds = rowNode.getInstIdFromIndices(*self.__args[2:]) File "/home/lamzaks/.local/lib/python3.10/site-packages/pysnmp/smi/mibs/SNMPv2-SMI.py", line 1281, in getInstIdFromIndices syntax = mibObj.syntax.clone(indices[idx]) File "/home/lamzaks/.local/lib/python3.10/site-packages/pysnmp/proto/rfc1902.py", line 232, in clone return univ.OctetString.clone(self, *args, **kwargs).setFixedLength(self.getFixedLength()) File "/home/lamzaks/.local/lib/python3.10/site-packages/pyasn1/type/base.py", line 376, in clone return self.__class__(value, **initializers) File "/home/lamzaks/.local/lib/python3.10/site-packages/pyasn1/type/univ.py", line 837, in __init__ base.SimpleAsn1Type.__init__(self, value, **kwargs) File "/home/lamzaks/.local/lib/python3.10/site-packages/pyasn1/type/base.py", line 267, in __init__ value = self.prettyIn(value) File "/home/lamzaks/.local/lib/python3.10/site-packages/pysnmp/proto/rfc1902.py", line 330, in prettyIn raise error.ProtocolError('Bad IP address syntax') pysnmp.proto.error.ProtocolError: Bad IP address syntax During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/lamzaks/snmp.py", line 9, in <module> errorIndication, errorStatus, errorIndex, varBinds = next( File "/home/lamzaks/.local/lib/python3.10/site-packages/pysnmp/hlapi/asyncore/sync/cmdgen.py", line 108, in getCmd cmdgen.getCmd(snmpEngine, authData, transportTarget, File "/home/lamzaks/.local/lib/python3.10/site-packages/pysnmp/hlapi/asyncore/cmdgen.py", line 130, in getCmd vbProcessor.makeVarBinds(snmpEngine, varBinds), __cbFun, File "/home/lamzaks/.local/lib/python3.10/site-packages/pysnmp/hlapi/varbinds.py", line 39, in makeVarBinds __varBinds.append(varBind.resolveWithMib(mibViewController, ignoreErrors=False)) File "/home/lamzaks/.local/lib/python3.10/site-packages/pysnmp/smi/rfc1902.py", line 853, in resolveWithMib self.__args[0].resolveWithMib(mibViewController) File "/home/lamzaks/.local/lib/python3.10/site-packages/pysnmp/smi/rfc1902.py", line 509, in resolveWithMib raise SmiError('Instance index %r to OID conversion failure at object %r: %s' % ( pysnmp.smi.error.SmiError: Instance index (0,) to OID conversion failure at object 'ipAdEntAddr': Bad IP address syntaxcaused by <class 'pysnmp.proto.error.ProtocolError'>: Bad IP address syntax
错误原因
pysnmp本地MIB库加载异常或存在冲突,导致解析SNMPv2-MIB::sysName.0时,错误将索引0关联到IP-MIB::ipAdEntAddr(该对象要求索引为合法IP地址),触发IP格式校验失败。而snmpwalk使用独立的MIB解析逻辑,不受此影响。
解决方法
方案1:直接使用OID数值
绕开MIB名称解析,直接指定sysName的数值OID:
from pysnmp.hlapi import * router_ip = '192.168.88.254' community = 'public' errorIndication, errorStatus, errorIndex, varBinds = next( getCmd(SnmpEngine(), CommunityData(community), UdpTransportTarget((router_ip, 161)), ContextData(), # 使用数值OID替代MIB名称 ObjectType(ObjectIdentity('.1.3.6.1.2.1.1.5.0')), ) ) if errorIndication: print(errorIndication) elif errorStatus: print('%s at %s' % (errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) else: for varBind in varBinds: device_name = varBind[1].prettyPrint() print(device_name)
方案2:忽略MIB解析错误
在创建ObjectIdentity时强制忽略解析错误:
# 修改原代码中的ObjectType行 ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0).resolveWithMib(ignoreErrors=True)),
方案3:重置MIB库
清理本地缓存并重新安装pysnmp相关包:
# 卸载现有包 pip uninstall -y pysnmp pysmi # 重新安装最新版本 pip install pysnmp pysmi # 可选:删除本地MIB缓存 rm -rf ~/.pysnmp/mibs
内容的提问来源于stack exchange,提问作者Andrejs Snorins
相关产品推荐
相关产品推荐

