curlは引用符付き文字列変数を送信する
今日、プログラムが異常に終了した後、最後の行のログをcurlでアラームサーバに送信したいという問題が発生しました.スクリプトはこのように書かれています.
私のログは一般的にこのようなものです.
jsonで変数を置換すると、文字列変数が直接置換されます.つまり、このコマンドが実際に実行するのはこれです.
このとき問題が来て、文字列には引用符があり、エスケープされていないので、jsonの内容は実際にここで止まりました.
このようなjsonがserverに送ったので、serverは拒否したに違いない..の
では、この問題はどのように解決すればいいのでしょうか.文字列変数の引用符を変換するだけでいいのです.つまり、
だから私たちがしなければならないのは、この文字列変数のすべての引用符を置き換えるといいです.置き換えると、自然にsedを思い出します.はい、sedを使うことです.あまり言わないで、直接修正したスクリプトを書きます.
はい、このように直すだけで、出したらオークになります.簡単でしょう.ハハ~
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')
はい、このように直すだけで、出したらオークになります.簡単でしょう.ハハ~