繁体   English   中英

python snmp 坏 IP

[英]python snmp bad IP

我有问题 pysnmp 库。 我试图从我的路由器 SNMP 中读取信息。 snmpwal 工作没有问题......

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

有没有人有类似的情况?

我正在尝试从 SNMP 设备获取信息.. 如果我使用 SNMPwalk -v2c -c public 它可以工作

根本原因

背后的原因可能是您正在测试的 SNMP 代理中存在错误,

https://github.com/lextudio/pysnmp/blob/v5.0.20/pysnmp/proto/rfc1902.py#L322

您可以从其源代码中看到,当它尝试解析来自 SNMP 代理的传入数据时,它只是希望所有 IP 数据仅为 IPv4。 然而,这个代理似乎返回了意外的字节。

提示进一步挖掘

错误消息中没有显示意外字节,所以如果你想深入挖掘,你需要使用 Wireshark 等工具捕获网络数据包。 然后您可以轻松地分析 Wireshark GUI 中的字节。

或者snmpwalk有一个转储原始字节的开关。 但是您需要成为 SNMP 专家才能以原始格式读取这些字节。

那里有很多非标准的 SNMP 代理,因此此类问题很常见。 如果这个代理试图返回 IPv6 地址,它应该使用Ipv6Address文本约定,而不是IP数据类型, https://datatracker.ietf.org/doc/html/rfc2465

为什么snmpwalk有效?

在这种情况下,其他流行的 SNMP 库可能更能容忍。 例如, snmpwalk命令行实用程序基于 C 中编写的 .NET-SNMP 库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM