Wie kann man die tcpdump-Ausgabe beim Lesen einer pcap-Datei beruhigen?

3524
Steve HHH

Ich tcpdumpstelle fest, dass der tcpdumpBefehl beim Lesen einer pcap-Datei irgendwie dazu dient, Informationen auf meine Konsole zu drucken, selbst wenn ich sowohl STDOUT als auch STDERR umleitet. Wie kann ich verhindern, dass tcpdump" reading from file capture, link type EN10MB (Ethernet)" bei jeder Ausführung gedruckt wird ?

Beispielsweise druckt der folgende Befehl eine Zeile, wenn ich keine erwartet habe:

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

Ich möchte verhindern, dass diese Zeile angezeigt wird, da dies die Ausgabe eines Skripts unnötig und unerwünscht macht. Ich habe die Manpage überprüft und keine Option gefunden, um das Anzeigen dieser Nachricht zu verhindern. Ich habe im Internet nach Möglichkeiten gesucht, um die von STDOUT und STDERR nicht erfasste Ausgabe zu unterdrücken, und habe ein paar Treffer gefunden, die ich aber in diesem Zusammenhang nicht verstehen oder verwenden konnte.

1

2 Antworten auf die Frage

2
Spiff

Ich denke, Sie möchten die Umleitung der Ausgabe vor die Pipe setzen, damit sie für die Ausgabe von tcpdump gilt, nicht für grep.

tcpdump -A -r capture.pcap 2>&1 | grep interesting-string > /dev/null 
Oh, es scheint klar und offensichtlich zu sein, dass du es sagst. Ich danke dir sehr. (-: Steve HHH vor 10 Jahren 0
1

Eine ausführlichere Version der Antwort von Spiff:

Wenn Sie eine Pipeline haben

command1 | command2 

dann wird die Standardausgabe von Befehl 1, jedoch nicht deren Standardfehler, in eine Pipe umgeleitet, die zur Standardeingabe von Befehl 2 führt.

Also wenn du es tust

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

Das sendet die Standardausgabe von Befehl 2 an /dev/nullund sendet den Standardfehler an dieselbe Stelle, an die auch die Standardausgabe gesendet wurde (so dass sie auch /dev/nullin diesem Fall gesendet wird), aber mit dem Standardfehler von Befehl 1 wird nichts unternommen, und lässt die Standardausgabe von Befehl 1 an die Standardeingabe von Befehl 2 weitergeleitet.

Der Befehl jedoch

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

sendet die Standardausgabe von Befehl 1 an die Standardeingabe von Befehl 2, den Standardfehler von Befehl 1 an /dev/nullund die Standardausgabe und den Fehler von Befehl 2 an /dev/nullsowie den Befehl

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

sendet die Standardausgabe von Befehl 1 an die Standardeingabe von Befehl 2, den Standardfehler von Befehl 1 an dieselbe Stelle wie die Standardausgabe von Befehl 1 - dh an die Standardeingabe von Befehl 2 - und sendet die Standardausgabe und fehler von befehl 2 zu /dev/null.

Also zum Beispiel

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

bewirkt grep, dass sowohl die Standardausgabe als auch der Fehler von angezeigt wird tcpdump(also wird die reading from file...Nachricht angezeigt und wenn die interessante Zeichenfolge Teil davon ist), und es wird die Standardausgabe und der Fehler von grepan gesendet /dev/null, sodass keine erzeugt werden sollte Ausgabe, sollte es nur den Exit-Status von geben grep(was ich vermute, ist Ihre Absicht, dh Sie möchten nur wissen, ob der interessante String Teil eines der Pakete ist).

BTW, wenn Sie grepherausfinden möchten, ob eine bestimmte Zeichenfolge Teil der Eingabe ist oder nicht und keine Ausgabe wünschen, versuchen Sie es mit, grep -qwenn Ihre Version von es grepunterstützt. das wird schneller laufen, weil

  1. grepmuss keine CPU-Zeit zum Schreiben aufbringen /dev/null;
  2. grepEs wird möglicherweise beendet, sobald die Zeichenfolge erkannt wird, sodass keine weitere CPU-Zeit zum Lesen benötigt wird, und tcpdump stirbt nach dem grepBeenden mit dem Fehler "Closed Pipe", und es wird keine weitere CPU-Zeit oder Festplatte / SSD verwendet Lesen der Bandbreite aus der Datei.

(Ältere Versionen von grepwerden -sfür denselben Zweck verwendet, aber der UNIX-Standard gibt an -q, dass dies der Fall ist, und die meisten UNIX- und UNIX-ähnlichen Systeme machen das jetzt; GNU grepbeispielsweise verwendet dies -q.)