Wie kann ich nur den HTTP-Header von tshark zurückgeben?

12

Ich benutze tshark, um meine Pakete zu schnüffeln, und ich beschäftige mich nur mit dem http-Header (vorzugsweise in der Form, in der er gesendet wurde, aber ich nehme, was ich bekommen kann).

Ich habe versucht:

tshark tcp port 80 or tcp port 443 -V -R "http"

Das gab mir den Header, aber auch den Inhalt (was ich nicht möchte, da es eine große Menge Müll zum Parsen ist). Ich kümmere mich wirklich nur um den Header. Gibt es eine einfache Möglichkeit, genau das zu erreichen (außer die Daten selbst zu analysieren)?

Bearbeiten: Ich sollte mich qualifizieren. Ich interessiere mich auch für Host / Port, damit ich Anfragen über mehrere Pakete hinweg verfolgen kann.

tzenes
quelle

Antworten:

18

Sie können die spezifischen HTTP-Header-Anzeigefilter verwenden, um entweder nur die Anforderungsheader, nur die Antwortheader oder beides anzuzeigen.

Nur für die Anforderungsheader:

tshark tcp port 80 or tcp port 443 -V -R "http.request"

Nur für die Antwortheader:

tshark tcp port 80 or tcp port 443 -V -R "http.response"

Und sowohl für die Anforderungs- als auch für die Antwortheader:

tshark tcp port 80 or tcp port 443 -V -R "http.request || http.response"

Hinweis: Dies filtert nicht nur die Header heraus, sondern nur die Pakete, die die Header enthalten, sodass Sie wahrscheinlich immer noch einige Daten erhalten, aber die Datenmenge sollte geringer sein als sonst.

schwer
quelle
Wir sprechen immer noch über eine Menge Daten, als hätte ich eine Anfrage für en.wikipedia.org. Ich bekomme 750.000 zurück, wenn ich wirklich nur weniger als 1.000 in Headern haben möchte.
tzenes
tshark ist ein Paket - Capture - Tool, möchten Sie vielleicht in etwas aussehen Fiddler oder einem anderen HTTP-only - Analyse - Tool.
Heavyyd
Ich bin mit Fiddler nicht vertraut, aber mein Ziel ist es, den Verbindungsdurchsatz zu verfolgen. Daher möchte ich die Anforderungszeit / das erste Byte / das letzte Byte kennen, während die HTTP-Header beibehalten werden. tshark löst bereits den größten Teil meines Problems, ich muss nur die Header bekommen.
Tzenes
3
Es wird "tshark: Ungültiger Erfassungsfilter" (Tshark 2.0.2) erzeugt. Als Workaround habe ich verwendet:tshark -V -Y http.request tcp port 80 or tcp port 443
jfs
5

In der Tat können Sie! Alle vorherigen Antworten waren sehr nah. Alles, was Sie brauchen, ist ein -OFlag, das alle Informationen außer HTTP herausfiltert.

tshark -O http -R http.request tcp port 80 or tcp port 443
Denis Bazhenov
quelle
1
Dies ist die richtige Antwort.
Florin Andrei
3

Ich konnte die Antwort von @heavyd kombinieren und durch einen Sed-Filter laufen lassen, den ich aus einem SO-Artikel erhalten habe - (FJs Antwort), um dieses Baby zu kochen, das nur die Überschriften herausfiltert :)

sudo tshark tcp port 80 or tcp port 443 -V -R "http.request || http.response" | sed -rn '/Hypertext Transfer Protocol/{:a;N;/    \\r\\n:?/{/.*/p;d};ba}' >> /tmp/filtered
Quickshiftin
quelle
1
erschreckend sed weil ich es nicht lesen kann aber wie ein Zauber gearbeitet hat.
Setheron
2

Meine eigene Filterversion zum einfachen Lesen:

tshark -V -R "tcp.port ==80 && (http.request || http.response)" | awk "/Hypertext Transfer Protocol/,/Frame/ { print };/Transmission Control Protocol/{print};/Internet Protocol/{print}" | grep -v Frame

Auf diese Weise sehe ich nur relevante IP- und TCP-Informationen, ohne all das Low-Level-Zeug sowie die vollständigen HTTP-Informationen.

Miquel Adrover
quelle
sudo tshark -V -s0 Port 80 -Y "(http.request || http.response)" | awk "/ Hypertext Transfer Protocol /, / ^ $ /"
Lmwangi