Shell中curl请求读取变量:Nginx异常PushBullet推送脚本故障
解决Nginx日志推送PushBullet时脚本失败的问题
嘿,我瞅了下你的脚本,问题主要出在JSON格式不规范和变量引用的引号处理上,这俩坑直接导致curl请求被PushBullet API拒绝了,我给你一步步修正:
问题到底出在哪?
- JSON的规矩是键和字符串值必须用双引号,你用单引号包裹整个JSON结构,API根本认不出来;
- 直接在双引号里插
$str,如果日志里有空格、双引号或者换行这类特殊字符,瞬间就把JSON结构拆烂了,curl肯定报错; - 另外你脚本里的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
相关产品推荐
相关产品推荐

