当我在 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
请您参考如下方法:
尝试打印:
print '%s::%s.%s = %s' % (
modName, symName,
'.'.join(map(lambda v: v.prettyPrint(), indices),
val.prettyPrint()
)
代替
print varBindTableRow
还要确保加载适当的 MIB。
