curlは引用符付き文字列変数を送信する

1200 ワード

今日、プログラムが異常に終了した後、最後の行のログをcurlでアラームサーバに送信したいという問題が発生しました.スクリプトはこのように書かれています.
log=$(tail -n 1 server.log)
curl -X POST -H "Content-Type: application/json" -d "{\"text\":\"     :$(echo $log)\"}"  https://xxx.xxx.xxx

私のログは一般的にこのようなものです.
log info 00:00:00 "event":"payment"

jsonで変数を置換すると、文字列変数が直接置換されます.つまり、このコマンドが実際に実行するのはこれです.
log=$(tail -n 1 server.log)
curl -X POST -H "Content-Type: application/json" -d "{\"text\":\"     :log info 00:00:00 "event":"payment"\"}"  https://xxx.xxx.xxx

このとき問題が来て、文字列には引用符があり、エスケープされていないので、jsonの内容は実際にここで止まりました.
"{\"text\":\"     :log info 00:00:00 "

このようなjsonがserverに送ったので、serverは拒否したに違いない..の
では、この問題はどのように解決すればいいのでしょうか.文字列変数の引用符を変換するだけでいいのです.つまり、
" -> \"

だから私たちがしなければならないのは、この文字列変数のすべての引用符を置き換えるといいです.置き換えると、自然にsedを思い出します.はい、sedを使うことです.あまり言わないで、直接修正したスクリプトを書きます.
log=$(tail -n 1 server.log | sed 's/"/\\"/g')

はい、このように直すだけで、出したらオークになります.簡単でしょう.ハハ~