如何在pysnmp中为sysObjectID获取正确的MIB

2024-07-04 17:12:11 发布

您现在位置:Python中文网/ 问答频道 /正文

当我将所有必需的MIB文件编译并加载到pysnmp时,sysObjectID应该返回一个完全解析的MIB。但事实并非如此

到目前为止,我所做的是,我创建了一个mib构建器,并将预编译的mib源添加到构建器中,通过MsgAndPduDispatcher提供MibInstrumController,将mib构建器从hlapi传递给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呢?你知道吗


Tags: fromimportforbuildermiboidprintpysnmp
1条回答
网友
1楼 · 发布于 2024-07-04 17:12:11

TL;DR;-尝试将.loadMibs('CISCO-PRODUCTS-MIB')添加到ObjectIdentity对象。你知道吗

您可能需要这样做的原因是pysnmp不会自动将oid映射到mib。因此,当pysnmp得到一个OID进行翻译时,它只会对已经加载的mib进行转换。你知道吗

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

相关问题 更多 >

    热门问题