15

ファイルを作成する bash スクリプトがあり、最後に telnet 経由で電子メールを送信したいと考えています。ただし、実行される場合と実行されない場合があります。

最後のコマンドは

cat tempfile | telnet mail.domain.com 25

受信サーバーで、失敗すると mail.log に次のエラーが表示されます。

improper command pipelining after EHLO from domain.com ....etc

mail.domain.com の代わりに localhost で telnet セッションを開始すると、同じスクリプトが完全に機能するので、ファイル形式が問題なく、残りの bash スクリプトも機能していると確信できます。

また、パイプの代わりに標準のリダイレクトを使用してみました

telnet mail.domain.com 25 < tempfile

しかし、やはり結果は時々大丈夫です。telnet セッションが確立されて応答が返された後に入力が行われるように、リダイレクトと telnet セッション コマンドの間にわずかな遅延が必要だと思いますが、その方法がわかりません。パイプとリダイレクトの間に sleep コマンドを使用しようとしましたが、おそらく入力が sleep コマンドにリダイレクトされるため、機能しません。

e.g. cat tempfile | telnet mail.domain.com 25 & sleep 1

制限は、bash スクリプトで実行する必要があることです。出来ますか?また、それが重要かどうかはわかりませんが、スクリプトは、postfix/courier セットアップを使用して debian スクイーズでサーバー間で動作していましたが、現在、受信側は debian wheezy と postfix/dovecot でセットアップされています。

助けてくれてありがとう

4

2 に答える 2

26

次のようなものを試すことができます:

(echo -n; sleep 5; cat tempfile) | mail.domain.com 25

接続を開いて何も書き込まない場合は、5 秒待ってから残りを書き込みます。

于 2013-10-11T19:10:39.417 に答える
0

bash スクリプトでコマンドをパイプライン処理する間に遅延を挿入する方法

パイプラインごとに遅延が必要な場合は、次を使用します。

cat tempfile | { while read l ; do sleep 1; echo $l; done } | awk '{print $2}'

tempfile内容は次のとおりです。

line1 content1
line2 content2
line3 content3

上記のコマンドは次を出力します。

line1
line2
line3

各行が毎秒印刷されます。

{ while read l ; do sleep 1; echo $l; done }と呼ばれるスクリプト ファイル内に を追加して、次のdelay-piped-lineように使用することもできます。

cat tempfile | delay-piped-line | awk '{print $2}'
于 2022-01-08T02:05:09.733 に答える