Linux环境下搭建钉钉/飞书机器人告警系统 Shell脚本实现

梦墨酱_8972

梦墨酱_8972

2026-04-11

771人浏览

原创

钉钉机器人webhook需加timestamp和sign签名,用hmac-sha256计算"${timestamp}\n${secret}"再base64编码;飞书发富文本须设content-type: application/json,at需独立字段,非text内嵌。

linux环境下搭建钉钉/飞书机器人告警系统 shell脚本实现

钉钉机器人 Webhook URL 怎么加签名验证才不被拒

直接用裸 URL 发告警,大概率收不到——钉钉强制要求 timestamp 和 sign 参数(除非你关了「加签」,但生产环境不建议)。签名不是简单拼接,得用 HMAC-SHA256 对 "${timestamp}\n${secret}" 计算,再 Base64 编码。

Shell 里没原生 HMAC 函数,得靠 openssl 配合 echo -n(注意 -n,否则换行符多一个就验不过):

timestamp=$(date +%s%3N)
secret="your_secret_here"
sign=$(echo -n "${timestamp}\n${secret}" | openssl sha256 -hmac "${secret}" | awk '{print $NF}' | xxd -r -p | base64)

常见坑:

  • date +%s%3N 在部分老版 busybox 或 Alpine 的 date 不支持 %3N,得用 $(($(date +%s%N)/1000000)) 替代
  • openssl sha256 -hmac 在 macOS 的 OpenSSL 版本可能不认 -hmac,要换成 openssl dgst -sha256 -hmac
  • URL 里空格或特殊字符没 urlencode,curl 会截断,必须用 printf '%s' "$url" | jq -sRr @uri(需装 jq)或手动替换

飞书机器人怎么发富文本(text + at 某人)且不报 400

飞书要求 Content-Type: application/json,且 payload 必须是合法 JSON,字段名大小写敏感(比如是 msg_type,不是 msgType),at 不是写在 text 里,得单独放 at 字段里。

典型能跑通的最小结构:

cat <p>关键点:</p>
  • user_id 不是手机号或邮箱,得从飞书管理后台「成员详情」里复制,格式类似 ou_abc123...
  • 如果想 at 全体,user_id 改成 all,但机器人必须有「发送 at 全体消息」权限(管理员开)
  • 中文字段名(如 zh_cn)漏掉或写错,返回 {"code":400,"msg":"invalid request"},没更多提示

Shell 脚本里怎么统一处理钉钉/飞书失败重试和超时

网络抖动或机器人限流(钉钉 20次/分钟,飞书 60次/分钟)会导致 curl 返回非 2xx,但默认不报错。得用 -f(fail on error)+ -s(silent)+ -o /dev/null,再检查 $? 和响应体。

OpenClaw飞书任务管理
OpenClaw飞书任务管理

飞书任务管理工具,支持任务的创建、查询、更新、删除及清单的管理。适用场景:创建/管理任务与清单、查看任务列表或清单中的任务、用户提及任务、待办、to‑do、清单、task时、设置负责人和关注等。

下载

推荐封装一个带重试的发信函数:

send_alert() {
  local url=$1 msg=$2 max_retry=3
  for i in $(seq 1 $max_retry); do
    response=$(curl -sf -o /dev/null -w "%{http_code}" -m 10 "$url" -d "$msg")
    if [ "$response" = "200" ]; then
      return 0
    elif [ $i -eq $max_retry ]; then
      echo "alert failed after $max_retry tries: HTTP $response" >&2
      return 1
    fi
    sleep $((i * 2))
  done
}

注意:

  • -m 10 是总超时(含 DNS、连接、传输),别设太短,否则弱网下必失败
  • 飞书返回成功是 200,但钉钉是 {"errcode":0,...},所以不能只看 HTTP 状态码,还得解析 body(建议加 jq -e '.errcode == 0' 判断)
  • 重试间隔递增($((i * 2))),避免雪崩式重试打满配额

告警内容里怎么安全注入变量又不被 XSS 或 JSON 格式破坏

Shell 变量直接拼进 JSON,遇到双引号、反斜杠、换行就会让 JSON 解析失败;更糟的是,如果变量来自日志或命令输出,还可能带恶意内容。

最稳的方式是用 jq 构造 payload:

payload=$(jq -n \
  --arg title "$TITLE" \
  --arg text "$ALERT_TEXT" \
  --arg level "$LEVEL" \
  '{
    msg_type: "post",
    content: {
      post: {
        zh_cn: {
          title: $title,
          content: [[{"tag": "text", "text": $text}]]
        }
      }
    }
  }')

这样所有变量自动 JSON 转义,包括 \n、"、€ 都没问题。没装 jq?别手写 escape——临时用 Python 一行也比正则可靠:

payload=$(python3 -c "import json,sys; print(json.dumps({'text': sys.argv[1]}, ensure_ascii=False))" "$ALERT_TEXT")

别忘了:ALERT_TEXT 如果含未转义的 $ 或 `,在 eval 或未引号的 echo 里会被 Shell 展开,务必全程用 "$var" 包裹。

复杂点在于飞书的 at 和钉钉的 atMobiles 字段都要动态填,而用户 ID 本身也可能含特殊字符——这时候 jq --argjson 或预处理成数组更稳妥,别贪快拼字符串。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux 飞书 钉钉 shell脚本

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2075

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3082

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1036

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3499

7

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1678

6

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

2023.06.14

3523

6

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

2023.10.30

795

4

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

949

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习