Enviar email da linha de comando se o corpo não estiver vazio

12

Eu gostaria de escrever um script simples que me avise se um log for alterado. Para isso, estou usando o grep para encontrar as linhas nas quais estou interessado. No momento, funciona assim:

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

O problema é que isso envia um email mesmo que nenhuma linha correspondente seja encontrada. O utilitário de email do mailutils parece não ter opção para que ele solte emails com um corpo vazio.

Existe uma maneira rápida e fácil de fazer isso?

cdecker
fonte

Respostas:

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

Ou você pode transformar isso em um trabalho cron e, se produzir alguma saída, enviará um email aos usuários. Você pode editar o arquivo / etc / aliases (e executar o comando newaliases) para enviar email para o endereço que não está na caixa.

Ex da entrada do cron (você não poderá definir a linha de assunto como

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

Ou você pode obter o utilitário ifne - provavelmente é isso que você deseja

linha grep / var / log / arquivo | ifne mail -s Log [email protected]

O comando ifne está disponível no repositório epel para centos e RHEL. Não consigo encontrar um link para a página de manual online, mas aí está

ifne (1)
ifne (1)

NAME ifne - Executar comando se a entrada padrão não estiver vazia

SINOPSE comando ifne [-n]

DESCRIÇÃO ifne executa o seguinte comando se e somente se a entrada padrão não estiver vazia.

OPÇÕES -n Operação reversa. Execute o comando se a entrada padrão estiver correta.

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

EXEMPLO encontrar. -name core | ifne mail -s "Arquivos principais encontrados" root

AUTOR Copyright 2008 por Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)
ckliborn
fonte
2
Observe que o grep sairá diferente de 0 se não gerar saída; portanto, você pode fazer: output = $ (linha grep / var / log / arquivo) && echo "$ output" | mail -s Log usuá[email protected]
Sean Reifschneider 15/01
Além disso, seu comando sugerido não envia "$ output" para o comando mail. :-)
Sean Reifschneider
Eu sugeriria editar a resposta para incluir a solução proposta por @Sean Reifschneider
Basil A
FYI ifneé encontrado no moreutilspacote no ubuntu. Infelizmente, esse pacote também traz parallelconflitos com o parallelcomando do parallelpacote.
precisa
14

"man mail" me diz que o argumento -E para de enviar e-mails se o corpo estiver vazio. funciona bem para mim.

-E

Se uma mensagem de saída não contiver texto na primeira ou única parte da mensagem, não a envie, mas a descarte silenciosamente, configurando efetivamente a variável skipemptybody na inicialização do programa. Isso é útil para enviar mensagens de scripts iniciados por cron (8).

wolxXx
fonte
3
No Ubuntu 12.04, o GNU Mailtools 2.1 está instalado, e a opção "-E" para "mail" existe uma abreviação para --exec. Não contém a opção "corpo vazio".
Mark Stosberg
3
@ MarkStosberg: O Ubuntu possui vários pacotes alternativos que fornecem um comando mailou mailx. Os pacotes bsd-mailxe heirloom-mailxfornecem mailxa -Eopção descrita aqui.
Smylers
1
Trabalhei para mim no 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

Consulte /unix//a/100720/27458

Basta usar ifne :

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