Que comando posso usar para procurar logs do sendmail por TODOS os detalhes da mensagem envolvendo um destinatário específico.

4

CENTOS 5.x | Sendmail

Ocasionalmente, preciso pesquisar nos logs de entrega do sendmail para descobrir o que aconteceu com uma mensagem ausente. Isso geralmente envolve dois (ou mais) passos:

ETAPA 1: Pesquise / var / log / maillog para o endereço de e-mail do usuário. Por exemplo, grep -i "[email protected]" / var / log / maillog

Isso geralmente retorna algo assim:

  Jan 11 07:43:34 server-example sendmail[12732]: p937blksdh3: to=<[email protected]>, delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=102537, relay=mta.recipientdomain.com. [12.34.56.78], dsn=5.7.1, stat=Service unavailable

PASSO 2: Eu vou pegar o nome da mensagem única (neste caso, p937blksdh3) e procurar por isso. Por exemplo: grep -i p937blksdh3 / var / log / maillog

Quero combinar as etapas 1 e 2 em uma linha única e fazer com que ela execute automaticamente a mesma pesquisa para outras ids. Então, em um único comando, gostaria de fazer o seguinte:

  1. Procure o sendmail maillog para uma string específica.
  2. Identifique o ID da mensagem (no exemplo acima, isso foi p937blksdh3) para o email. (Eu estou supondo que o awk '{print $}' seria usado?)
  3. Pesquise o mesmo log, mas procure pelo id da mensagem (basicamente grep -i p937blksdh3 / var / log / maillog no exemplo acima)
  4. Envie os resultados da etapa 3. Repita isso para outros ids de mensagem.
por Mike B 28.02.2012 / 22:50

4 respostas

7

Você poderia fazer algo semelhante a isso.

for i in 'grep -i "[email protected]" /var/log/maillog | awk '{print $5}''; do grep -i $i /var/log/maillog; done

Isto irá mostrar a linha para o usuário que você está procurando, então selecione o quinto item na linha (separado por espaços iirc). Em seguida, para cada ID de mensagem nessa lista, será feito um grep para as linhas que contêm os IDs da mensagem.

Se você quiser remover o: do final do ID da mensagem, você pode fazer algo como     para i em grep -i "[email protected]" /var/log/maillog | awk '{print $5}' | sed 's/\:// ; do grep -i $ i / var / log / maillog; feito

Espero que ajude.

    
por 29.02.2012 / 00:41
2

Esta não é uma resposta direta ao seu problema específico (Harry respondeu já), mas apenas um pensamento para planejar com antecedência se você precisar de tais informações com freqüência. Instale MIMEDefang e, em seguida, tenha o filter_recipient registra todas as informações que você precisa no formato mais adequado para você.

    
por 29.02.2012 / 07:49
2

Este é um refinamento da resposta de Harry.

Primeiro, o awk pode fazer combinações de padrões como grep, então você pode pular o primeiro grep. Além disso, você pode obter duplicatas, para que possamos removê-las com a ordenação -u:

for i in 'awk '/[email protected]/ {print $6}' /var/log/maillog | sort -u '; do grep -i $i /var/log/maillog; done

Esta versão usa dois passes através do registro de e-mail:

awk '/[email protected]/ {print $6}' /var/log/maillog | sort -u > /tmp/message-ids.list
grep -f /tmp/message-ids.list /var/log/maillog

Na primeira versão, o loop for irá percorrer mail.log para quantos ids de mensagens forem encontrados no log. Na segunda versão, o grep usará a lista de ids de mensagens como um filtro e processará o arquivo de log apenas uma vez, o que será mais eficiente para um arquivo de log grande.

    
por 09.09.2013 / 20:10
1

Não há razão para canalizar grep para awk , pois o AWK pode fazer o trabalho do grep. Também não há razão para usar um loop for , pois grep pode aceitar padrões em sua entrada padrão.

awk '/[email protected]/ {print $6}' /var/log/maillog | sort -u  | grep -i -f - /var/log/maillog

Você pode modificar isso ainda mais, removendo a necessidade de sort -u (na verdade, sort é desnecessário - você poderia ter usado uniq )

awk '/[email protected]/ {addr[$6]} END {for (a in addr) {print addr[a]}}' /var/log/maillog | grep -i -f - /var/log/maillog

Ambos (e as outras respostas) fazem a pesquisa em dois ou mais passes sobre o arquivo de log. Seria interessante ver se a técnica de uma passagem a seguir seria mais rápida (e mais rápida ainda usando Perl ou Python).

awk -v addr='[email protected]' '$0 ~ addr {
         ids[$6]
     }
     {
         for (id in ids) {
             if ($0 ~ "^" ids[id] "$") {
                 print
             }
         }
     }
     $NF == "Completed" {
         delete ids[$1]
     }' /var/log/maillog

Eu não testei esse código. Você pode precisar ajustar os números dos campos, particularmente na seção que apaga o id quando a entrada de log "Completed" é encontrada. Ele pode ser facilmente transformado em uma única linha.

    
por 10.09.2013 / 03:37