c语言编程笔录

首页 >   > 笔记大全

笔记大全

关于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。