pysnmp如何使用snmpwalk获取网络设备的所有oid

时间:2015-05-10 09:58:28

标签: python snmp pysnmp

我想知道如何在pysnmp中获取某个网络设备的所有oid 这是我的代码:

        errorIndication, errorStatus, errorIndex, varBind = cmdGen.nextCmd(
                    cmdgen.CommunityData('public'),
                    cmdgen.UdpTransportTarget((ip, 161)),
                    cmdgen.MibVariable('IF-MIB', '').loadMibs(), #get all oids
                    lexicographicMode=True, maxRows=10000,
                    ignoreNonIncreasingOid=True
                )

        for varBindTableRow in varBind:
            for name, val in varBindTableRow:
                print name, val
        print(len(varBind)) #prints number of oids

问题是我从未获得设备的所有oid(实际上甚至没有关闭) 使用这个代码我通常会得到90左右但是当我使用snmpWalk.exe(从互联网上下载)时,我每次通常会得到700个。
我试过用很多方法重写我的代码,但没有任何作用 有人可以告诉我如何使用pysnmp获取网络设备的所有oid?

1 个答案:

答案 0 :(得分:0)

您的代码应该从IF-MIB的第一个OID开始,最多可以获得10000个OID。尝试从第一个OID开始走你的代理,并确保在行走方式上没有间歇性错误。

另外,请记住,您的pysnmp代码使用SNMP v2c。我不确定您使用snmpwalk.exe的SNMP版本。尽管不太可能,但理论上您的SNMP代理可能会对SNMP v1和v2c查询做出不同的响应。我认为两种情况下SNMP社区是相同的。

如果没有任何帮助,请尝试启用pysnmp调试以查看请求了哪些OID,返回了哪些OID以及pysnmp是否以及为何过早停止:

    from pysnmp import debug

    debug.setLogger(debug.Debug('msgproc', 'dsp', 'io', 'app'))

    errorIndication, errorStatus, errorIndex, varBind = cmdGen.nextCmd(
                cmdgen.CommunityData('public'),
                cmdgen.UdpTransportTarget((ip, 161)),
                '1.3.6',
                lexicographicMode=True,
                ignoreNonIncreasingOid=True
            )

    # make sure there's no timeout or other errors occurring at some point
    if errorIndication:
        print('WARNING: %s' % errorIndication)

    for varBindTableRow in varBind:
        for name, val in varBindTableRow:
            print(name, val)

    print(len(varBind)) #prints number of oids