Shell脚本如何配置企业微信报警

wen 实用脚本 1

Shell脚本如何配置企业微信报警:从入门到实战的完整指南

目录导读

  1. 企业微信报警的应用场景与原理
  2. 前置准备:创建企业微信机器人
  3. Shell脚本核心实现:调用Webhook发送消息
  4. 高级功能:多格式报警与异常处理
  5. 实战案例:服务器监控自动报警
  6. 常见问题与优化建议
  7. 问答环节

企业微信报警的应用场景与原理

在日常运维中,脚本执行失败、服务器资源告警、任务异常中断等场景都需要即时通知,企业微信机器人通过Webhook接口,允许任何程序向指定群聊发送消息,而Shell脚本恰恰是Linux环境下最轻量的自动化工具。

Shell脚本如何配置企业微信报警

核心原理: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

常见问题与优化建议

常见问题

  1. 消息发送失败(返回40001):Webhook地址的key错误或过期,重新创建机器人获取新key。
  2. 消息被忽略:检查群机器人是否设置了关键字过滤,消息中需包含设定的关键字。
  3. 中文乱码:确保脚本文件使用UTF-8编码,并在脚本开头声明# -*- coding: utf-8 -*-
  4. 特殊字符导致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.mecurl ip.sb获取外网IP,结合报警内容一起发送。

:能否设置不同的报警级别?
:可以,在消息内容中添加级别标识(如“INFO”、“WARN”、“ERROR”),并根据级别选择是否@所有人,或者发送到不同群聊。

抱歉,评论功能暂时关闭!