web-dev-qa-db-ja.com

本文が空でない場合にコマンドラインからメールを送信する

ログが変更された場合に警告する簡単なスクリプトを書きたいのですが。このため、私はgrepを使用して、関心のある行を見つけています。今のところ、次のように機能します。

grep line /var/log/file | mail -s Log [email protected]

問題は、一致する行が見つからなくてもメールを送信することです。 mailutilsのメールユーティリティには、本文が空のメールをドロップするように指示するスイッチがないようです。

そうするための迅速で簡単な方法はありますか?

12
cdecker
output=$(grep line /var/log/file); [[ -n "$output" ]] && mail -s Log [email protected]

または、これをcronジョブにして、出力を生成する場合は、ユーザーに電子メールを送信します。/etc/aliasesファイルを編集して(そしてnewaliasesコマンドを実行して)、ボックスにないアドレスにメールを送信できます。

Cronエントリの例(件名を設定することはできません。

1 0 * * *  grep line /var/log/file

または、ifneユーティリティを入手できます-これはおそらくあなたが望むものです

grep行/ var/log/file | ifne mail -sログ[email protected]

Ifneは、centosとRHELのepelリポジトリから使用できるように命令します。オンラインでmanページへのリンクが見つかりませんが、そこにあります

ifne(1)
ifne(1)

名前ifne-標準入力が空でない場合にコマンドを実行します

構文ifne [-n]コマンド

説明ifneは、標準入力が空でない場合にのみ、次のコマンドを実行します。

オプション-n逆の操作。標準入力が空の場合、コマンドを実行します。

          Note  that  if  the  standard  input  is not empty, it is passed
          through ifne in this case.

例を見つける。 -nameコア| ifneメール-s「コアファイルが見つかりました」ルート

著者Copyright 2008 by Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)
12
ckliborn

「man mail」は、引数-Eが本文が空の場合にメールの送信を停止することを教えてくれます。私にとってはうまくいきます。

-E

送信メッセージの最初または唯一のメッセージ部分にテキストが含まれていない場合は、送信せずにメッセージを破棄して、プログラムの起動時にskipemptybody変数を効果的に設定します。これは、cron(8)によって開始されたスクリプトからメッセージを送信するのに役立ちます。

14
wolxXx

参照 https://unix.stackexchange.com/a/100720/27458

ifneを使用するだけです:

grep line /var/log/file | ifne mail -s Log [email protected]