如何在接收SNMP Trap时执行自定义脚本并获取陷阱信息?
如何在自定义Bash脚本中获取SNMP陷阱信息
没问题,我来帮你搞定这个!当你通过snmptrapd.conf里的traphandle default my_script.sh配置,让snmptrapd把陷阱转发到自定义脚本时,snmptrapd会将完整的陷阱数据通过标准输入(stdin)传递给你的脚本,你只需要在脚本里读取这部分输入即可。
1. 基础示例脚本
先写一个最简单的脚本,把收到的陷阱内容直接写入日志文件,验证是否能正常获取数据:
#!/bin/bash # my_script.sh - 接收并记录SNMP陷阱信息 # 定义日志文件路径,确保snmp用户有写入权限 LOG_FILE="/var/log/snmptrap_custom.log" # 读取标准输入的陷阱内容,追加到日志文件 cat >> "$LOG_FILE" # 也可以添加时间戳,让日志更清晰 # echo "[$(date '+%Y-%m-%d %H:%M:%S')] 收到SNMP陷阱:" >> "$LOG_FILE" # cat >> "$LOG_FILE" # echo -e "\n-------------------------\n" >> "$LOG_FILE"
2. 给脚本设置权限
别忘了给脚本添加执行权限,并且确保运行snmptrapd的用户(通常是snmp用户)能访问和执行它:
chmod +x /path/to/my_script.sh chown snmp:snmp /path/to/my_script.sh # 如果日志文件不存在,先创建并设置权限 touch /var/log/snmptrap_custom.log chown snmp:snmp /var/log/snmptrap_custom.log
3. 解析陷阱内容(进阶)
如果需要提取陷阱里的特定字段(比如OID、发送方IP、告警消息等),可以在脚本里用文本处理工具(如awk、grep、sed)来解析stdin的内容。比如下面的脚本会提取关键信息并格式化输出:
#!/bin/bash LOG_FILE="/var/log/snmptrap_custom.log" # 读取陷阱内容到变量 TRAP_DATA=$(cat) # 提取发送方IP(通常在第一行类似"UDP: [192.168.1.100]:54321"的位置) SOURCE_IP=$(echo "$TRAP_DATA" | grep -oP 'UDP: \[\K[0-9.]+') # 提取陷阱OID(找类似"SNMPv2-MIB::sysUpTime.0 = Timeticks: (123456) 0:20:34.56"的行,或者具体的告警OID) TRAP_OID=$(echo "$TRAP_DATA" | grep -oP 'SNMPv2-SMI::enterprises\.\d+\.\d+\.\d+\.\d+' | head -1) # 提取告警消息(根据实际OID对应的字段调整) ALERT_MSG=$(echo "$TRAP_DATA" | grep -A1 'SNMPv2-MIB::snmpTrapEnterprise.0' | tail -1) # 格式化写入日志 echo "[$(date '+%Y-%m-%d %H:%M:%S')]" >> "$LOG_FILE" echo "来源IP: $SOURCE_IP" >> "$LOG_FILE" echo "陷阱OID: $TRAP_OID" >> "$LOG_FILE" echo "告警内容: $ALERT_MSG" >> "$LOG_FILE" echo -e "-------------------------\n" >> "$LOG_FILE"
4. 测试验证
修改snmptrapd.conf后,重启snmptrapd服务:
systemctl restart snmptrapd
然后用snmptrap命令发送一个测试陷阱,验证脚本是否能正确处理:
snmptrap -v 2c -c public localhost "" SNMPv2-MIB::coldStart SNMPv2-MIB::sysName.0 s "Test Trap"
之后查看你定义的日志文件,应该能看到陷阱的相关内容。
内容的提问来源于stack exchange,提问作者Adrián Juárez




