Python pysnmp将OID解析为mibname

Python pysnmp将OID解析为mibname,python,python-2.7,snmp,pysnmp,Python,Python 2.7,Snmp,Pysnmp,目前我已经设置了陷阱侦听器,它可以很好地侦听snmp通知。然而,它只返回数字oid,我希望能够将此oid解析为人类可读的名称。我已经看过了文档,但是我不是真的很好地理解它。我在这里使用示例脚本 我想知道如何将OID解析为MIB。我已经下载了cisco mib.my文件,并将它们粘贴在一个目录中,我向mibbuilder指出,我很喜欢这个目录 snmpEngine = SnmpEngine() mibBuilder = builder.MibBuilder() mibPath = mibBuild

目前我已经设置了陷阱侦听器,它可以很好地侦听snmp通知。然而,它只返回数字oid,我希望能够将此oid解析为人类可读的名称。我已经看过了文档,但是我不是真的很好地理解它。我在这里使用示例脚本

我想知道如何将OID解析为MIB。我已经下载了cisco mib.my文件,并将它们粘贴在一个目录中,我向mibbuilder指出,我很喜欢这个目录

snmpEngine = SnmpEngine()
mibBuilder = builder.MibBuilder()
mibPath = mibBuilder.getMibSources() + (builder.DirMibSource('/opt/mibs'),)
mibBuilder.setMibSources(*mibPath)
mibBuilder.loadModules('CISCO-CONFIG-MAN-MIB',)
mibViewController = view.MibViewController(mibBuilder)
在执行prettyPrint()语句的示例脚本中

for oid, val in varBinds:
    objectType = ObjectType(ObjectIdentity(oid.prettyPrint()))
    objectType.resolveWithMib(mibViewController)
    print str(objectType)

    print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))
在进行更改之后,我现在遇到了两个错误

回溯(最近一次呼叫最后一次): 文件“traplistener.py”,第200行,在 “CISCO-BRIDGE-EXT-MIB”, loadModules中的文件“/usr/local/lib/python2.7/site packages/pysnmp/smi/builder.py”,第344行 引发错误。MibNotFoundError(“%s”编译错误:“%s%”(modName,errs)) pysnmp.smi.error.MibNotFoundError:CISCO-CONFIG-MAN-MIB编译错误:丢失;MIB CISCO-CONFIG-MAN-MIB的symbolTable中没有模块“CISCO-SMI”;丢失的丢失的丢失的丢失的丢失的失踪


由于您使用的是低级API(而不是pysnmp.hlapi),因此我可以为您提供以下代码段,其中有效地包含了一个MIB解析器:

from pysnmp.smi import builder, view, compiler, rfc1902

# Assemble MIB viewer
mibBuilder = builder.MibBuilder()
compiler.addMibCompiler(mibBuilder, sources=['file:///usr/share/snmp/mibs',
                                             'http://mibs.snmplabs.com/asn1/@mib@'])

mibViewController = view.MibViewController(mibBuilder)

# Pre-load MIB modules we expect to work with
mibBuilder.loadModules('SNMPv2-MIB', 'SNMP-COMMUNITY-MIB')

# This is what we can get in TRAP PDU
varBinds = [
    ('1.3.6.1.2.1.1.3.0', 12345),
    ('1.3.6.1.6.3.1.1.4.1.0', '1.3.6.1.6.3.1.1.5.2'),
    ('1.3.6.1.6.3.18.1.3.0', '0.0.0.0'),
    ('1.3.6.1.6.3.18.1.4.0', ''),
    ('1.3.6.1.6.3.1.1.4.3.0', '1.3.6.1.4.1.20408.4.1.1.2'),
    ('1.3.6.1.2.1.1.1.0', 'my system')
]

# Run var-binds received in PDU (a sequence of OID-value pairs)
# through MIB viewer to turn them into MIB objects.
# You may want to catch and ignore MIB lookup errors here.
varBinds = [rfc1902.ObjectType(rfc1902.ObjectIdentity(x[0]), x[1]).resolveWithMib(mibViewController) for x in varBinds]

for varBind in varBinds:
    print(varBind.prettyPrint())

由于您使用的是低级API(而不是pysnmp.hlapi),因此我可以为您提供以下代码段,其中有效地包含了一个MIB解析器:

from pysnmp.smi import builder, view, compiler, rfc1902

# Assemble MIB viewer
mibBuilder = builder.MibBuilder()
compiler.addMibCompiler(mibBuilder, sources=['file:///usr/share/snmp/mibs',
                                             'http://mibs.snmplabs.com/asn1/@mib@'])

mibViewController = view.MibViewController(mibBuilder)

# Pre-load MIB modules we expect to work with
mibBuilder.loadModules('SNMPv2-MIB', 'SNMP-COMMUNITY-MIB')

# This is what we can get in TRAP PDU
varBinds = [
    ('1.3.6.1.2.1.1.3.0', 12345),
    ('1.3.6.1.6.3.1.1.4.1.0', '1.3.6.1.6.3.1.1.5.2'),
    ('1.3.6.1.6.3.18.1.3.0', '0.0.0.0'),
    ('1.3.6.1.6.3.18.1.4.0', ''),
    ('1.3.6.1.6.3.1.1.4.3.0', '1.3.6.1.4.1.20408.4.1.1.2'),
    ('1.3.6.1.2.1.1.1.0', 'my system')
]

# Run var-binds received in PDU (a sequence of OID-value pairs)
# through MIB viewer to turn them into MIB objects.
# You may want to catch and ignore MIB lookup errors here.
varBinds = [rfc1902.ObjectType(rfc1902.ObjectIdentity(x[0]), x[1]).resolveWithMib(mibViewController) for x in varBinds]

for varBind in varBinds:
    print(varBind.prettyPrint())

您好,如果我想从指定目录加载模块,该怎么办?在我的情况下,这是否意味着我将用本地目录替换您的源代码?当我在linux发行版上工作时,我会将其替换为“/opt/mibs”@IIya etingo如果我遇到另一个错误,我相信它正在尝试从其他mib编译依赖项?这是我的第一个猜测,您可以更改/添加系统保留MIB的任何本地路径。或者,如果需要,可以将URL保留为MIB源。是的,MIB倾向于相互导入,pysmi(MIB编译器包)将加载并编译它们。有没有办法告诉它不要编译依赖项?嗨,如果我想从指定目录加载模块,该怎么办?在我的情况下,这是否意味着我将用本地目录替换您的源代码?当我在linux发行版上工作时,我会将其替换为“/opt/mibs”@IIya etingo如果我遇到另一个错误,我相信它正在尝试从其他mib编译依赖项?这是我的第一个猜测,您可以更改/添加系统保留MIB的任何本地路径。或者,如果需要,可以将URL保留为MIB源。是的,MIB倾向于相互导入,pysmi(MIB编译器包)将加载并编译它们。有没有办法告诉它不要编译依赖项?