You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在接收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、告警消息等),可以在脚本里用文本处理工具(如awkgrepsed)来解析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

火山引擎 最新活动