Назад | Перейти на главную страницу

Отправка почты из командной строки, если тело не пусто

Я хотел бы написать простой скрипт, который предупреждает меня, если журнал изменяется. Для этого я использую grep, чтобы найти интересующие меня строки. Сейчас это работает так:

grep line /var/log/file | mail -s Log email@domain.tld

Проблема в том, что при этом отправляется письмо, даже если совпадающие строки не найдены. У почтовой утилиты из mailutils, похоже, нет переключателя, указывающего ей отбрасывать письма с пустым телом.

Есть ли быстрый и простой способ сделать это?

"man mail" сообщает мне, что аргумент -E останавливает отправку писем, если тело пусто. у меня отлично работает.

-E

Если исходящее сообщение не содержит текста в первой или единственной части сообщения, не отправляйте его, а отбрасывайте без уведомления, эффективно устанавливая переменную skipemptybody при запуске программы. Это полезно для отправки сообщений из скриптов, запускаемых cron (8).

output=$(grep line /var/log/file); [[ -n "$output" ]] && mail -s Log email@domain.tld

Или вы можете превратить это в задание cron, а затем, если оно произведет какие-либо результаты, оно отправит пользователям электронное письмо. Вы можете отредактировать файл / etc / aliases (а затем запустить команду newaliases), чтобы отправлять почту на адрес, не указанный в поле.

Например, запись в cron (Вы не сможете установить тему письма, хотя

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

Или вы можете получить утилиту ifne - это, вероятно, то, что вы хотите

grep строка / var / log / file | ifne mail -s Журнал email@domain.tld

Команда ifne доступна из репозитория epel для centos и RHEL. Я не могу найти ссылку на страницу руководства в Интернете, но вот она

ифне (1)
ифне (1)

ИМЯ ifne - Выполнить команду, если стандартный ввод не пуст

ОБЗОР ifne [-n] команда

ОПИСАНИЕ ifne выполняет следующую команду тогда и только тогда, когда стандартный ввод не пуст.

ОПЦИИ -n Обратная операция. Выполните команду, если стандартный ввод пуст.

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

ПРИМЕР найти. -name core | ifne mail -s "Основные файлы найдены" корень

АВТОР Авторские права 2008 г., Хавьер Мерино

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)

Видеть https://unix.stackexchange.com/a/100720/27458

Просто используйте ifne:

grep line /var/log/file | ifne mail -s Log email@domain.tld