Відправлення пошти з командного рядка, якщо тіло не порожнє


12

Я хотів би написати простий сценарій, який попереджає мене про зміну журналу. Для цього я використовую grep, щоб знайти рядки, які мене цікавлять. Зараз це працює так:

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

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

Чи існує швидкий і простий спосіб зробити це?

Відповіді:


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

Або ви можете перетворити це на роботу cron, і тоді, якщо він видасть будь-який вихід, він надішле електронну пошту користувачам. Ви можете відредагувати файл / etc / aliases (а потім виконати команду newaliases), щоб надіслати пошту на адресу, яка не знаходиться у полі.

Наприклад, запис про хрон (Ви не зможете встановити сюжетну лінію

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

Або ви можете отримати утиліту ifne - це, мабуть, те, що ви хочете

рядок grep / var / log / file | ifne mail -s Увійдіть email@domain.tld

Команда ifne використовує його з epel repo для 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 Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)

2
Зауважте, що grep вийде з не-0, якщо він не генерує вихід, тож ви можете зробити: output = $ (grep line / var / log / file) && echo "$ output" | mail -s Log user@example.com
Шон Рейфшнайдер

Також запропонована команда не надсилає "$ output" поштовій команді. :-)
Шон Рейфшнайдер

Я б запропонував редагувати відповідь, щоб включити пропоноване рішення від @Sean Reifschneider
Василь A

FYI ifneзнаходиться в moreutilsпакеті ubuntu. На жаль, цей пакет також приносить parallelконфлікт із parallelкомандою з цього parallelпакету.
artfulrobot

14

"man mail" повідомляє мені, що аргумент -E припиняє надсилати пошту, якщо тіло порожнє. добре працює для мене.

Якщо вихідне повідомлення не містить жодного тексту в першій чи єдиній частині повідомлення, не надсилайте його, а відкидайте його мовчки, ефективно встановлюючи змінну skipemptybody при запуску програми. Це корисно для надсилання повідомлень із скриптів, запущених cron (8).


3
На Ubuntu 12.04 встановлено GNU Mailtools 2.1, а в опції "-E" для "пошти" є скорочення для --exec. Він не містить опції "порожнє тіло".
Марк Стосберг

3
@MarkStosberg: Ubuntu має кілька альтернативних пакетів, що забезпечують команду mailабо mailx. bsd-mailxІ heirloom-mailxпакети і забезпечують mailxз -Eопцією описаної тут.
Сміллери

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.