使用pysnmp snmpbulkwalking时超时

时间:2016-05-02 19:41:28

标签: python snmp pysnmp

这是我的snmpbulkwalk实现(从示例中获取):

def bulk_walk(self, oid, context, conv):
walkdone = False
data = list()

if context:
    community = "%s@%s" % (self.community, context)
else:
    community = self.community

for errorIndication, \
    errorStatus, errorIndex, \
    varBinds in bulkCmd(SnmpEngine(),
                        CommunityData(community),
                        UdpTransportTarget((self.ip, self.port)),
                        ContextData(), 0, 10,
                        ObjectType(ObjectIdentity(oid)), lookupMib=False):

    if errorIndication:
        raise(SNMPError(errorIndication))
    elif errorStatus:
        raise(SNMPError('%s at %s' % (
                errorStatus.prettyPrint(),
                errorIndex and varBinds[int(errorIndex)-1][0] or '?'
             ))
        )
    else:
        for varBind in varBinds:
            print(varBind[0].prettyPrint(),  conv(varBind[1]))
            if not varBind[0].prettyPrint().startswith(oid+"."):
                walkdone = True
                break
            data.append( (varBind[0].prettyPrint(),  conv(varBind[1])) )
    if walkdone:
        break
return(data)

我正在尝试snmpwalk不存在的OID,当我尝试用snmpbulkwalk做这件事时我得到了:

$ snmpwalk -v2c -c public @ 1 10.253.35.61 1.3.6.1.2.1.17.4.3.1.1

SNMPv2-SMI::mib-2.17.4.3.1.1 = No Such Instance currently exists at this OID

如果我们看一下tcpdump,我们可以看到:

11:26:00.460905 IP host.52491 > 10.253.35.61.snmp:  C=public@1 GetBulk(30)  N=0 M=10 17.4.3.1.1
11:26:01.462162 IP host.52491 > 10.253.35.61.snmp:  C=public@1 GetBulk(30)  N=0 M=10 17.4.3.1.1
11:26:01.658323 IP 10.253.35.61.snmp > host.52491:  C=public@1 GetResponse(215)  17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500
11:26:01.658561 IP host.52491 > 10.253.35.61.snmp:  C=public@1 GetRequest(30)  17.4.3.1.1
11:26:01.659643 IP 10.253.35.61.snmp > host.52491:  C=public@1 GetResponse(215)  17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500
11:26:01.660698 IP 10.253.35.61.snmp > host.52491:  C=public@1 GetResponse(30)  17.4.3.1.1=[noSuchInstance]

这是好的,我可以看到错误并解决它,但是当我从pysnmp查询它时 - 得到"在超时之前没有收到SNMP响应"错误,这里是tcpdump:

11:26:58.497144 IP host.54615 > 10.253.35.61.snmp:  C=public@1 GetBulk(29)  N=0 M=25 17.4.3.1.1
11:26:59.499136 IP host.54615 > 10.253.35.61.snmp:  C=public@1 GetBulk(29)  N=0 M=25 17.4.3.1.1
11:27:00.480834 IP 10.253.35.61.snmp > host.54615:  C=public@1 GetResponse(542)  17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500 17.4.4.1.2.4136=1500 17.4.4.1.2.4137=1500 17.4.4.1.3.1414=14191348 17.4.4.1.3.4103=371017501 17.4.4.1.3.4104=43993868 17.4.4.1.3.4115=379731251 17.4.4.1.3.4136=2614818874 17.4.4.1.3.4137=3830362616 17.4.4.1.4.1414=390518443 17.4.4.1.4.4103=547088805 17.4.4.1.4.4104=270695068 17.4.4.1.4.4115=2723143051 17.4.4.1.4.4136=2811735791 17.4.4.1.4.4137=102796762 17.4.4.1.5.1414=0
11:27:00.503200 IP host.54615 > 10.253.35.61.snmp:  C=public@1 GetBulk(29)  N=0 M=25 17.4.3.1.1
11:27:01.505277 IP host.54615 > 10.253.35.61.snmp:  C=public@1 GetBulk(29)  N=0 M=25 17.4.3.1.1
11:27:02.469848 IP 10.253.35.61.snmp > host.54615:  C=public@1 GetResponse(542)  17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500 17.4.4.1.2.4136=1500 17.4.4.1.2.4137=1500 17.4.4.1.3.1414=14191348 17.4.4.1.3.4103=371017846 17.4.4.1.3.4104=43994108 17.4.4.1.3.4115=380963114 17.4.4.1.3.4136=2616771624 17.4.4.1.3.4137=3830710704 17.4.4.1.4.1414=390519877 17.4.4.1.4.4103=547090599 17.4.4.1.4.4104=270696594 17.4.4.1.4.4115=2724485940 17.4.4.1.4.4136=2813399966 17.4.4.1.4.4137=102954755 17.4.4.1.5.1414=0
11:27:02.987802 IP host.54615 > 10.253.35.61.snmp:  C=public@1 GetBulk(29)  N=0 M=25 17.4.3.1.1
11:27:03.989765 IP host.54615 > 10.253.35.61.snmp:  C=public@1 GetBulk(29)  N=0 M=25 17.4.3.1.1

这很糟糕,因为可能会有不同的场景导致超时(主机关闭,错误的社区字符串等),如何使用pysnmp模拟snmpbulkwalk行为,可能无需使用更低级别的API。

谢谢。

1 个答案:

答案 0 :(得分:0)

第二次捕获显示缺少GetResponse数据包。假设由于代理程序缓慢而导致超时,请考虑使pysnmp等待更长时间并可能重试更少:

...
UdpTransportTarget(('demo.snmplabs.com', 161), timeout=8.0, retries=0),
...

如果是连接问题,请尝试更积极地重试:

...
UdpTransportTarget(('demo.snmplabs.com', 161), timeout=1.0, retries=5),
...

另请注意,在pysnmp捕获中(但不在代码中),您需要响应25个变量,而snmpbulkwalk只需要10个变量。太多的变量可能会给您的代理带来压力。