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

12

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

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

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

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

cdecker
источник

Ответы:

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

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

Ex of cron entry (Вы не сможете установить строку темы, хотя

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

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

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

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

ifne (1)
ifne (1)

NAME ifne - Запустить команду, если стандартный ввод не пуст

SYNOPSIS ifne [-n] команда

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

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

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

ПРИМЕР НАЙТИ. ядро | ifne mail -s "Основные файлы найдены" root

АВТОР Copyright 2008 Хавьер Мерино

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)
ckliborn
источник
2
Обратите внимание, что grep будет выходить не из 0, если он не генерирует вывод, поэтому вы можете сделать следующее: output = $ (grep line / var / log / file) && echo "$ output" | Почтовый журнал user@example.com
Шон
Кроме того, предложенная вами команда не отправляет «$ output» команде mail. :-)
Шон Рейфшнайдер
Я бы предложил отредактировать ответ, включив в него предложенное решение @Sean Reifschneider
Basil A
FYI ifneнаходится в moreutilsпакете в Ubuntu. К сожалению, этот пакет также приводит к parallelконфликту с parallelкомандой из parallelпакета.
artfulrobot
14

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

-E

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

wolxXx
источник
3
В Ubuntu 12.04 установлен GNU Mailtools 2.1, а для опции «mail» есть опция «-E» для --exec. Он не содержит опцию «пустое тело».
Марк Стосберг
3
@MarkStosberg: в Ubuntu есть несколько альтернативных пакетов, предоставляющих команду mailили mailx. bsd-mailxИ heirloom-mailxпакеты и обеспечивают mailxс -Eопцией описанной здесь.
Smylers
1
Работал у меня на CentOS 6.5:grep "find me" /var/log/something | mail -s "That text you were looking for is now in the logs" -E mail@example.com
user2208096