如何用Python编写程序,在收到指定SNMP OID的Trap时触发告警?
Python SNMP Trap 告警监听程序实现
前置依赖
仅需要安装第三方SNMP处理库pysnmp,GUI弹窗使用Python自带的tkinter库无需额外安装:
pip install pysnmp
完整可运行代码
from pysnmp.entity import engine, config from pysnmp.carrier.asyncore.dgram import udp from pysnmp.entity.rfc3413 import ntfrcv import tkinter as tk from tkinter import messagebox # 隐藏tkinter主窗口,仅使用弹窗功能 root = tk.Tk() root.withdraw() # 自定义目标OID列表 TARGET_OIDS = [ '1.3.6.1.4.1.31448.1.1.0.9', '1.3.6.1.4.1.31448.1.1.0.13', '1.3.6.1.4.1.31448.1.1.0.14', '1.3.6.1.4.1.31448.1.1.0.15', '1.3.6.1.4.1.31448.1.1.0.19', '1.3.6.1.4.1.31448.1.1.0.23' ] # Trap接收回调函数 def trap_receive_callback(snmpEngine, stateReference, contextEngineId, contextName, varBinds, cbCtx): for oid, value in varBinds: oid_str = oid.prettyPrint() if oid_str in TARGET_OIDS: messagebox.showwarning( title="设备故障告警", message=f"收到对应故障SNMP Trap\n触发OID:{oid_str}\n请立即检查关联设备运行状态" ) # 匹配到目标OID后直接终止遍历,避免重复弹窗 break # 初始化SNMP引擎 snmp_engine = engine.SnmpEngine() # 配置UDP监听:0.0.0.0表示监听所有网卡,端口162为SNMP Trap默认端口 config.addTransport( snmp_engine, udp.domainName, udp.UdpTransport().openServerMode(('0.0.0.0', 162)) ) # 配置SNMP v2c团体名,可根据设备实际配置修改团体名参数 config.addV1System(snmp_engine, 'my-access-area', 'public') # 注册Trap接收回调 ntfrcv.NotificationReceiver(snmp_engine, trap_receive_callback) snmp_engine.transportDispatcher.jobStarted(1) if __name__ == "__main__": try: print("SNMP Trap监听服务已启动,等待告警触发...") snmp_engine.transportDispatcher.runDispatcher() except KeyboardInterrupt: print("服务已停止") snmp_engine.transportDispatcher.closeDispatcher()
注意事项
- 端口162属于系统保留端口,Linux/Mac运行需要加
sudo,Windows需要以管理员身份启动终端运行程序;如果不想使用管理员权限,可以将监听端口改为1024以上的高位端口(如1162),同步修改关联设备的Trap发送端口即可 - 代码默认使用SNMP v2c版本、团体名
public,如果你的设备使用其他SNMP版本或自定义团体名,修改对应配置即可 - 弹窗为阻塞式提示,点击确认后程序会继续监听后续Trap,不需要弹窗的话可以替换为系统桌面通知逻辑
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

