Http
帶有 tcpdump 的 http 標頭的人類可讀格式
我想在 Linux 機器上查看從 Apache(監聽埠 80)發送到 Tomcat(埠 4080)的 HTTP 標頭。
根據維基百科,
標頭欄位是明文字元串格式的以冒號分隔的名稱-值對。
我嘗試了以下
tcpdump
命令的一些變體:$ sudo tcpdump -lnX dst port 4080 -c 10 11:29:28.605894 IP SOME_IP.33273 > SOME_IP.4080: P 0:49(49) ack 1 win 23 <nop,nop,timestamp 1191760962 509391143> 0x0000: 4500 0065 3a9f 4000 3f06 0084 628a 9ec4 E..e:.@.?...b... 0x0010: 628a 9c97 81f9 0ff0 9e87 eee0 144b 90e1 b............K.. 0x0020: 8018 0017 fb43 0000 0101 080a 4708 d442 .....C......G..B 0x0030: 1e5c b127 4845 4144 202f 6461 7070 6572 .\.'HEAD./dapper 0x0040: 5f73 6572 7669 6e67 2f41 644d 6f6e 6b65 _serving/AdMonke 0x0050: 793f y?
結果總是一樣的 - 亂碼和英語單詞(例如
HEAD
)的奇怪混合。如何以人類可讀的格式查看標題?
這是我想出的用於顯示請求和響應 HTTP 標頭的單行程式碼
tcpdump
(這也適用於您的情況):sudo tcpdump -A -s 10240 'tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | egrep --line-buffered "^........(GET |HTTP\/|POST |HEAD )|^[A-Za-z0-9-]+: " | sed -r 's/^........(GET |HTTP\/|POST |HEAD )/\n\1/g'
它限制在 10Kb 處切斷數據包,並且只知道 GET、POST 和 HEAD 命令,但這在大多數情況下應該足夠了。
編輯:修改它以在每一步都擺脫緩衝區,使其更具響應性。不過現在需要 Perl 和 stdbuf,所以如果沒有這些,請使用原始版本: 編輯:將腳本埠目標從 80 更改為 4080,以實際偵聽已經通過 apache 的流量,而不是直接外部流量到達埠80:
sudo stdbuf -oL -eL /usr/sbin/tcpdump -A -s 10240 "tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" | egrep -a --line-buffered ".+(GET |HTTP\/|POST )|^[A-Za-z0-9-]+: " | perl -nle 'BEGIN{$|=1} { s/.*?(GET |HTTP\/[0-9.]* |POST )/\n$1/g; print }'
一些解釋:
- sudo stdbuf -oL -eL 使 tcpdump 執行行緩衝
- tcpdump 魔法過濾器在這裡詳細解釋:https ://stackoverflow.com/questions/11757477/understanding-tcpdump-filter-bit-masking
- grep 正在尋找任何帶有 GET、HTTP/ 或 POST 的行;或任何看起來像標題的行(字母和數字後跟冒號)
- *BEGIN{$|=1}*導致 perl 執行行緩衝
- s/.?(GET |HTTP/$$ 0-9. $$* |POST )/\n$1/g*在每個新請求或響應的開始之前添加一個換行符