Shell脚本配置钉钉机器人报警:自动化运维的必备技能
📖 目录导读
- 为什么需要钉钉机器人报警?——运维痛点与解决方案
- 钉钉机器人报警的核心原理与准备工作
- Step 1:创建钉钉机器人并获取Webhook地址
- Step 2:编写Shell脚本发送报警消息
- Step 3:结合关键词与自定义关键字提高识别率
- Step 4:集成到监控脚本——CPU、内存、磁盘报警实战
- 常见问题与排查指南(附问答)
- SEO优化建议与实战案例
为什么需要钉钉机器人报警?——运维痛点与解决方案
Q:为什么运维人员需要配置钉钉机器人报警?

A:在服务器监控体系中,传统的邮件报警存在延迟高、易被忽略等问题,钉钉作为国内企业高频使用的协作工具,其机器人报警能实现秒级推送、群内多人实时接收,且支持指定人员,通过Shell脚本调用钉钉API,运维团队可以在系统出现CPU飙升、磁盘写满、服务宕机时第一时间收到通知,显著缩短故障响应时间。
核心价值:零成本、低门槛、高覆盖——仅需一个Webhook地址,无需安装额外监控软件。
钉钉机器人报警的核心原理与准备工作
1 原理简述
钉钉机器人通过HTTP POST请求将JSON格式的数据推送到指定群的Webhook地址,Shell脚本利用curl命令构造请求体,发送报警信息。
2 前置条件
- 一台Linux/Unix服务器(具备Shell环境)
- 服务器能访问外网(
curl可正常使用) - 一个钉钉群(或新建一个测试群)
Q:Webhook地址有安全风险吗?
A:是的,Webhook地址一旦泄露,任何人都可以向你的群发送消息,建议:
- 在钉钉机器人安全设置中勾选“加签”模式,并在Shell脚本中动态生成签名
- 限制脚本的执行权限(
chmod 700 script.sh)
Step 1:创建钉钉机器人并获取Webhook地址
- 打开钉钉PC端,进入目标群 → 点击右上角“群设置” → 选择“智能群助手”
- 点击“添加机器人” → 选择“自定义(通过Webhook接入)”
- 填写机器人名字(如“报警机器人”),并选择安全方式:
- 推荐:勾选“加签”,复制系统生成的
secret(用于后续签名计算) - 若不勾选加签,则仅依赖关键词过滤(安全性较低)
- 推荐:勾选“加签”,复制系统生成的
- 获取
Webhook地址(格式如:https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx)
Step 2:编写Shell脚本发送报警消息
1 基础脚本示例(无加签模式)
#!/bin/bash
# 钉钉机器人Webhook地址
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=你的token"
# 构造JSON消息体
MSG='{
"msgtype": "text",
"text": {
"content": "【报警】CPU使用率超阈值,当前值:95%"
}
}'
# 发送请求
curl -s -X POST -H "Content-Type: application/json" -d "$MSG" "$WEBHOOK_URL"
参数说明:
msgtype:消息类型(text、markdown、link等)content:纯文本内容
2 带加签的安全模式脚本
若开启了“加签”,需在请求头中传入timestamp和sign:
#!/bin/bash
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=你的token"
SECRET="你的secret"
# 计算时间戳和签名
timestamp=$(date +%s%3N)
sign=$(echo -n "$timestamp\n$SECRET" | openssl dgst -sha256 -hmac "$SECRET" -binary | base64)
# 构造消息
MSG='{
"msgtype": "text",
"text": { "content": "报警:磁盘使用率超过90%" }
}'
# 发送(注意URL参数携带timestamp和sign)
curl -s -X POST -H "Content-Type: application/json" \
-d "$MSG" \
"{$WEBHOOK_URL}×tamp=$timestamp&sign=$sign"
Q:为什么我发送后钉钉没收到消息?
A:常见原因:
- Webhook地址错误(检查token是否完整)
- 安全设置不匹配(加签模式必须传签名,关键词模式则要求消息包含特定关键词)
- 服务器无法访问外网(测试
curl https://oapi.dingtalk.com)
Step 3:结合关键词与自定义关键字提高识别率
1 自定义关键词过滤
在钉钉机器人安全设置中,可添加1-20个自定义关键词(如“报警”、“故障”)。必须包含至少一个关键词,否则机器人会忽略。
示例:在脚本中添加关键词标识
"content": "【报警】服务器内存不足,请立即处理"
2 使用Markdown格式丰富报警信息
增加可读性,支持加粗、换行、指定人员:
MSG='{
"msgtype": "markdown",
"markdown": {
"title": "服务异常报警",
"text": "#### 服务【nginx】异常 \n> 状态:**已停止** \n> 服务器:192.168.1.10 \n> 时间:2025-03-20 14:30:00 \n"
},
"at": {
"atMobiles": ["13800138000"],
"isAtAll": false
}
}'
Q:如何@特定人?
A:在atMobiles数组中填写手机号,且text内容需包含手机号,如:内容:@13800138000 请检查服务。
Step 4:集成到监控脚本——CPU、内存、磁盘报警实战
1 综合监控脚本(实时采集 + 阈值判断 + 报警)
#!/bin/bash
# 获取CPU使用率(取1分钟平均值的百分比)
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d% -f1)
# 获取内存使用率
mem_usage=$(free -m | awk '/Mem:/ {printf "%.0f", $3/$2 * 100}')
# 获取磁盘使用率(以根分区为例)
disk_usage=$(df -h / | tail -1 | awk '{print $5}' | cut -d% -f1)
# 定义阈值
CPU_THRESHOLD=80
MEM_THRESHOLD=85
DISK_THRESHOLD=90
# 初始化报警消息
alarm_msg=""
if [ $(echo "$cpu_usage > $CPU_THRESHOLD" | bc) -eq 1 ]; then
alarm_msg+="CPU使用率: $cpu_usage%(阈值$CPU_THRESHOLD%)\n"
fi
if [ $mem_usage -gt $MEM_THRESHOLD ]; then
alarm_msg+="内存使用率: $mem_usage%(阈值$MEM_THRESHOLD%)\n"
fi
if [ $disk_usage -gt $DISK_THRESHOLD ]; then
alarm_msg+="磁盘使用率: $disk_usage%(阈值$DISK_THRESHOLD%)\n"
fi
# 如果有报警,发送钉钉消息
if [ -n "$alarm_msg" ]; then
hostname=$(hostname)
content="【服务器报警】主机:$hostname \n$alarm_msg"
# 调用发送函数(可复用上文脚本的发送代码)
# 此处省略发送函数,实际使用时加入上面的curl代码
fi
Q:脚本中bc命令是必须的吗?
A:top输出的CPU使用率是小数,Shell本身不支持浮点数比较,因此使用bc命令进行大小判断,或者改用整数比较(如awk直接截取整数部分)。
2 配置定时自动检查
将脚本加入crontab,每5分钟执行一次:
*/5 * * * * /usr/local/bin/monitor_alarm.sh
常见问题与排查指南(附问答)
Q1:钉钉机器人发送消息显示“消息内容未通过安全检查”
- 检查是否开启了“加签”但未传入签名;或者未开启加签但需包含自定义关键词。
Q2:Shell脚本中特殊字符导致JSON解析失败?
- 使用双引号包裹JSON,并对内部变量中的、
\n等字符进行转义,推荐使用printf构造JSON。
Q3:如何发送多行报警内容?
- 使用
\n换行,或使用Markdown的>符号实现块引用。
Q4:能否发送图片或文件?
- 钉钉机器人支持
link、markdown等类型,但图片需通过URL链接形式嵌入(不支持直接上传)。
Q5:脚本执行成功但钉钉未收到?
- 在脚本中添加
curl -v查看返回信息,常见错误码:400:JSON格式错误403:token无效或签名错误410:机器人已被管理员关闭
SEO优化建议与实战案例
1 SEO关键词布局
- 核心关键词:
Shell脚本 钉钉机器人报警、Linux 钉钉告警脚本、运维自动化 钉钉通知 - 长尾词:
Shell脚本配置钉钉机器人Webhook、CPU监控钉钉报警脚本、钉钉机器人加签模式Shell - 布局建议:正文标题、小标题、代码注释中自然融入,如本文“Step 4:集成到监控脚本——CPU、内存、磁盘报警实战”
2 实际案例参考
某电商公司运维团队使用上述脚本监控100+台服务器,当磁盘使用率超过90%时,自动推送报警至核心运维群,并@值班人员,结合systemd服务自动重启,将故障恢复时间从平均15分钟缩短至3分钟。
最终提醒:配置完成后,建议手动模拟一个报警事件(如临时创建一个大文件触发磁盘报警),验证整个链路是否正常。
脚本下载:本文示例代码可直接复制使用,但请将
token和secret替换为你自己的实际值,如需更复杂的HTML格式报警(如带表格),可使用msgtype: feedCard类型。