Senden von E-Mails über die Befehlszeile, wenn der Text nicht leer ist

12

Ich möchte ein einfaches Skript schreiben, das mich benachrichtigt, wenn sich ein Protokoll ändert. Dafür benutze ich grep, um die Zeilen zu finden, die mich interessieren. Im Moment funktioniert es so:

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

Problem ist, dass dies eine Mail sendet, auch wenn keine passenden Zeilen gefunden werden. Das Mail-Dienstprogramm von mailutils scheint keinen Schalter zu haben, der es anweist, Mails mit leerem Text zu löschen.

Gibt es eine schnelle und einfache Möglichkeit, dies zu tun?

cdecker
quelle

Antworten:

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

Oder Sie können dies zu einem Cron-Job machen. Wenn dann eine Ausgabe erstellt wird, werden die Benutzer per E-Mail benachrichtigt. Sie können die Datei / etc / aliases bearbeiten (und dann den Befehl newaliases ausführen), um E-Mails an Adressen zu senden, die nicht in der Box enthalten sind.

Ex of cron entry (Die Betreffzeile kann nicht eingestellt werden

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

Oder Sie können das Hilfsprogramm ifne herunterladen. Dies ist wahrscheinlich das, was Sie möchten

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

Das ifne Kommando gibt es aus dem Epel Repo für Centos und RHEL. Ich kann keinen Link zur Online-Manpage finden, aber dort ist er

ifne (1)
ifne (1)

NAME ifne - Befehl ausführen, wenn die Standardeingabe nicht leer ist

ÜBERSICHT ifne [-n] Befehl

BESCHREIBUNG ifne führt den folgenden Befehl genau dann aus, wenn die Standardeingabe nicht leer ist.

OPTIONEN -n Rückwärtsbetrieb. Führen Sie den Befehl aus, wenn die Standardeingabe leer ist.

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

BEISPIEL finden. -name core | ifne mail -s "Core-Dateien gefunden" root

AUTOR Copyright 2008 von Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)
ckliborn
quelle
2
Beachten Sie, dass grep nicht 0 beendet, wenn keine Ausgabe generiert wird. Sie können also Folgendes tun: output = $ (grep line / var / log / file) && echo "$ output" | mail -s Log [email protected]
Sean Reifschneider
Ihr vorgeschlagener Befehl sendet auch nicht "$ output" an den E-Mail-Befehl. :-)
Sean Reifschneider
Ich würde vorschlagen, die Antwort so zu bearbeiten, dass sie die vorgeschlagene Lösung von @Sean Reifschneider
Basil A vom
FYI ifneist im moreutilsPaket in Ubuntu zu finden. Leider bringt dieses Paket auch parallelKonflikte mit dem parallelBefehl aus dem parallelPaket mit sich.
Artfulrobot
14

"man mail" sagt mir, dass das Argument -E das Versenden von Mails anhält, wenn body leer ist. funktioniert gut für mich.

-E

Wenn eine ausgehende Nachricht in ihrem ersten oder einzigen Nachrichtenteil keinen Text enthält, senden Sie sie nicht, sondern verwerfen Sie sie unbeaufsichtigt, wodurch die Variable skipemptybody beim Programmstart wirksam wird. Dies ist nützlich, um Nachrichten von Skripten zu senden, die von cron (8) gestartet wurden.

wolxXx
quelle
3
Unter Ubuntu 12.04 ist GNU Mailtools 2.1 installiert, und die Option "-E" für "mail" enthält eine Abkürzung für --exec. Es enthält keine Option "leerer Körper".
Mark Stosberg
3
@ MarkStosberg: Ubuntu hat mehrere alternative Pakete, die einen mailoder mailx-Befehl liefern . Die bsd-mailxund heirloom-mailxPakete bieten beide eine mailxmit der -EOption hier beschrieben.
Smylers
1
Arbeitete für mich auf 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

Siehe /unix//a/100720/27458

Verwenden Sie einfach ifne :

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