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.

¿Hay una manera rápida y fácil de hacerlo?

cdecker
fuente

Respuestas:

12
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

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

O puede obtener la utilidad ifne: esto es probablemente lo que desea

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

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

AUTOR Copyright 2008 por Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)
ckliborn
fuente
2
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).

wolxXx
fuente
3
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]
user2208096
0

Ver /unix//a/100720/27458

Solo usa ifne :

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