如何在Python的SNMP Walk中输出变量名而非数值OID?
实现SNMP Walk输出变量名称而非数值OID
当然可以实现,只要在pysnmp中加载你的MIB文件,就能将数值OID解析为对应的变量名称。以下是修改后的代码及关键说明:
修改后的代码
from pysnmp.hlapi import SnmpEngine, CommunityData, UdpTransportTarget, ContextData, ObjectType, ObjectIdentity, nextCmd from pysnmp.smi import builder, view, compiler def walk_mib(ipaddress, oid, mib_dirs=None): # 初始化MIB构建器,用于加载自定义MIB文件 mib_builder = builder.MibBuilder() # 添加自定义MIB文件所在目录(可传入多个目录) if mib_dirs: for dir_path in mib_dirs: mib_builder.addMibSources(builder.DirMibSource(dir_path)) # 添加系统默认MIB路径(通常包含SNMPV2-SMI等基础MIB) mib_builder.addMibSources(builder.DirMibSource('/usr/share/snmp/mibs')) # 编译MIB文件,确保能被解析 compiler.addMibCompiler(mib_builder) # 创建MIB视图控制器,用于OID与符号名称的映射 mib_view = view.MibViewController(mib_builder) for (errorIndication, errorStatus, errorIndex, varBinds) in nextCmd( SnmpEngine(), CommunityData('public'), UdpTransportTarget((ipaddress, 161)), ContextData(), ObjectType(ObjectIdentity(oid)), lookupMib=True, # 启用MIB符号解析 mibViewController=mib_view # 指定自定义MIB视图 ): if not errorIndication and not errorStatus: for varBind in varBinds: # 获取MIB模块名和变量名称 mib_module, var_name = varBind[0].getMibSymbol() value = varBind[1].prettyPrint() # 按期望格式输出 print(f"{mib_module}::{var_name} = {value}") # 调用示例:替换为你的设备IP、起始OID和MIB文件目录 walk_mib('<ip address>', '1.3.6.1.2.1', mib_dirs=['/path/to/your/mib/files'])
关键说明
- 加载自定义MIB:通过
MibBuilder添加你的MIB文件所在目录,确保pysnmp能找到并编译这些MIB。 - 启用符号解析:
nextCmd中设置lookupMib=True,让pysnmp自动将数值OID转换为对应的变量名称。 - 符号名称获取:
getMibSymbol()方法返回(MIB模块名,变量名称)的元组,直接拼接即可得到你想要的格式。
注意事项
- 确保你的MIB文件是标准ASN.1格式,pysnmp支持编译解析。
- 如果自定义MIB依赖其他基础MIB(如SNMPV2-SMI),需确保这些依赖MIB已存在于系统默认路径或你添加的目录中。
- 检查脚本对MIB目录的读取权限,避免因权限不足导致加载失败。
内容的提问来源于stack exchange,提问作者Delta88
相关产品推荐
相关产品推荐

