Skip to main content
 首页 » 编程设计

python之如何在 pysnmp 中查找 mib 表

2025年05月04日11mate10pro

当我在 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。