Wysyłanie wiadomości z wiersza poleceń, jeśli treść nie jest pusta

12

Chciałbym napisać prosty skrypt, który ostrzega mnie, jeśli dziennik się zmieni. W tym celu używam grep, aby znaleźć linie, które mnie interesują. Teraz działa to tak:

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

Problem polega na tym, że wysyła wiadomość, nawet jeśli nie znaleziono pasujących linii. Wydaje się, że narzędzie poczty z mailutils nie ma przełącznika nakazującego upuszczanie wiadomości, które mają puste treści.

Czy istnieje szybki i łatwy sposób?

cdecker
źródło

Odpowiedzi:

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

Lub możesz przekształcić to w zadanie crona, a następnie, jeśli przyniesie ono jakieś wyniki, wyśle ​​wiadomość e-mail do użytkowników. Możesz edytować plik / etc / aliases (a następnie uruchomić polecenie newaliases), aby wysłać pocztę na adres, którego nie ma w skrzynce.

Ex of cron entry (Nie będziesz mógł ustawić tematu linii na thogh

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

Lub możesz uzyskać narzędzie ifne - prawdopodobnie tego właśnie chcesz

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

Polecenie ifne dostępne w repozytorium epel dla centos i RHEL. Nie mogę znaleźć linku do strony podręcznika online, ale jest

ifne (1)
ifne (1)

NAME ifne - Uruchom polecenie, jeśli standardowe wejście nie jest puste

SYNOPSIS polecenie ifne [-n]

OPIS ifne uruchamia następujące polecenie wtedy i tylko wtedy, gdy standardowe wejście nie jest puste.

OPCJE -n Operacja odwrotna. Uruchom polecenie, jeśli standardowe wejście jest emp.

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

PRZYKŁAD znajdź. -nazwa rdzenia | ifne mail -s „Znaleziono podstawowe pliki” root

AUTOR Copyright 2008 Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)
ckliborn
źródło
2
Zauważ, że grep zakończy działanie inne niż 0, jeśli nie wygeneruje danych wyjściowych, więc możesz zrobić: output = $ (linia grep / var / log / plik) i & echo "$ output" | mail -s Log
[email protected]
Ponadto sugerowane polecenie nie wysyła „$ output” do polecenia mail. :-)
Sean Reifschneider
Proponuję zredagować odpowiedź, aby uwzględnić proponowane rozwiązanie autorstwa @ Seana Reifschneidera
Basil A
FYI ifneznajduje się w moreutilspakiecie w Ubuntu. Niestety pakiet ten powoduje również parallelkonflikt z parallelpoleceniem z parallelpakietu.
artfulrobot
14

„man mail” mówi mi, że argument -E przestaje wysyłać maile, jeśli ciało jest puste. działa dobrze dla mnie.

-MI

Jeśli wiadomość wychodząca nie zawiera żadnego tekstu w pierwszej lub jedynej części wiadomości, nie wysyłaj jej, lecz odrzuć ją w ciszy, skutecznie ustawiając zmienną skipemptybody podczas uruchamiania programu. Jest to przydatne do wysyłania wiadomości ze skryptów uruchamianych przez cron (8).

wolxXx
źródło
3
W Ubuntu 12.04 GNU Mailtools 2.1 jest zainstalowane, a opcja „-E” dla „mail” jest skrótem dla --exec. Nie zawiera opcji „pustego ciała”.
Mark Stosberg
3
@ MarkStosberg: Ubuntu ma wiele alternatywnych pakietów udostępniających polecenie maillub mailx. bsd-mailxI heirloom-mailxpakiety zarówno dostarczenie mailxz -Eopcji opisanych tutaj.
Smylers,
1
Pracowałem dla mnie na CentOS 6.5:grep "find me" /var/log/something | mail -s "That text you were looking for is now in the logs" -E [email protected]
user2208096
0

Zobacz /unix//a/100720/27458

Wystarczy użyć ifne :

grep line /var/log/file | ifne mail -s Log email@domain.tld
Jeroen Vermeulen - MageHost
źródło