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.
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
10*** 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
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).
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]
ifne
é encontrado nomoreutils
pacote no ubuntu. Infelizmente, esse pacote também trazparallel
conflitos com oparallel
comando doparallel
pacote."man mail" me diz que o argumento -E para de enviar e-mails se o corpo estiver vazio. funciona bem para mim.
fonte
mail
oumailx
. Os pacotesbsd-mailx
eheirloom-mailx
fornecemmailx
a-E
opção descrita aqui.grep "find me" /var/log/something | mail -s "That text you were looking for is now in the logs" -E [email protected]
Consulte /unix//a/100720/27458
Basta usar ifne :
fonte