【问题标题】:How to lookup mib-table in pysnmp?如何在 pysnmp 中查找 mib 表?
【发布时间】:2012-04-05 05:55:39
【问题描述】:

当我在 OID (1.3.6.1.4.1.2021.4) 上使用 snmpwalk 时,我得到以下结果:

UCD-SNMP-MIB::memIndex.0 = INTEGER: 0

UCD-SNMP-MIB::memErrorName.0 = STRING: swap

UCD-SNMP-MIB::memMinimumSwap.0 = INTEGER: 16000 kB

但是,当我使用 pysnmp 模块查询相同的 OID 时,我得到的结果如下:

(ObjectName(1.3.6.1.4.1.2021.4.1.0), Integer(0))

(ObjectName(1.3.6.1.4.1.2021.4.2.0), OctetString('swap'))

(ObjectName(1.3.6.1.4.1.2021.4.12.0), Integer(16000))

我已将 pysnmp_mibs 放在 os.environ 中,我正在使用的代码是:

from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.smi import builder, view, error

errorIndication, errorStatus, errorIndex, \
             varBindTable = cmdGen.nextCmd (
cmdgen.CommunityData('test-agent', 'public'),
cmdgen.UdpTransportTarget ( (localhost, 161) ),
('1.3.6.1.4.1.2021.4')
)

if errorIndication:
    log.warn(errorIndication)
    return
else:
    if errorStatus:
        log.warn( '%s at %s\n' % (
            errorStatus.prettyPrint (),
            errorIndex and varBindTable[-1][int (errorIndex) - 1] or '?'
            ))
        return
    else:
        for varBindTableRow in varBindTable:
            for oid, val in varBindTableRow:
                    (symName, modName), indices = cmdgen.mibvar.oidToMibName(
                        cmdGen.mibViewController, oid
                        )
                    val = cmdgen.mibvar.cloneFromMibValue(
                                  cmdGen.mibViewController, modName, symName, val
                          )
            print varBindTableRow

我的问题是为什么 snmpwalk 和 pysnmp 结果不同,我应该怎么做才能使用 pysnmp 模块获得与 snmpwalk 相同的结果?


已编辑

我尝试了代码,但在查询 1.3.6.1.2.1.4.22.1 我收到以下错误

NoSuchObjectError: NoSuchObjectError({'str': 'No MIB info for    (1, 3, 6, 1, 4, 1, 2021, 4, 1, 0) (closest parent (1, 3, 6, 1, 4, 1))'})

我已将 IP-MIB 模块加载为:

mibBuilder = builder.MibBuilder() 
mibPath = mibBuilder.getMibSources()+(builder.DirMibSource(path_to_mib_dir),)
mibBuilder.setMibSources(*mibPath)
mibBuilder.loadModules('IP-MIB')
mibView = view.MibViewController(mibBuilder)

我很困惑的是如何在

中使用这个mibView
(symName,modName),indices=cmdgen.mibvar.oidToMibName(cmdGen.mibViewController, oid)
val=cmdgen.mibvar.cloneFromMibValue(cmdGen.mibViewController,modName, symName, val)

是否应该将 cmdGen.mibViewController 替换为 mibView

但它适用于 OID 1.3.6.1.2.1.1.3: 我得到了预期的结果:

SNMPv2-MIB::sysUpTime.0 = 27

【问题讨论】:

  • 您似乎将 IP-MIB 加载到 MIB 树的 另一个 实例中,与您用于 OID 解析的不同。如果您使用 mibBuilder = cmdGen.mibViewController.mibBuilder,您的 IP-MIB 加载代码可能会起作用
  • 您也可以参考UCD-SNMP-MIB中定义的1.3.6.1.4.1.2021.4.1.0。由于 pysnmp-mibs [尚未] 包含该 MIB,因此您必须使用 pysnmp/tools/build-pysnmp-mib 脚本将其编译为 python 模块。加载后,您的 OID 分辨率可能会起作用。
  • 谢谢。 mibBuilder = cmdGen.mibViewController.mibBuilder 工作。但是我在尝试使用 pysnmp/tools/build-pysnmp-mib 脚本编译 UCD-SNMP-MIB 时遇到:./build-pysnmp-mib ~/Desktop/src/UCD-SNMP-MIB.mib Empty input smidump -k -f python /Users/furion/Desktop/src/UCD-SNMP-MIB.mib | ./libsmi2pysnmp fails make sure you are using libsmi version > 0.4.5 (or svn) 错误。

标签: python snmp mib pysnmp


【解决方案1】:

尝试打印:

print '%s::%s.%s = %s' % (
                    modName, symName,
                    '.'.join(map(lambda v: v.prettyPrint(), indices),
                    val.prettyPrint()
                    )

而不是

print varBindTableRow

还要确保加载适当的 MIB。

【讨论】:

  • 我也试过上面的代码,但我得到了错误。请看我的问题,我已经编辑了它,其中包含它的详细信息。
【解决方案2】:

对不起,结果是一样的!

如果您的问题大约是 16000 与 16000 KB,您必须知道 SNMP 不会返回该单位。 SNMP V2 MIB 只允许一个地方提供有关它的信息,因此 SNMPWALK(作为客户端)正在使用它,而不是 pysnmp。

【讨论】:

  • 通过相同的结果,我的意思是如何使我的 pysnmp 显示结果为 UCD-SNMP-MIB::memIndex.0 = INTEGER: 0,而不是 (ObjectName(1.3.6.1.4.1.2021.4 .1.0), Integer(0)) 是的,它们是相同的结果,但前一个更具可读性,我只是想让输出可读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多