2016-11-05 7 views
0

シェルスクリプトを使用してスラック通知を作成しようとしました。JSONとシェルスクリプトのエラー

JSONパラメータは、MySqlクエリで取得される変数によって形成されます。 --data「{ "ユーザー名": "OTRS"、」:私はこのスクリプトを実行すると、私はその

カール-X POST -H 'アプリケーション/ JSONコンテンツタイプ' のような何かを得る

#!/bin/sh 
#MySQL RO Access 
host='mysqlserver.com' 
userdb='slackro' 
password='password' 
db='db' 
#Slack information 
hook='https://hook.slack' 
user='slackusr' 
channel='o_channel' 
emoji='slackusr' 

#Query 
id=`mysql -D $db -u $userdb -p$password -e 'SELECT id FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d'` 
tn=`mysql -D $db -u $userdb -p$password -e 'SELECT tn FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d'` 
title=`mysql -D $db -u $userdb -p$password -e 'SELECT title FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d' | sed "s/'/ /g" | sed "s/°//g" | sed "s/ /_/g" ` 
customer=`mysql -D $db -u $userdb -p$password -e 'SELECT customer_id FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d'` 
msj=`mysql -D $db -u $userdb -p$password -e 'SELECT a_body FROM article WHERE ticket_id ='$id' ORDER BY id DESC LIMIT 1' -h $host | sed -e '1d'` 
url='http://iiabox.infra.ultra.sur.top/otrs/index.pl?Action=AgentTicketZoom;TicketID'$1 

#Message 
curl -X POST -H 'Content-type: application/json' --data '{"username": "slackusr","icon_emoji": ":slackusr:","attachments": [{"fallback": "New Ticket","pretext": "New ticket from '$customer'","title": "'$title'","title_link": "'$url'","text": "'$msj'","color": "#006495"}]}' $hook 

":":slackusr: "、"添付ファイル ":[{"フォールバック ":"新しいチケット "、"口実 ":"新しいチケット[email protected] "、"タイトル ":" Prueba 'NotNotificación' 6"、 "title_link": "http://site/otrs/index.pl?Action=AgentTicketZoom;TicketID2016110472000067"、 "テキスト": "セラード"、 "色": "#006495"}]}」https://hooks.slack.com/ カール:デ カール:(6(6)ホストを解決できませんでした。 )ホストを解決できませんでした:xn - notificacin-zeb curl:( 3)I印刷$場合は変数$タイトルの結果は、その「Prueba 'デNotificación' 6"

を示し、なぜ私は理解していない列152

で比類のない近いブレース/ブラケットを[グロブ]エコーを伴うタイトル変数私は"Prueba deNotificación6"を取得します。最初のスペースの前と最後のスペースの後には簡単な引用符はありません。

どうすればよいですか?

+1

このコードには深刻なセキュリティに影響を与えるバグがあります。誰かがチケット番号「1」または「1」==「1」またはチケット番号「 '」を付けるとどうなると思いますか? DROP TABLEチケット。 - '? –

+1

JSONを安全に作成するには、文字列の連結(正しい引用の責任を負う)ではなく、構文を理解する 'jq 'などのツールを使用します。 –

+1

...シェル側の他のバグについては、http://shellcheck.net/を参照してください。 –

答えて

1

最初に:このコードは全体として修復を超えて壊れています。本番環境では使用しないでください。実際にうまく行っている言語で書き直してください(セキュリティバグを修正できるようにバインド変数をサポートするSQLライブラリと、コンテンツを常に正確に引用できるようにするJSONライブラリがあります)。

あなたの当面の問題に関しては、言っ

-

を使用すると、単一引用符で囲まれたコンテキストでこれを行うたび:

"title": "'$title'", 

...あなたは$customer引用符で囲まれていないを拡大しています展開された値の中のスペースは、シェルによる単語分割とグロブ展開に使用されます。

代わりに、それを作る:

"title": "'"$title"'" 

...単一引用符で囲まれたコンテキストを終了した後、二重引用符で囲まれたコンテキストを開きます。

関連する問題