web-dev-qa-db-ja.com

procmailを使用してメッセージを変数に取り込む方法

RANCIDインストールによってログに記録された変更をログに記録して、社内の通信ブロードキャストシステムに送信しようとしています。私はnetcatを介してこれと直接話すことができます、例えばこれはうまくいくでしょう:

echo "Hello world" | netcat localhost 12345

RANCIDは変更を電子メールで送信するため、procmailを使用してこれらの電子メールを傍受し、ローカルのPastebinに送信してから、応答(URLを含む)をnetcatにパイプしようとしています。

このフロー全体をコマンドラインで次のように複製できます。

testmail=$(cat testmail.txt)
URL=$(curl --silent -d "text=$testmail" -d "title=Logged Activity" http://paste/api/create) && echo "RANCID logged some changes: $URL" | netcat localhost 12345

これが現時点での私の.procmailrcです。

## store the body in MESSAGE
:0 b
MESSAGE=|

##Send that message to Wirehive Pastebin
:0
| URL=$(curl -d "text=$MESSAGE" -d "title=Logged Activity" http://paste/api/create) && echo "RANCID logged some changes: $URL" | netcat localhost 12345

メールログを確認すると、メールルーティングは正常に機能しています。ファイルがすべてコメントアウトされ、受信ユーザーのメールボックスをmuttで確認すると、メッセージが届くことがわかります。ファイルのコメントが解除されると、メッセージはメールボックスに表示されないため、.procmailrcが処理され、メッセージがメールに渡されます。

これがUbuntu12.04にあることはおそらく注目に値します。

1
SimonJGreen

MESSAGE割り当ては、作成した方法では機能しません。これを試して:

:0b
MESSAGE=| cat

さらに、URL=...割り当ては有効なコマンドではありません。レシピの範囲外になるように変数の割り当てをリファクタリングする必要があります。

URL=`curl --silent -d "text=$testmail" -d "title=Logged Activity" http://paste/api/create`
:0
| echo "RANCID logged some changes: $URL" | netcat localhost 12345

...または、シェルを呼び出させることで、通常はSHELLMETASの1つを追加することで、機能させることができます。

:0  # notice semicolon at end
| URL=$(curl -d "text=$MESSAGE" -d "title=Logged Activity" http://paste/api/create) \
  && echo "RANCID logged some changes: $URL" | netcat localhost 12345 ;

...しかし、私は実際には前者の、より読みやすい代替案が好きです。

どういうわけかcurlコマンドラインをリファクタリングして標準入力を読み取り、標準出力に書き込むことができれば、少なくとも個別のMESSAGE変数を回避するために、場合によってはさらにエレガントにすることができます。ワンライナーにリファクタリングされます。

1
tripleee