(也许是“tcpflow”问题)

我编写了一个脚本来监视HTTP流量,并先安装tcpflow,然后安装grep

可以工作(并且您应该发出http请求,例如curl www.163.com)

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

它这样输出(连续)
Host: config.getsync.com
Host: i.stack.imgur.com
Host: www.gravatar.com
Host: www.gravatar.com

但我不能继续使用管道

不起作用(无输出)
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 tcpflow替换cat foo.txt时,它可以工作:
cat foo.txt | grep '^Host: ' | grep H

那么pipe或grep或tcpflow怎么了?

更新:

这是我的最终脚本:https://github.com/zhengkai/config/blob/master/script/monitor_outgoing_http.sh

最佳答案

我认为问题是因为存在 stdio buffering ,您需要在调用GNU stdbuf之前使用grep

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

使用-o0,基本上意味着stdout的输出(tcpflow)流将不被缓冲。默认行为是在发送到管道中的下一个命令之前自动将数据缓冲到40961个字节块中,这是使用stdbuf覆盖的


1.将此nice detail引用到主题中。

08-07 13:10