[BASH] Ausgabeumleitung bei tcpdump funktioniert nicht

Hi, Ich habe ein Problem, was ich irgendwie nicht ganz verstehe.

Bei diesem Befehl:
tcpdump host 192.168.0.100 and tcp port 80 -s 1024 -A | egrep '(GET /|^Host: )'
bekomme ich diese Ausgabe, wenn ich google.de besuche:
Code:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 1024 bytes
...%>b..GET / HTTP/1.1
Host: www.google.de
13 packets received by filter
0 packets dropped by kernel

Wenn ich allerdings versuche, die Ausgabe in eine Datei umzuleiten, landet nichts in der Datei, und die Ausgabe sieht etwa so aus:
Code:
# tcpdump host 192.168.0.100 and tcp port 80 -s 1024 -A | egrep '(GET /|^Host: )' > dump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 1024 bytes
^C59 packets captured
59 packets received by filter
0 packets dropped by kernel

Hat vielleicht jemand 'ne Ahnung woran das liegen könnte?
Mein Betriebssystem ist Debian, meine Bash-Version 3.2-4, tcpdump: 3.9.8-4
 
Könnte sein, dass tcpdump in den stderr datenstrom ausgibt. Versuch mal den Datenstrom von stderr(2) in stdout(1) umzuleiten:
$ befehl 2>&1

in deinem Fall:
tcpdump host 192.168.0.100 and tcp port 80 -s 1024 -A 2>&1 | egrep '(GET /|^Host: )'
 
Funktioniert leider nicht :(
(Hätte mich auch gewundert, schließlich kommt auch das "59 packets received by filter" an Grep vorbei)
Kann dieses Problem eigentlich jemand nachvollziehen oder bin ich der einzige, der es hat?
 
Ich hab die commandline 1:1 auf meinem Debian system ausgeführt und mal google angefragt:
Code:
root@provex:/# tcpdump host 192.168.1.3 and tcp port 80 -s 1024 -A 2>&1 | egrep '(GET /|^Host: )'
.j"ZX...GET / HTTP/1.1
Host: google.de
.j"..k..GET / HTTP/1.1
Host: www.google.de
root@provex:/#
Wenn ich das "2>&1" weg mache, hab ich auch das von dir beschriebene Problem. Diese Datenstromumleitungen sind manchmal was strange.
Wenn du noch nachträglich die commandline ein wenig modifiziert hast, kann es sein, dass es deshalb nicht mehr funzt. Das Problem hatte ich auch mal. Deshalb: Poste mal bitte deine Konsolen Ausgabe inkl. deinem Befehl, den du jetzt ausprobiert hast. Ich vermute, dass da der Wurm irgendwo steckt.

/edit: oder hast du vll. das "2>&1" dem egrep aus versehen angehängt? Das würde das auch noch erklären...

Mein system:
Code:
root@provex:/# bash --version
GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
root@provex:/# tcpdump --version
tcpdump version 3.9.5
libpcap version 0.9.5
 
Mein Befehl ist jetzt
Code:
tcpdump host 192.168.0.103 and tcp port 80 -s 1024 -A 2>&1 | egrep '(GET /|^Host: )' > dump
Das Dump-File und die Ausgabe sind jeweils leer.
Das Problem ist aber auch mit Umleitung an z.B. sed das gleiche:
Code:
tcpdump host 192.168.0.103 and tcp port 80 -s 1024 -A 2>&1 | egrep '(GET /|^Host: )' | sed 's/E//g'
Wieder wird nichts ausgegeben.
Nur mit Umleitung an grep funktioniert es aber. ?(
Code:
# tcpdump host 192.168.0.103 and tcp port 80 -s 1024 -A 2>&1 | egrep '(GET /|^Host: )'
.{......GET / HTTP/1.1
Host: www.google.de
.{.*...IGET /intl/de_de/images/logo.gif HTTP/1.1
Host: www.google.de
.{.M....GET /images/nav_logo3.png HTTP/1.1
Host: www.google.de
 
Hab selbst grad mal viel rumgespielt und gemerkt, dass speziell grep in dem Fall wohl die Probleme verursacht.
Du musst bei egrep noch die Option "--line-buffered" mit angeben. Damit hat es bei mir dann plötzlich funktioniert (mit dem anderen (standard) grep-Ausgabemodus scheint bash nicht klar zu kommen und alle daten verschwinden im Datennirvana ;) ).
Code:
tcpdump host 192.168.0.103 and tcp port 80 -s 1024 -A 2>&1 | egrep --line-buffered '(GET /|^Host: )' > dump
Mit der line-buffered-Option lassen sich die Daten auch ganz normal durch weitere Pipes oder Umleitungen verarbeiten.

Achtung: sed macht genau den gleichen misst! Da heißt die option -u oder --unbuffered
Code:
tcpdump host 192.168.0.103 and tcp port 80 -s 1024 -A 2>&1 | egrep --line-buffered '(GET /|^Host: )' | sed  --unbuffered 's/E//g' > dump
gruß
Fate-Man
 
cool danke
Google war mir nicht so froh gestimmt, dass ich was brauchbares gefunden hätte ^^

Hmm auf den ersten Blick sieht es so aus, als wäre tcpdump auch ein Übeltäter, der als Option noch "-l" benötigt. Seltsam, dass es trotzdem funktioniert.
Naja solange es funzt... ;)
 
Zurück
Oben