You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell中curl请求读取变量:Nginx异常PushBullet推送脚本故障

解决Nginx日志推送PushBullet时脚本失败的问题

嘿,我瞅了下你的脚本,问题主要出在JSON格式不规范和变量引用的引号处理上,这俩坑直接导致curl请求被PushBullet API拒绝了,我给你一步步修正:

问题到底出在哪?

  1. JSON的规矩是键和字符串值必须用双引号,你用单引号包裹整个JSON结构,API根本认不出来;
  2. 直接在双引号里插$str,如果日志里有空格、双引号或者换行这类特殊字符,瞬间就把JSON结构拆烂了,curl肯定报错;
  3. 另外你脚本里的curl换行虽然能用,但最好保持格式整齐,避免意外的语法问题。

修正后的可用脚本

push() {
    while read str; do
        # 先把日志内容转成合法的JSON字符串,避免特殊字符搞事情
        escaped_str=$(printf '%s' "$str" | jq -r '@json')
        curl --header 'Access-Token: XXX' \
             -X POST https://api.pushbullet.com/v2/pushes \
             --header 'Content-Type: application/json' \
             --data-binary "{\"type\": \"note\", \"title\": \"nginx\", \"body\": $escaped_str}"
    done
}
# 这里把你的日志路径补全,比如/var/log/nginx/error.log
tail -f /var/log/nginx/error.log | push

核心改进点说明

  • 用jq处理特殊字符:jq '@json'会自动把日志里的双引号、反斜杠、换行这些玩意儿转成JSON能识别的格式,再也不用担心变量破坏结构了;
  • 修正JSON引号:把原来的单引号全换成双引号,内部的双引号用反斜杠转义,确保整个JSON格式完全符合API要求;
  • 安全引用变量:用"$str"包裹变量,避免空格导致的字段拆分问题。

要是服务器没装jq怎么办?

如果你的机器上没有jq工具,也可以用sed手动转义特殊字符,虽然不如jq靠谱,但应急够用:

push() {
    while read str; do
        # 手动转义双引号和反斜杠
        escaped_str=$(printf '%s' "$str" | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g')
        curl --header 'Access-Token: XXX' \
             -X POST https://api.pushbullet.com/v2/pushes \
             --header 'Content-Type: application/json' \
             --data-binary "{\"type\": \"note\", \"title\": \"nginx\", \"body\": \"$escaped_str\"}"
    done
}
tail -f /var/log/nginx/error.log | push

测试小技巧

你可以先手动模拟一条带特殊字符的日志测试下:

echo "Nginx error: \"502 Bad Gateway\" on /api path" | push

要是能正常收到推送,就说明脚本没问题啦!

内容的提问来源于stack exchange,提问作者tshaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:44:03