Enviar correo desde la línea de comando si el cuerpo no está vacío
12
Me gustaría escribir un script simple que me avise si cambia un registro. Para esto estoy usando grep para encontrar las líneas que me interesan. En este momento funciona así:
grep line /var/log/file | mail -s Log email@domain.tld
El problema es que esto envía un correo incluso si no se encuentran líneas coincidentes. La utilidad de correo de mailutils parece no tener ningún interruptor que le indique que deje caer los correos que tienen un cuerpo vacío.
output=$(grep line /var/log/file);[[-n "$output"]]&& mail -s Log email@domain.tld
O puede convertir esto en un trabajo cron y luego, si produce algún resultado, enviará un correo electrónico a los usuarios. Puede editar el archivo / etc / aliases (y luego ejecutar el comando newaliases) para enviar correo a la dirección que no está en el cuadro.
Ex de la entrada cron (no podrá establecer la línea de asunto thogh
10*** grep line /var/log/file
O puede obtener la utilidad ifne: esto es probablemente lo que desea
El comando ifne está disponible desde el repositorio de epel para centos y RHEL. No puedo encontrar un enlace a la página del manual en línea, pero ahí está
ifne (1)
ifne (1)
NOMBRE ifne: ejecuta el comando si la entrada estándar no está vacía
SINOPSIS comando ifne [-n]
DESCRIPCIÓN ifne ejecuta el siguiente comando si y solo si la entrada estándar no está vacía.
OPCIONES -n Operación inversa. Ejecute el comando si la entrada estándar es vacía.
Note that if the standard input is not empty, it is passed
through ifne in this case.
EJEMPLO encontrar. -nombre núcleo | ifne mail -s "Archivos principales encontrados" root
Tenga en cuenta que grep saldrá fuera de 0 si no genera salida, por lo que podría hacer: output = $ (grep line / var / log / file) && echo "$ output" | mail -s Log [email protected]
Sean Reifschneider
Además, su comando sugerido no envía "$ output" al comando de correo. :-)
Sean Reifschneider
Sugeriría editar la respuesta para incluir la solución propuesta por @Sean Reifschneider
Basil A
FYI ifnese encuentra en el moreutilspaquete en ubuntu. Desafortunadamente, ese paquete también trae parallelconflictos con el parallelcomando del parallelpaquete.
artfulrobot
14
"man mail" me dice que el argumento -E deja de enviar correos si el cuerpo está vacío. funciona bien para mi
-MI
Si un mensaje saliente no contiene ningún texto en su primera o única parte del mensaje, no lo envíe, deséchelo en silencio, configurando efectivamente la variable skipemptybody al inicio del programa. Esto es útil para enviar mensajes desde scripts iniciados por cron (8).
En Ubuntu 12.04, GNU Mailtools 2.1 está instalado, y la opción "-E" para "mail" es una abreviatura de --exec. No contiene una opción de "cuerpo vacío".
Mark Stosberg
3
@ MarkStosberg: Ubuntu tiene múltiples paquetes alternativos que proporcionan un comando mailo mailx. Los paquetes bsd-mailxy heirloom-mailxambos proporcionan un mailxcon la -Eopción descrita aquí.
Smylers
1
Trabajó para mí en 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 encuentra en elmoreutils
paquete en ubuntu. Desafortunadamente, ese paquete también traeparallel
conflictos con elparallel
comando delparallel
paquete."man mail" me dice que el argumento -E deja de enviar correos si el cuerpo está vacío. funciona bien para mi
fuente
mail
omailx
. Los paquetesbsd-mailx
yheirloom-mailx
ambos proporcionan unmailx
con la-E
opción descrita aquí.grep "find me" /var/log/something | mail -s "That text you were looking for is now in the logs" -E [email protected]
Ver /unix//a/100720/27458
Solo usa ifne :
fuente