宝塔面板对接企业微信钉钉实时推送故障告警脚本
当服务器出现故障时,如果不能第一时间收到通知,损失可能很大。
宝塔面板原生只支持邮件和短信告警,但很多运维朋友更习惯用企业微信或钉钉群接收消息。
本文教你编写一个Shell脚本,把宝塔面板的故障告警实时推送到企业微信群机器人或钉钉群机器人,全程零基础可操作。
准备工作:创建机器人并获取Webhook地址
无论是企业微信还是钉钉,都需要先建一个群并在群中添加机器人,拿到一个Webhook URL(类似一个接收消息的接口地址)。
企业微信机器人
- 在群聊中点击右上角“...” → “群机器人” → “添加” → 选择“新机器人”。
- 给机器人起名(比如“服务器告警”),保存后你会得到一个以
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=开头的地址。复制下来。 - 注意:企业微信机器人有频率限制(20条/分钟),普通故障告警完全够用。
钉钉机器人
- 在钉钉群中点击“群设置” → “智能群助手” → “添加机器人” → 选择“自定义”(通过Webhook接入)。
- 设置机器人名称和头像,安全设置建议选择“加签”或“IP地址(段)”,如果只想简单测试也可以选“自定义关键词”(比如填入“故障”)。
- 复制Webhook地址,格式类似
https://oapi.dingtalk.com/robot/send?access_token=。如果勾选了加签,还需要保存加签密钥(Secret)。
编写故障告警推送脚本
这个脚本会接收一个消息文本作为参数,然后通过curl发送给企业微信或钉钉。
我们先写一个通用版本,同时兼容两个平台。
在你的服务器上创建一个文件,例如 /opt/alert_push.sh:
#!/bin/bash
# 设置要推送的平台:wechat 或 dingtalk,默认 wechat
PLATFORM="wechat"
# Webhook 地址
WECHAT_WEBHOOK="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key"
DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=你的token"
DINGTALK_SECRET="你的加签密钥(如果没有加签,留空)"
# 消息内容(从第一个参数传入)
MESSAGE="$1"
if [ -z "$MESSAGE" ]; then
echo "请传入告警内容作为参数"
exit 1
fi
send_wechat() {
local msg="$1"
curl -s -X POST -H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$msg\"}}" \
"$WECHAT_WEBHOOK"
}
send_dingtalk() {
local msg="$1"
local timestamp=$(date +%s%3N)
local sign=""
if [ -n "$DINGTALK_SECRET" ]; then
sign=$(echo -n "$timestamp\n$DINGTALK_SECRET" | openssl dgst -sha256 -hmac "$DINGTALK_SECRET" -binary | base64)
fi
local data="{\"msgtype\":\"text\",\"text\":{\"content\":\"$msg\"}}"
local url="$DINGTALK_WEBHOOK"
if [ -n "$DINGTALK_SECRET" ]; then
url="${url}×tamp=${timestamp}&sign=${sign}"
fi
curl -s -X POST -H "Content-Type: application/json" -d "$data" "$url"
}
case "$PLATFORM" in
wechat)
send_wechat "$MESSAGE"
;;
dingtalk)
send_dingtalk "$MESSAGE"
;;
*)
echo "不支持的平台"
exit 1
;;
esac
保存后赋予执行权限:
chmod +x /opt/alert_push.sh
在宝塔面板中集成脚本
得到推送脚本后,有两种常见用法:
方法一:配合宝塔计划任务执行自定义检测
- 登录宝塔面板 → “计划任务” → 添加任务,任务类型选择“Shell脚本”。
- 执行周期根据需求设置,比如每5分钟检测一次Nginx是否存活:
if ! pgrep -x nginx > /dev/null; then
/opt/alert_push.sh "【故障】Nginx服务已停止!服务器:$(hostname),时间:$(date '+%Y-%m-%d %H:%M:%S')"
fi
- 保存后可以手动执行一次看是否收到消息。
方法二:接管宝塔面板的告警通知
宝塔面板支持自定义告警脚本(需要付费专业版或企业版)。在面板“设置” → “告警通知”中,可以配置“通知脚本”路径,填入 /opt/alert_push.sh,告警内容会作为参数传入。不过免费版用户建议用方法一更灵活。
避坑指南
- 中文乱码:脚本中发送消息时确保系统语言为UTF-8。可以在脚本开头加上
export LANG=zh_CN.UTF-8。 - Webhook安全:不要将Webhook地址公开,防止恶意刷消息。
- 消息频率:企业微信和钉钉都有频率限制,如果你的检测脚本循环太快可能导致封禁,建议检测间隔至少1分钟。
- 脚本参数传递:如果消息内容包含双引号,需要转义。上面的脚本直接传入字符串,建议消息中避免使用双引号,或者用单引号包裹。
- 钉钉加签:如果用了加签,必须严格按照脚本中的时间戳和签名计算方式,否则会返回“invalid signature”。
效果验证
手动执行脚本测试:
/opt/alert_push.sh "这是一条测试告警消息,收到请忽略。"
查看对应群聊是否收到消息。
如果没收到,检查Webhook地址是否填写正确、脚本是否有执行权限、curl是否安装(通常宝塔环境自带)。
还可以在脚本中添加 >> /tmp/alert.log 2>&1 进行日志调试。
成功收到消息后,你的宝塔面板故障告警推送就配置完成了。
以后服务器出任何问题都能第一时间通过企业微信或钉钉获知,再也不用傻等邮件或登录面板查看了。
如果你还想对接飞书、Telegram等其他平台,可以基于这个脚本扩展,原理类似。
更多宝塔运维技巧欢迎继续关注后续教程。