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?
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
10*** 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
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).
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]
ifne
se trouve dans lemoreutils
paquet dans ubuntu. Malheureusement, ce package apporte également desparallel
conflits avec laparallel
commande duparallel
package."man mail" me dit que l'argument -E arrête l'envoi de mails si le corps est vide. fonctionne bien pour moi.
la source
mail
ormailx
. Lesbsd-mailx
etheirloom-mailx
paquets fournissent tous les deux unemailx
avec l'-E
option décrite ici.grep "find me" /var/log/something | mail -s "That text you were looking for is now in the logs" -E [email protected]
Voir /unix//a/100720/27458
Utilisez simplement ifne :
la source