Shell脚本如何配置企业微信报警:从入门到实战的完整指南
目录导读
- 企业微信报警的应用场景与原理
- 前置准备:创建企业微信机器人
- Shell脚本核心实现:调用Webhook发送消息
- 高级功能:多格式报警与异常处理
- 实战案例:服务器监控自动报警
- 常见问题与优化建议
- 问答环节
企业微信报警的应用场景与原理
在日常运维中,脚本执行失败、服务器资源告警、任务异常中断等场景都需要即时通知,企业微信机器人通过Webhook接口,允许任何程序向指定群聊发送消息,而Shell脚本恰恰是Linux环境下最轻量的自动化工具。

核心原理:Shell脚本通过curl命令向企业微信机器人的Webhook地址发送HTTP POST请求,消息体采用JSON格式,包含文本、Markdown或图文内容。
前置准备:创建企业微信机器人
步骤1:打开企业微信,进入目标群聊,点击右上角“...”,选择“群机器人”。
步骤2:点击“添加机器人”,输入名称(如“运维报警”),点击“确认添加”,系统会生成唯一的Webhook地址(https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx)。
步骤3:复制Webhook地址,这是脚本调用的关键入口。
注意:机器人仅可在群聊中创建,且支持自定义关键字过滤(如“报警”),未命中关键字的消息可能被忽略。
Shell脚本核心实现:调用Webhook发送消息
1 基础文本消息脚本
#!/bin/bash
# 企业微信机器人Webhook地址
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
# 发送文本消息函数
send_alert() {
local message="$1"
curl -s -X POST "$WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d "{
\"msgtype\": \"text\",
\"text\": {
\"content\": \"$message\"
}
}"
}
# 使用示例
send_alert "【报警通知】服务器磁盘使用率超过90%"
2 Markdown格式消息(更美观)
send_markdown_alert() {
local markdown_content="$1"
curl -s -X POST "$WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d "{
\"msgtype\": \"markdown\",
\"markdown\": {
\"content\": \"$markdown_content\"
}
}"
}
# 示例:带格式的报警
send_markdown_alert "# 系统报警\n**服务器**: 192.168.1.1\n**CPU使用率**: <font color=\"warning\">95%</font>"
3 带@提醒的消息(重要报警)
send_alert_with_mention() {
local message="$1"
curl -s -X POST "$WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d "{
\"msgtype\": \"text\",
\"text\": {
\"content\": \"$message\",
\"mentioned_list\": [\"@all\"]
}
}"
}
高级功能:多格式报警与异常处理
1 带时间戳与主机名的动态消息
HOSTNAME=$(hostname)
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
send_alert "【${HOSTNAME}】${TIMESTAMP} - 进程nginx停止运行"
2 错误重试机制
send_alert_with_retry() {
local message="$1"
local retries=3
for ((i=1; i<=retries; i++)); do
response=$(curl -s -X POST "$WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$message\"}}" 2>&1)
if echo "$response" | grep -q '"errcode":0'; then
echo "消息发送成功"
return 0
fi
sleep 2
done
echo "消息发送失败,已重试${retries}次"
return 1
}
实战案例:服务器监控自动报警
创建一个完整的监控脚本monitor.sh,集成磁盘、CPU、内存检测:
#!/bin/bash
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
HOSTNAME=$(hostname)
# 检查磁盘使用率
disk_usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$disk_usage" -gt 85 ]; then
content="# 磁盘报警\n**主机**: $HOSTNAME\n**使用率**: ${disk_usage}%"
curl -s -X POST "$WEBHOOK_URL" -H "Content-Type: application/json" \
-d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"$content\"}}"
fi
# 检查CPU负载
cpu_load=$(uptime | awk -F'load average:' '{print $2}' | cut -d, -f1)
if (( $(echo "$cpu_load > 5.0" | bc -l) )); then
content="# CPU高负载\n**主机**: $HOSTNAME\n**负载值**: $cpu_load"
# 发送报警...
fi
将此脚本加入crontab实现定时监控:
*/5 * * * * /path/to/monitor.sh
常见问题与优化建议
常见问题
- 消息发送失败(返回40001):Webhook地址的key错误或过期,重新创建机器人获取新key。
- 消息被忽略:检查群机器人是否设置了关键字过滤,消息中需包含设定的关键字。
- 中文乱码:确保脚本文件使用UTF-8编码,并在脚本开头声明
# -*- coding: utf-8 -*-。 - 特殊字符导致JSON解析失败:使用
jq工具对消息内容进行转义,或在Shell中用printf处理。
优化建议
- 使用环境变量或配置文件存储Webhook地址,避免硬编码。
- 将报警函数封装为独立的库文件,方便复用。
- 结合
logrotate管理报警日志,避免日志过大。
问答环节
问:脚本可以发送图片或文件吗?
答:企业微信机器人支持图片(base64编码)和文件(需先上传获取media_id),但不建议在Shell中实现,更适合Python或Go等语言。
问:如何对多个群聊发送报警?
答:定义多个Webhook地址变量,在发送函数中循环调用即可:
for url in "$WEBHOOK_GROUP1" "$WEBHOOK_GROUP2"; do
curl -s -X POST "$url" -d "{\"msgtype\":\"text\",...}"
done
问:每天消息量有限制吗?
答:每个机器人每分钟最多发送20条消息,超过限制会返回频率限制错误(错误码45009),建议对报警进行聚合,例如将5分钟内的相同报警合并发送。
问:如何在脚本中动态获取服务器公网IP?
答:使用curl ifconfig.me或curl ip.sb获取外网IP,结合报警内容一起发送。
问:能否设置不同的报警级别?
答:可以,在消息内容中添加级别标识(如“INFO”、“WARN”、“ERROR”),并根据级别选择是否@所有人,或者发送到不同群聊。