PySNMP 4.4与Python 2.7 bulkCmd输出不包括子OID' s

时间:2017-11-12 00:46:16

标签: python networking pysnmp

首先,我是Python和PySNMP的新手。我试图将一个网络设备列表传递给bulkCmd,以获取所有物理接口的信息。

目前它只收集第一个接口,然后转到列表中的下一个网络设备。我已经使用lexicographic和maxCalls进行了更改,重复但没有任何区别。

在将单个bulkCmd发送到单个网络设备时,我已成功轮询所有接口。

代码:

from pysnmp.hlapi import *

routers = ["router1", "router2"]

#adds routers to getCmd and bulkCmd
def snmpquery (hostip):

    errorIndication, errorStatus, errorIndex, varBinds = next (
        bulkCmd(SnmpEngine(),
            CommunityData('communitystring'),
            UdpTransportTarget((hostip, 161)),
            ContextData(),
            0, 50,  
            ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')),
            ObjectType(ObjectIdentity('IF-MIB', 'ifAlias')),
            ObjectType(ObjectIdentity('IF-MIB', 'ifOperStatus')),
            lexicographicMode=True
        )
    )

    # Check for errors and print out results
    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:
            print(' = '.join([x.prettyPrint() for x in varBind]))


# calls snmpquery for all routers in list
for router in routers:
    snmpquery(router)

输出:

IF-MIB::ifDescr.1 = GigabitEthernet0/0
IF-MIB::ifAlias.1 = InterfaceDesc
IF-MIB::ifOperStatus.1 = 'up'
IF-MIB::ifDescr.1 = GigabitEthernet0/0
IF-MIB::ifAlias.1 = InterfaceDesc
IF-MIB::ifOperStatus.1 = 'up'

2 个答案:

答案 0 :(得分:0)

bulkSNMP返回一个迭代器,你在它上面使用next(),它只检索第一次迭代。你可能从PySNMP documentation得到了这个想法,它没有很好地展示如何检索所有结果。

您应该使用for循环遍历所有迭代,如下所示:

from pysnmp.hlapi import *
routers = ["router1", "router2"]

def snmpquery (hostip):
    snmp_iter = bulkCmd(SnmpEngine(),
                        CommunityData('communitystring'),
                        UdpTransportTarget((hostip, 161)),
                        ContextData(),
                        0, 50,  
                        ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')),
                        ObjectType(ObjectIdentity('IF-MIB', 'ifAlias')),
                        ObjectType(ObjectIdentity('IF-MIB', 'ifOperStatus')),
                        lexicographicMode=True)
    for errorIndication, errorStatus, errorIndex, varBinds in snmp_iter:
        # Check for errors and print out results
        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:
                print(' = '.join([x.prettyPrint() for x in varBind]))

# calls snmpquery for all routers in list
for router in routers:
    snmpquery(router)

另外,在发布与Python相关的问题时要小心缩进,因为它很重要。

答案 1 :(得分:0)

您需要迭代bulkCmd函数生成的生成器,重复SNMP查询以提取不适合以前响应数据包的SNMP管理对象。只需抛弃next()来电,然后for循环bulkCmd()

附注1:如果要获取位于MIB表列下的托管对象(例如lexicographicMode=True等),则可能不需要IF-MIB::ifDescr

附注2:如果您的网络上有许多SNMP代理,您可以考虑通过与in parallel交谈来加快数据检索过程。您使用相同的getBulk()调用,它只是执行并行性的底层网络I / O.