如何在Python中将变量与SNMP OID关联并构建映射表?
用PySNMP实现Python变量与SNMP OID的映射
PySNMP确实支持将Python变量绑定到自定义OID,核心是通过自定义MIB instrumentation函数处理SNMP请求,把变量值返回给客户端。以下是具体实现方案:
核心思路
注册SNMP请求处理函数,当客户端请求指定OID时,直接返回对应Python变量的当前值。建议使用私有企业号段1.3.6.1.4.1.x作为自定义OID前缀,避免与标准MIB冲突。
完整代码示例
from pysnmp.entity import engine, config from pysnmp.entity.rfc3413 import cmdrsp, context from pysnmp.carrier.asyncore.dgram import udp from pysnmp.smi import instrum, builder # 定义要映射的Python变量 py_var1 = 123 # 整数类型 py_var2 = "Hello SNMP" # 字符串类型 py_var3 = False # 布尔类型 # 初始化SNMP引擎与基础配置 snmp_engine = engine.SnmpEngine() # 配置UDP监听(SNMP默认端口161) config.addTransport( snmp_engine, udp.domainName, udp.UdpTransport().openServerMode(('0.0.0.0', 161)) ) # 添加SNMPv2c社区认证(社区名public) config.addV1System(snmp_engine, 'my-snmp-area', 'public') # 加载标准MIB并创建MIB控制器 mib_builder = builder.MibBuilder() mib_builder.loadModules('SNMPv2-MIB') mib_instrum = instrum.MibInstrumController(mib_builder) snmp_context = context.SnmpContext(snmp_engine, mibInstrum=mib_instrum) # 绑定OID与Python变量的处理函数 def handle_get_request(snmp_engine, context_name, var_binds, ac_info): # 遍历客户端请求的OID列表,匹配后返回对应变量值 for oid, val in var_binds: # OID1 -> py_var1(私有企业号12345下的节点) if oid == (1, 3, 6, 1, 4, 1, 12345, 1, 1): val.setSyntax(val.getSyntax().clone(py_var1)) # OID2 -> py_var2 elif oid == (1, 3, 6, 1, 4, 1, 12345, 1, 2): val.setSyntax(val.getSyntax().clone(py_var2)) # OID3 -> py_var3 elif oid == (1, 3, 6, 1, 4, 1, 12345, 1, 3): val.setSyntax(val.getSyntax().clone(py_var3)) return var_binds # 注册GET请求处理函数 cmdrsp.GetCommandResponder(snmp_engine, snmp_context, handle_get_request) # 启动SNMP代理 snmp_engine.transportDispatcher.jobStarted(1) try: snmp_engine.transportDispatcher.runDispatcher() except KeyboardInterrupt: snmp_engine.transportDispatcher.closeDispatcher()
关键说明
- OID规范:
1.3.6.1.4.1.x是IANA分配的私有企业号段,x可替换为你的企业编号(示例用12345)。 - 类型兼容:确保Python变量类型与SNMP数据类型匹配(如整数对应SNMP Integer32,字符串对应OctetString)。
- SET扩展:如果需要允许客户端修改Python变量,可新增
handle_set_request函数并注册cmdrsp.SetCommandResponder,在函数内更新变量值即可。
测试方法
安装PySNMP后运行代码,用SNMP工具验证:
# 遍历自定义OID节点 snmpwalk -v2c -c public localhost 1.3.6.1.4.1.12345.1 # 获取单个OID值 snmpget -v2c -c public localhost 1.3.6.1.4.1.12345.1.1
内容的提问来源于stack exchange,提问作者Andrew180
相关产品推荐
相关产品推荐

