python – PySNMP无法识别响应

我使用以下简单脚本:

from pysnmp.entity.rfc3413.oneliner import cmdgen

errorIndication,errorStatus,errorIndex,\
varBindTable = cmdgen.CommandGenerator().bulkCmd(
            cmdgen.CommunityData('test-agent','public'),cmdgen.UdpTransportTarget(('IP.IP.IP.IP',161)),1,(1,3,6,2,4,24,169,254)
        )

if errorIndication:
   print errorIndication
else:
    if errorStatus:
        print '%s at %s\n' % (
            errorStatus.prettyPrint(),errorIndex and varBindTable[-1][int(errorIndex)-1] or '?'
            )
    else:
        for varBindTableRow in varBindTable:
            for name,val in varBindTableRow:
                print '%s = %s' % (name.prettyPrint(),val.prettyPrint())

从命令行使用snmpwalk到此设备返回预期结果.但
脚本返回超时前未收到SNMP响应.如果我省略这个OID,那么一切正常.
所以问题在于这个OID

这里tcpdump统计

/usr/sbin/tcpdump -nn -vv -s0 -A host HOST and udp

tcpdump: listening on eth0,link-type EN10MB (Ethernet),capture size 65535 bytes

12:15:31.494920 IP (tos 0x0,ttl  64,id 0,offset 0,flags [DF],proto: UDP (17),length: 77) IP.IP.IP.IP.47911 > IP.IP.IP.IP.161: [bad udp cksum 4b7d!]  { SNMPv2c { GetBulk(34) R=8993731  N=0 M=1 .1.3.6.1.2.1.4.24.4.1.2.169.254 } }
E..M..@.@.I..]<..]

我们可以看到,设备返回响应.1.3.6.1.2.1.4.24.4.1.2.169.254.0.0.0.0.255.255.0.0.0.0.0 = [inetaddr len!= 4] 0.0.255.255.0.0.0.0,但没有发生了,pysnmp继续一次又一次地尝试这个OID的值.. snmpwalk将此响应识别为IP ADDRESS 0.0.255.255

你们能帮助我吗?提前谢谢,对不起我的英语.

最佳答案
您的SNMP代理似乎会生成损坏的SNMP消息.虽然IPv4地址长度为四个八位字节,但您的代理程序报告的值为八个八位字节.

根据SNMP RFC,pysnmp会丢弃格式错误的SNMP消息,并重试原始请求几次,以获得正确的响应.

要使pysnmp使用特定格式错误的IP地址值,您可以在运行时修补其IpAddress类,使其仅占用可能更长的初始化程序中的四个前导八位字节:

>>> def ipAddressPrettyIn(self,value):
...   return origIpAddressPrettyIn(self,value[:4])
...
>>> origIpAddressPrettyIn = v2c.IpAddress.prettyIn
>>> v2c.IpAddress.prettyIn = ipAddressPrettyIn
>>>
>>> msg,rest = decoder.decode(wholeMsg,asn1Spec=v2c.Message())
>>> print msg.prettyPrint()
Message:
version='version-2'
 community=public
 data=PDUs:
 response=ResponsePDU:
  request-id=6564368
  error-status='noError'
  error-index=0
  variable-bindings=VarBindList:
   VarBind:
    name=1.3.6.1.2.1.4.24.4.1.2.169.254.0.0.0.0.255.255.0.0.0.0.0
    =_BindValue:
     value=ObjectSyntax:
       application-wide=ApplicationSyntax:
       ipAddress-value=0.0.255.255

相关文章

在这篇文章中,我们深入学习了XPath作为一种常见的网络爬虫技巧。XPath是一种用于定位和选择XML文档中特...
祝福大家龙年快乐!愿你们的生活像龙一样充满力量和勇气,愿你们在新的一年里,追逐梦想,勇往直前,不...
今天在爬虫实战中,除了正常爬取网页数据外,我们还添加了一个下载功能,主要任务是爬取小说并将其下载...
完美收官,本文是爬虫实战的最后一章了,所以尽管本文着重呈现爬虫实战,但其中有一大部分内容专注于数...
JSON是一种流行的数据传输格式,Python中有多种处理JSON的方式。官方的json库是最常用的,它提供了简单...
独立样本T检验适用于比较两组独立样本的均值差异,而配对T检验则适用于比较同一组样本在不同条件下的均...