0

Shell脚本curl重定向告警Slack Webhook配置:3个实战脚本让网站问题秒级推送到Slack

2026.06.06 | youres | 26次围观

为什么选择Slack做网站告警通知

邮件告警有延迟,钉钉、企业微信需要企业资质,而Slack Webhook配置是最简单的HTTP回调——只需一个curl命令就能把告警推送到指定频道,无需SDK,无需认证,跨平台通用。

对于运维团队来说,把网站重定向异常(301循环、302临时跳转、重定向次数超限)实时推送到Slack,比邮件快得多,也比钉钉/企业微信更容易集成到现有自动化流程里。

前置条件:获取Slack Webhook URL

在Slack工作区依次进入:Settings & Administration → Manage Apps → Custom Integrations → Incoming Webhooks → Add to Slack,选择目标频道后,会生成一个类似这样的URL:

https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

保存好这个URL,后续所有curl告警请求都往这个地址发。

实战脚本一:基础重定向异常Slack告警

先写一个最基础的脚本:用curl检测目标URL的重定向次数,超过阈值就发Slack告警。

#!/bin/bash
TARGET_URL="https://example.com"
WEBHOOK_URL="https://hooks.slack.com/services/你的Webhook地址"
MAX_REDIRECTS=3

redirect_count=$(curl -s -o /dev/null -w "%{num_redirects}" -L --max-redirs 10 "$TARGET_URL")

if [ "$redirect_count" -gt "$MAX_REDIRECTS" ]; then
  curl -s -X POST -H "Content-type: application/json" \
    --data "{\"text\":\"警报 重定向异常告警:$TARGET_URL 跳转次数 ${redirect_count} 次,超过阈值 ${MAX_REDIRECTS} 次\"}" \
    "$WEBHOOK_URL"
fi

这个脚本的核心逻辑:用curl -w "%{num_redirects}"拿到重定向次数,超过阈值就用curl POST一个JSON到Slack Webhook。

实战脚本二:带字段格式化的富文本告警

Slack支持Block Kit格式,比纯文本效果好得多。下面这个脚本用Block Kit格式化告警消息:

#!/bin/bash
TARGET_URL="https://example.com"
WEBHOOK_URL="https://hooks.slack.com/services/你的Webhook地址"

http_code=$(curl -s -o /dev/null -w "%{http_code}" -L "$TARGET_URL")
final_url=$(curl -s -o /dev/null -w "%{url_effective}" -L "$TARGET_URL")
redirect_count=$(curl -s -o /dev/null -w "%{num_redirects}" -L "$TARGET_URL")

if [ "$http_code" -ne 200 ]; then
  curl -s -X POST -H "Content-type: application/json" \
    --data "{
      \"blocks\": [
        {
          \"type\": \"header\",
          \"text\": {\"type\": \"plain_text\", \"text\": \"警报 网站重定向告警\"}
        },
        {
          \"type\": \"section\",
          \"fields\": [
            {\"type\": \"mrkdwn\", \"text\": \"*目标URL:* $TARGET_URL\"},
            {\"type\": \"mrkdwn\", \"text\": \"*最终状态码:* $http_code\"},
            {\"type\": \"mrkdwn\", \"text\": \"*重定向次数:* $redirect_count\"},
            {\"type\": \"mrkdwn\", \"text\": \"*最终地址:* $final_url\"}
          ]
        }
      ]
    }" \
    "$WEBHOOK_URL"
fi

Block Kit格式的告警在Slack里显示为一个卡片,包含标题和4个字段,比纯文本直观很多。

实战脚本三:告警分级+频道路由

真实场景里,警告和严重告警应该推送到不同频道。下面这个脚本实现告警分级路由:

#!/bin/bash
TARGET_URL="https://example.com"
WEBHOOK_WARN="https://hooks.slack.com/services/警告频道Webhook"
WEBHOOK_CRIT="https://hooks.slack.com/services/严重告警频道Webhook"

redirect_count=$(curl -s -o /dev/null -w "%{num_redirects}" -L --max-redirs 10 "$TARGET_URL")
time_redirect=$(curl -s -o /dev/null -w "%{time_redirect}" -L "$TARGET_URL")

if [ "$redirect_count" -gt 5 ]; then
  # 严重告警:重定向次数>5,推送到严重告警频道
  curl -s -X POST -H "Content-type: application/json" \
    --data "{\"text\":\"🔴 严重:$TARGET_URL 重定向 ${redirect_count} 次,疑似重定向循环\"}" \
    "$WEBHOOK_CRIT"
elif [ "$(echo "$time_redirect > 1" | bc)" -eq 1 ]; then
  # 警告:重定向耗时>1秒,推送到警告频道
  curl -s -X POST -H "Content-type: application/json" \
    --data "{\"text\":\"🟡 警告:$TARGET_URL 重定向耗时 ${time_redirect}s\"}" \
    "$WEBHOOK_WARN"
fi

关键注意事项

  • Slack Webhook只支持POST:必须用-X POST,且Content-type设为application/json
  • JSON里的双引号要转义:在Shell脚本里,JSON的双引号写成\"
  • curl的-s参数不能省:否则curl的进度条输出会混进告警消息里
  • Webhook URL要保密:不要把Webhook URL写进公开仓库,建议用环境变量传入

与钉钉/企业微信告警的对比

对比项Slack Webhook钉钉机器人企业微信机器人
配置难度最简单简单中等
消息格式Block Kit(富文本)Markdown纯文本/图文
是否需要认证无需认证可选加签需CorpID/Secret
适用场景技术团队、开源项目国内企业国内企业

相关文章推荐

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论