2017-02-10 3 views
3

(多分それは「tcpflow」の問題である)のgrepは

を動作しませんそして、私は、監視のHTTPトラフィックにスクリプトを記述し、私はtcpflowをインストールを作品

にそれをgrepする(とあなたは一例curl www.163.com

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | grep '^Host: ' 

それは継続的にこの(のような出力)

012のために、HTTPリクエストを行う必要があります

が、私は

動作しないパイプを使い続けることができない(何も出力)

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | grep '^Host: ' | cut -b 7- 

(何も出力)は動作しません

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | grep '^Host: ' | grep H 

私はsudo tcpflowcat foo.txtに置き換え、それは動作します:

cat foo.txt | grep '^Host: ' | grep H 

パイプやgrepやtcpflowの何が問題なのですか?


更新:

これが私の最後のスクリプトです:https://github.com/zhengkai/config/blob/master/script/monitor_outgoing_http.sh

+0

'sudoのtcpflow -p -c -i eth0のポートの出力80 2は何ですか>/dev/null | grep '^ Host:' '? – Inian

+0

@Inian今質問に追加します –

+0

どのように失敗しますか?出力はありませんか? –

答えて

4

私は

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | stdbuf -o0 grep '^Host: ' 

で、問題が原因のstdio bufferingは、あなたがgrepを呼び出す前にGNU stdbufを使用する必要があると思います-o0は、基本的に出力(stdout)のストリームを意味しますtcpflowはバッファリングされません。デフォルトの動作は自動的に対象にこのnice detailを参照してくださいstdbuf


1を使用してオーバーライドするものであるパイプラインで次のコマンドに送る前に4096のバイトのチャンクへデータをバッファリングすることになります。

+1

ラインバッファリング( '-oL')はこのコンテキストではまあまあですが(grepは行全体に作用します)、少し速くなければなりません。 – Fred

6

連続ストリームの使用grep--line-bufferedオプション:出力の

sudo tcpflow -p -c -i eth0 port 80 2> /dev/null | grep --line-buffered '^Host' 

--line-バッファリング

使用ラインバッファリング。これはパフォーマンス上のペナルティを引き起こす可能性があります。


、バッファ出力に関するいくつかの反射(stdbufツールも言及されている):

Pipes, how do data flow in a pipeline?

+1

良い提案。これが何をしているのか、なぜこの文脈で違いがあるのか​​を説明することは有益かもしれません。 – Fred