.forward and procmail

forwardとprocmail関係で少しもめた(?)のでメモ。

“|IFS=’ ‘ && exec /usr/bin/procmail -Yf- || exit 75 #username”
“|exec /usr/bin/mailfilter | /usr/bin/procmail -Yf- || exit 75”

などなどの違いと意味について。以下、smtpdの中身の議論の際は、postfixのみを想定。

1. IFSって何

IFS = Internal Field Separatorの略

bashなどのシェルでの引数展開の際の参照変数(環境変数?)となる。で、変更するとセキュリティー問題を引き起こす、という警告をどこかのマニュアルで見たような。

2. そもそも||とか&&って何

|| : 前のコマンドの終了ステータスが0でない(異常終了)のときに実行
&& : 前のコマンドの終了ステータスが0のときに実行

ということで、普通のシェルを実行するときのと同じですな。どちみち、forwardを解釈するlocalは、global/pipe_commandに投げるので、fork/execするだけだったりしますが。場所としてはlocal/deliver_command()関数。

3. exit 75は?

posix shellでのexitステータスコード75は、EX_TEMPFAILで、一時エラーを意味する。まぁ、もう一度実行したら成功するかもねぇ~、と、呼び出しもとのコマンドにいう、という感じ。

/usr/include/sysexits.h:#define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */

localでは、投げつけたコマンドからの戻り値などは、global/pipe_commandの最後でPIPE_STAT_*になったものを受け取って判断する、ので、終了ステータスがどう反映されるかは、ここを見る必要がある。

4. 最後の #username

大昔のsendmailでは、これをつけておかなければ、というか、.forwardの中身が同じ場合に、ユーザの区別がつかなくなる、というバグが存在したバージョンもあった。らしい。(けど、遭遇したことはない。)

なので、今は不要。

まぁ、mail.infoとかのログには出るから(ほかのコマンド部分と一緒に)、管理者が障害追跡するときには使える?って、そんなところを見るくらいなら、普通にmail idとかで追跡したほうが早いと思うけど。。

5. execつけるかつけないか

通常の意味でのfork/execでの動作と同じなんでしょうね。

“| exec xxxx”にしておけば、|で起動されたシェル(?)がそのままxxxxをexecするのでプロセスは新規に作らなくていい、という利点がある。まぁ、なくてもあってもfork分を除いたら動作は同じなので、、どちらでも、という気はする。

わからなければ、新しくターミナルを起動して*から* (←重要)、”exec ls”とか、”exec ls -a | ls”とかを実行してみるとわかると思う。たぶん。

大量にメールを処理するサーバだと困るよね、というけど、copy-on-writeだから昔ほどではないでしょうし。。(かといって、入れないのを推奨するわけではないが。)

Leave a Reply »