5

bash スクリプトで curl を使用して、プッシュオーバー経由で通知を送信しようとしています。curl -Fただし、改行を正しく解釈することはできません。

curl -s \
-F "token=TOKEN" \
-F "user=USER" \
-F "message=Root Shell Access on HOST \n `date` \n `who` " \
https://api.pushover.net/1/messages.json > NUL

私はもう試した:

\n 
\\\n 
%A0

ファイル経由ではなく、メッセージを直接プッシュしたいと思います。

4

1 に答える 1

6

curlはバックスラッシュのエスケープを解釈しないため、参照する引数に実際の改行を挿入する必要がありますcurl。つまり、シェル (bashこの場合) に を解釈させる\nか、実際の改行を挿入する必要があります。

Posix 標準シェルは C エスケープを のように解釈しません\nが、標準のユーティリティ コマンドprintfは解釈します。ただし、bashそれを行う方法を提供します。引用形式では、$'...'C スタイルのバックスラッシュ エスケープはインタープリターになります。それ以外の場合は、 と$'...'同じよう'...'に動作するため、パラメーターとコマンドの置換は行われません。

ただし、シェルを含むすべてのシェルbashでは、引用符内に改行を含めることができ、改行はそのまま渡されます。したがって、次のように書くことができます。

curl -s \
     -F "token=$TOKEN" \
     -F "user=$USER" \
     -F "message=Root Shell Access on $HOST
$(date)
$(who)
" \
     https://api.pushover.net/1/messages.json > /dev/null

(注: 元のコマンドから欠落していると思われるパラメーター展開を挿入しcurl、非推奨のバッククォート コマンド置換を推奨される$(...)形式に変更しました。)

上記のように、リテラル改行を含めることの唯一の問題は、外観を気にする場合、インデントが台無しになることです。したがって、bash の$'...'形式を好む場合があります。

curl -s \
     -F "token=$TOKEN" \
     -F "user=$USER" \
     -F "message=Root Shell Access on $HOST"$'\n'"$(date)"$'\n'"$(who)" \
     https://api.pushover.net/1/messages.json > /dev/null

これも少し読みにくいですが、完全に合法です。シェルでは、セグメント間に空白がない限り、単一の引数 (「単語」) を任意の数の引用符付きまたは引用符なしのセグメントで構成できます。ただし、変数を事前定義することで、複数の引用符の構文を回避できます。

NL=$'\n'
curl -s \
     -F "token=$TOKEN" \
     -F "user=$USER" \
     -F "message=Root Shell Access on $HOST$NL$(date)$NL$(who)" \
     https://api.pushover.net/1/messages.json > /dev/null

最後に、printfそのスタイルに慣れている場合は、標準のユーティリティを使用できます。

curl -s \
     -F "token=$TOKEN" \
     -F "user=$USER" \
     -F "$(printf "message=Root Shell Access on %s\n%s\n%s\n" \
                  "$HOST" "$(date)" "$(who)")" \
     https://api.pushover.net/1/messages.json > /dev/null
于 2014-05-29T15:14:49.350 に答える