2

私は現在このスクリプトを持っています...

#!/bin/bash
# Check NGINX
nginxstat=$(service nginx status)

# Checking Sites
hostsite="localhost:81 - "$(curl --silent --head --location --output /dev/null --write-out '%{http_code}'  http://localhost:81 | grep '^2')

##########
# Send to Slack
curl -X POST --data '{"channel":"#achannel","username":"Ansible", "attachments": [{"fallback":"NGINX Reload","pretext":"'"$HOSTNAME"'","color":"good","fields":[{"title":"nginx localhost","value":"'"$hostsite"'","short":true},{"title":"NGINX","value":"'"$nginxstat"'","short":true}]}]}' -i https://xxx.slack.com/services/hooks/incoming-webhook?token=xxx

私は試みて試みて失敗しました。nginx configtest の結果を取得してプッシュしたいと考えています。これが実行される前に nginx のリロードが開始された時点で、リロードは構成チェック自体を実行するため、構成が間違っていてもサーバーは稼働したままになります。したがって、私のnginxステータスコマンド(機能する)が表示されます

NGINX
----------------
nginx (pid  1234) is running...

しかし、構成テストで同じことを行うことはできません。これは、必要なエスケープの性質と、それが送り出す他のジャンクが原因であると予想されます

nginx: [warn] "ssl_stapling" ignored, issuer certificate not found
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
4

1 に答える 1

3

POST データに変数を埋め込む前に、変数をjqで JSON 文字列に変換します。

$ echo '"some quoted stuff"' | jq @json
"\"some quoted stuff\""

例えば:

nginxstat=$(service nginx status | jq @json)

次に、引用符なしで埋め込みます。マニュアルも参照してください。

または、JSON をエスケープしてから bash をエスケープしたい場合:

echo '"some quoted stuff"' | jq "@json | @sh"
"'\"some quoted stuff\"'"

jqが私の新しいお気に入りだと言いましたか?

http://stedolan.github.io/jq/

于 2014-10-15T16:27:04.850 に答える