Envoi de courrier à partir de la ligne de commande si le corps n'est pas vide

12

Je voudrais écrire un script simple qui m'alerte si un journal change. Pour cela, j'utilise grep pour trouver les lignes qui m'intéressent. En ce moment, cela fonctionne comme ceci:

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

Le problème est que cela envoie un e-mail même si aucune ligne correspondante n'est trouvée. L'utilitaire de messagerie de mailutils ne semble pas avoir de commutateur lui demandant de supprimer les messages dont le corps est vide.

Existe-t-il un moyen rapide et facile de le faire?

cdecker
la source

Réponses:

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

Ou vous pouvez en faire un travail cron, puis s'il produit une sortie, il enverra un e-mail aux utilisateurs. Vous pouvez modifier le fichier / etc / aliases (puis exécuter la commande newaliases) pour envoyer du courrier à l'adresse qui n'est pas sur la boîte.

Ex entrée cron (vous ne pourrez pas définir la ligne d'objet thogh

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

Ou vous pouvez obtenir l'utilitaire ifne - c'est probablement ce que vous voulez

ligne grep / var / log / fichier | ifne mail -s Log [email protected]

L'ifne le commande disponible auprès du repo epel pour centos et RHEL. Je ne trouve pas de lien vers la page de manuel en ligne mais le voici

ifne (1)
ifne (1)

NOM ifne - Exécute la commande si l'entrée standard n'est pas vide

SYNOPSIS ifne [-n], commande

DESCRIPTION ifne exécute la commande suivante si et seulement si l'entrée standard n'est pas vide.

OPTIONS -n Fonctionnement inverse. Exécutez la commande si l'entrée standard est vide.

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

EXEMPLE trouver. -name core | ifne mail -s "Core files found" root

AUTEUR Copyright 2008 par Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)
ckliborn
la source
2
Notez que grep quittera non-0 s'il ne génère aucune sortie, vous pouvez donc faire: output = $ (ligne grep / var / log / fichier) && echo "$ output" | mail -s Log [email protected]
Sean Reifschneider
De plus, votre commande suggérée n'envoie pas "$ output" à la commande mail. :-)
Sean Reifschneider
Je suggère de modifier la réponse pour inclure la solution proposée par @Sean Reifschneider
Basil A
FYI ifnese trouve dans le moreutilspaquet dans ubuntu. Malheureusement, ce package apporte également des parallelconflits avec la parallelcommande du parallelpackage.
artfulrobot
14

"man mail" me dit que l'argument -E arrête l'envoi de mails si le corps est vide. fonctionne bien pour moi.

-E

Si un message sortant ne contient aucun texte dans sa première ou sa seule partie de message, ne l’envoyez pas, mais jetez-le en silence, définissant efficacement la variable skipemptybody au démarrage du programme. Ceci est utile pour envoyer des messages à partir de scripts démarrés par cron (8).

wolxXx
la source
3
Sur Ubuntu 12.04, GNU Mailtools 2.1 est installé, et l'option "-E" pour "mail" est un raccourci pour --exec. Il ne contient pas d'option "corps vide".
Mark Stosberg
3
@MarkStosberg: Ubuntu propose plusieurs packages alternatifs fournissant une commande mailor mailx. Les bsd-mailxet heirloom-mailxpaquets fournissent tous les deux une mailxavec l' -Eoption décrite ici.
Smylers
1
A travaillé pour moi sur 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

Voir /unix//a/100720/27458

Utilisez simplement ifne :

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