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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:35:12