Invio di posta dalla riga di comando se il corpo non è vuoto


12

Vorrei scrivere un semplice script che mi avvisa se un registro cambia. Per questo sto usando grep per trovare le linee che mi interessano. In questo momento funziona così:

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

Il problema è che questo invia una mail anche se non viene trovata alcuna riga corrispondente. L'utilità di posta di mailutils sembra non avere alcun interruttore che gli dice di eliminare le mail che hanno un corpo vuoto.

C'è un modo semplice e veloce per farlo?

Risposte:


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

Oppure puoi trasformarlo in un processo cron e quindi se produce qualsiasi output invierà un'email agli utenti. È possibile modificare il file / etc / aliases (e quindi eseguire il comando newaliases) per inviare posta all'indirizzo non presente nella casella.

Ex della voce cron (Non sarai in grado di impostare l'oggetto thogh

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

Oppure puoi ottenere l'utility ifne - Questo è probabilmente quello che vuoi

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

Il comando ifne è disponibile dal repository epel per centos e RHEL. Non riesco a trovare un link alla pagina man online, ma è lì

ifne (1)
ifne (1)

NAME ifne: esegue il comando se l'input standard non è vuoto

SINOSSI comando ifne [-n]

DESCRIZIONE ifne esegue il comando seguente se e solo se l'input standard non è vuoto.

OPZIONI -n Funzionamento inverso. Esegui il comando se lo standard input è vuoto.

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

ESEMPIO trova. -name core | ifne mails root "File core trovati"

AUTORE Copyright 2008 di Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)

2
Nota che grep uscirà non-0 se non genera alcun output, quindi puoi fare: output = $ (grep line / var / log / file) && echo "$ output" | mail -s Log user@example.com
Sean Reifschneider,

Inoltre, il comando suggerito non invia "$ output" al comando mail. :-)
Sean Reifschneider il

Suggerirei di modificare la risposta per includere la soluzione proposta da @Sean Reifschneider
Basilio

FYI ifnesi trova nel moreutilspacchetto in Ubuntu. Sfortunatamente quel pacchetto porta anche in parallelconflitto con il parallelcomando del parallelpacchetto.
artfulrobot,

14

"man mail" mi dice che l'argomento -E interrompe l'invio di mail se il corpo è vuoto. funziona bene per me.

-E

Se un messaggio in uscita non contiene alcun testo nella sua prima o unica parte del messaggio, non inviarlo ma scartarlo in silenzio, impostando efficacemente la variabile skipemptybody all'avvio del programma. Ciò è utile per inviare messaggi da script avviati da cron (8).


3
Su Ubuntu 12.04, GNU Mailtools 2.1 è installato e l'opzione "-E" per "mail" è una scorciatoia per --exec. Non contiene un'opzione "corpo vuoto".
Mark Stosberg,

3
@MarkStosberg: Ubuntu ha diversi pacchetti alternativi che forniscono un comando mailo mailx. La bsd-mailxe heirloom-mailxpacchetti entrambi forniscono una mailxcon l' -Eopzione descritta qui.
Smylers,

1
Ha funzionato per me su CentOS 6.5:grep "find me" /var/log/something | mail -s "That text you were looking for is now in the logs" -E mail@example.com
user2208096

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.