首页 > 解决方案 > 如何在 pysnmp 中为 sysObjectID 获取正确的 MIB

问题描述

当我将所有必要的 MIB 文件编译并加载到 pysnmp 时,sysObjectID 应该返回一个完全解析的 MIB。但它没有

到目前为止我所做的是,我创建了一个 mib_builder 并将预编译的 mib 源添加到构建器,通过提供 MibInstrumController 的 MsgAndPduDispatcher 从 hlapi 将 mib 构建器传递给 SnmpEngine。然后请求 sysObjectID。

考虑以下代码块:

from pysnmp.smi import builder, view, compiler, error, instrum
from pysnmp.proto.rfc3412 import MsgAndPduDispatcher
from pysnmp.hlapi import *

mib_builder = builder.MibBuilder()
mib_builder.addMibSources(builder.DirMibSource('/path/to/compiled/mibs/'))
engine = SnmpEngine(msgAndPduDsp=MsgAndPduDispatcher(mibInstrumController=instrum.MibInstrumController(mib_builder)))

oid = ObjectIdentity("SNMPv2-MIB", "sysObjectID")
for (errorIndication,
     errorStatus,
     errorIndex,
     varBinds) in nextCmd(
        self.engine,
        CommunityData('public', mpModel=1),
        UdpTransportTarget(('192.168.0.222', 161)),
        ContextData(),
        ObjectType(oid),
        lexicographicMode=False
):

    if errorIndication:
        print(errorIndication)
        break
    elif errorStatus:
        print('%s at %s' % (errorStatus.prettyPrint(),errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
        break
    else:
        for varBind in varBinds:
            print(varBind)

它应该为 sysObjectID 返回正确的 MIB。但它回来了,

SNMPv2-MIB::sysObjectID.0 = SNMPv2-SMI::enterprises.9.1.1047

然后我尝试了,

for varBind in varBinds:
   print(varBind)
   if type(varBind[1]) == type(oid):
       _oid, label, suffix = view.MibViewController(mib_builder).getNodeName(varBind[1].getOid())
       print(_oid, label, suffix)

返回

SNMPv2-MIB::sysObjectID.0 = SNMPv2-SMI::enterprises.9.1.1047
1.3.6.1.4.1 ('iso', 'org', 'dod', 'internet', 'private', 'enterprises') 9.1.1047

正确的 MIB 位于 CISCO-PRODUCTS-MIB 中,我已对其进行编译。

那么,我该怎么做才能为 sysObjectID 获得正确的 MIB?

标签: pythonsnmppysnmp

解决方案


TL;博士; - 尝试将.loadMibs('CISCO-PRODUCTS-MIB')添加到您的ObjectIdentity对象。

您可能需要它的原因是 pysnmp 不会自动将 OID 映射到 MIB。因此,当 pysnmp 获得要翻译的 OID 时,它只会尝试使用它已经加载的 MIB。

顺便说一句,你不需要那么多代码来实现你想要的。只需一个基线SNMP get/walk(加上.loadMibs()您预期使用的 MIB)就足够了。


推荐阅读