
Percebo que ao usar tcpdump
para ler um arquivo pcap, o tcpdump
comando de alguma forma consegue imprimir informações em meu console mesmo quando eu redireciono STDOUT e STDERR. Como posso evitar tcpdump
a 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/null
e envia o erro padrão para o mesmo local onde a saída padrão foi enviada (para que também vá /dev/null
neste 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/null
e a saída padrão e erro do comando 2 para /dev/null
e 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 grep
que 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 grep
to /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 grep
para descobrir se uma determinada string faz parte de sua entrada ou não, e não quiser nenhuma saída, tente usar grep -q
se sua versão grep
suporta; que vai correr mais rápido, porque
grep
não precisa gastar tempo de CPU gravando/dev/null
;grep
pode 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ósgrep
encerrar eistonão gastará mais tempo de CPU ou largura de banda de disco/SSD lendo o arquivo.
(Versões mais antigas eram grep
usadas -s
para 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
.)