关于python中访问mib信息库的信息
更新时间:2023-11-24什么是MIB信息库?
管理信息基础架构(MIB)是一种用于网络设备的标准格式,用于描述设备的管理信息。MIB数据通常以树形结构呈现,由对象标识符(OIDs)唯一标识MIB信息库中的每个值。在Python中,通过使用模块pysnmp可以方便地访问MIB信息库并检索所需的数据。
import pysnmp.hlapi as snmp
#设置SNMP连接
errorIndication, errorStatus, errorIndex, varBinds = next(
snmp.getCmd(snmp.SnmpEngine(),
snmp.CommunityData('public'),
snmp.UdpTransportTarget(('demo.snmplabs.com', 161)),
snmp.ContextData(),
snmp.ObjectType(snmp.ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
)
#检查是否发生错误
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (
errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1] or '?'
))
#打印结果
else:
for varBind in varBinds:
print(varBind)
如何编写MIB信息库检索的Python程序?
首先,我们需要按如下方式导入pysnmp库。
import pysnmp.hlapi as snmp
使用SNMPv2c协议需要提供SNMP社区名称。示例中,我们使用community名称:“public”从demo.snmplabs.com上检索系统描述。我们可以使用以下代码来连接SNMP设备并获取系统描述符。
errorIndication, errorStatus, errorIndex, varBinds = next(
snmp.getCmd(snmp.SnmpEngine(),
snmp.CommunityData('public'),
snmp.UdpTransportTarget(('demo.snmplabs.com', 161)),
snmp.ContextData(),
snmp.ObjectType(snmp.ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
)
第2-7行代码设置SNMP连接,其中:
-第3行设置使用IP地址“demo.snmplabs.com”和端口161的UDP通信。
-第4行设置SNMPv2c社区名称。
-第5行设置SNMP上下文数据。
-第6行创建用于检索sysDescr OID的ObjectType。
-第7行使用getCmd函数从设备检索OID,并返回错误代码,错误状态,错误索引和变量绑定。
然后,我们需要检查是否发生错误,以及打印结果。示例代码如下。
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (
errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1] or '?'
))
else:
for varBind in varBinds:
print(varBind)
如何在Python中映射OID和对象名称?
您可以使用pysnmp.smi中的MIB查询功能获取MIB数据库,并将OID映射到名称(以及反向)。
from pysnmp.smi import builder, view, error
import os
#创建MIB构造器
mibBuilder = builder.MibBuilder()
#添加路径
mibPath = os.path.join(os.path.dirname(__file__), 'mibs')
mibBuilder.addMibSources(builder.DirMibSource(mibPath))
#创建MIB检索器
mibViewController = view.MibViewController(mibBuilder)
#获取OID
oid = '1.3.6.1.2.1.1.3.0'
mibNode, = mibBuilder.importSymbols('SNMPv2-MIB', 'sysUpTime')
oid = mibViewController.getNodeName((mibNode,))[0]
#获取OID和名称映射
oid, label, suffix = mibViewController.getNodeName(mibViewController.getMibTree(), oid)
在第6-7行中,我们使用builder添加MIB文件路径,并在第9-10行创建MIB检索器。在第13-15行中,我们将OID映射到mibNode,然后在第18行中使用MibViewController来获取OID的名称。
如何将MIB文件的信息存储在Python程序中?
您可以使用MIB文件中的信息在Python中创建一个包含MIB数据库对象的变量。
from pysnmp.hlapi import *
mibBuilder = builder.MibBuilder()
mibPath = './mibs'
mibSources = builder.DirMibSource(mibPath)
mibBuilder.addMibSources(mibSources)
mibBuilder.loadModules('SNMPv2-MIB')
mibView = view.MibViewController(mibBuilder)
mibView.snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder = \
mibBuilder
lcd = lookupConfigDir()
snmpEngine = SnmpEngine()
varBinds = nextCmd(snmpEngine, CommunityData('public'),
UdpTransportTarget(('demo.snmplabs.com', 161)),
ContextData(), *mibView.getCmd(
SnmpEngine(),
CommunityData('public'),
UdpTransportTarget(('demo.snmplabs.com', 161)),
ContextData(),
ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysORLastChange'))))
在第4-6行中,我们使用builder添加MIB文件路径,并在第8-9行创建MIB检索器。我们将加载'SNMPv2-MIB'模块,并在第12行将mibBuilder设置为MibInstrumController。第15-23行我们在创建SNMP引擎,并在第26行使用getCmd获取OIDs。