Como silenciar a saída do tcpdump ao ler um arquivo pcap?

Como silenciar a saída do tcpdump ao ler um arquivo pcap?

Percebo que ao usar tcpdumppara ler um arquivo pcap, o tcpdumpcomando de alguma forma consegue imprimir informações em meu console mesmo quando eu redireciono STDOUT e STDERR. Como posso evitar tcpdumpa impressão de " reading from file capture, link type EN10MB (Ethernet)" toda vez que for executado?

Por exemplo, o comando a seguir imprime uma linha quando eu não esperava nenhuma:

$ tcpdump -A -r capture.pcap | grep interesting-string > /dev/null 2>&1
reading from file capture.pcap, link-type EN10MB (Ethernet)

Gostaria de evitar que essa linha apareça porque adiciona ruído desnecessário e indesejado à saída de um script. Verifiquei a página de manual e não vi uma opção para impedir que essa mensagem aparecesse. Pesquisei na web maneiras de suprimir a saída não capturada por STDOUT e STDERR e encontrei alguns resultados, mas nenhum que eu pudesse entender ou usar neste contexto.

Responder1

Eu acho que você deseja colocar o redirecionamento de saída antes do pipe, para que ele se aplique à saída do tcpdump, não ao do grep.

tcpdump -A -r capture.pcap 2>&1 | grep interesting-string > /dev/null

Responder2

Uma versão mais detalhada da resposta de Spiff:

Se você tiver um pipeline

command1 | command2

então a saída padrão do comando 1, masnãoseu erro padrão, é redirecionado para um canal que vai para a entrada padrão do comando 2.

Então, se você fizer

command1 | command2 >/dev/null 2>&1

que envia a saída padrão do comando 2 para /dev/nulle envia o erro padrão para o mesmo local onde a saída padrão foi enviada (para que também vá /dev/nullneste caso), mas não faz nada com o erro padrão do comando 1 e deixa a saída padrão do comando 1 canalizada para a entrada padrão do comando 2.

No entanto, o comando

command1 2>/dev/null | command2 >/dev/null 2>&1

enviará a saída padrão do comando 1 para a entrada padrão do comando 2, o erro padrão do comando 1 para /dev/nulle a saída padrão e erro do comando 2 para /dev/nulle o comando

command1 2>&1 | command2 >/dev/null 2>&1

enviará a saída padrão do comando 1 para a entrada padrão do comando 2, o erro padrão do comando 1 para o mesmo local que a saída padrão do comando 1 - ou seja, para a entrada padrão do comando 2 - e enviará a saída padrão e erro do comando 2 para /dev/null.

Então, por exemplo

tcpdump -A -r capture.pcap 2>&1 | grep interesting-string > /dev/null 2>&1

fará com grepque a saída padrão e o erro de tcpdump(para que ele veja a reading from file...mensagem e combine-a se a string interessante fizer parte dela) e enviará a saída padrão e o erro de grepto /dev/null, para que não produzaqualquersaída, ele deve apenas fornecer o status de saída grep(que presumo ser sua intenção, ou seja, tudo que você quer saber é se a string interessante faz parte de algum dos pacotes).

Aliás, se você estiver usando greppara descobrir se uma determinada string faz parte de sua entrada ou não, e não quiser nenhuma saída, tente usar grep -qse sua versão grepsuporta; que vai correr mais rápido, porque

  1. grepnão precisa gastar tempo de CPU gravando /dev/null;
  2. greppode encerrar assim que vir a string, então não gastará mais tempo de CPU lendo, e o tcpdump morrerá com um erro "Cano fechado" após grepencerrar eistonão gastará mais tempo de CPU ou largura de banda de disco/SSD lendo o arquivo.

(Versões mais antigas eram grepusadas -spara o mesmo propósito, mas o padrão UNIX diz que é -q, e a maioria dos sistemas UNIX e semelhantes ao UNIX fazem isso agora; GNU grep, por exemplo, usa -q.)

informação relacionada