如何使用PySnmp在Python中获取OID的值

时间:2018-03-06 18:31:23

标签: python python-3.x snmp pysnmp

使用snmpwalk我可以从我的设备上获取此信息:

OID=.1.3.6.1.4.1.5296.1.9.1.1.1.7.115.101.99.99.97.57.27.1.41
Type=OctetString
Value=secca99

我在Python中尝试了这个程序来从OID上面获取值字段:

#!/usr/bin/env python3

from pysnmp.hlapi import *
import sys

def walk(host, oid):

    for (errorIndication,
         errorStatus,
         errorIndex,
         varBinds) in nextCmd(SnmpEngine(),
                              CommunityData('public'),
                              UdpTransportTarget((host, 161)),
                              ContextData(),
                              ObjectType(ObjectIdentity(oid))):

        if errorIndication:
            print(errorIndication, file=sys.stderr)
            break

        elif errorStatus:
            print('%s at %s' % (errorStatus.prettyPrint(),
                                errorIndex and varBinds[int(errorIndex) - 1][0] or '?'), file=sys.stderr)
            break

        else:
            for varBind in varBinds:
                print(varBind)


walk('10.78.163.39',
     '.1.3.6.1.4.1.5296.1.9.1.1.1.7.115.101.99.99.97.57.27.1.41')

输出我得到:

当我运行程序时,它会显示一个很长的OID列表(不知道为什么即使我将叶级别OID作为程序中的输入)也带有值。奇怪。

尝试的内容

lexicographicMode=True中的

nextCmd,但它没有显示任何内容。

我希望

我想在我的程序中给出一个OID列表并想要它们的值(值是你可以在第一行看到的一个键),就是这样。

请求

请使用pysnmp帮助我在python程序中执行此操作。

1 个答案:

答案 0 :(得分:1)

如果您需要OID,请使用mibLookup=False参数。如果您只想要MIB的分支,请使用lexicographicMode=False,但请确保指定非叶OID,因为在这种情况下您将得不到任何回报。

以下是包含建议更改的脚本:

from pysnmp.hlapi import *
import sys

def walk(host, oid):

    for (errorIndication,
         errorStatus,
         errorIndex,
         varBinds) in nextCmd(SnmpEngine(),
                              CommunityData('public'),
                              UdpTransportTarget((host, 161)),
                              ContextData(),
                              ObjectType(ObjectIdentity(oid)),
                              lookupMib=False,
                              lexicographicMode=False):

        if errorIndication:
            print(errorIndication, file=sys.stderr)
            break

        elif errorStatus:
            print('%s at %s' % (errorStatus.prettyPrint(),
                                errorIndex and varBinds[int(errorIndex) - 1][0] or '?'), file=sys.stderr)
            break

        else:
            for varBind in varBinds:
                 print('%s = %s' % varBind)

walk('demo.snmplabs.com', '1.3.6.1.2.1.1.9.1.2')

你应该能够剪切和粘贴它,它正在demo.snmplabs.com的公共SNMP模拟器上运行。