(也许是" 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
那么管道或grep或tcpflow出了什么问题呢?
更新
这是我的最终剧本:https://github.com/zhengkai/config/blob/master/script/monitor_outgoing_http.sh
答案 0 :(得分:8)
要grep
连续信息流使用--line-buffered
选项:
sudo tcpflow -p -c -i eth0 port 80 2> /dev/null | grep --line-buffered '^Host'
<强> - 行缓冲强>
在输出上使用线缓冲。这可能会导致性能下降。
还提到了有关缓冲输出(stdbuf
工具)的一些反思:
答案 1 :(得分:5)
我认为问题是由于stdio buffering
,您需要在调用GNU stdbuf
之前使用grep
,
sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | stdbuf -o0 grep '^Host: '
使用-o0
,它基本上意味着来自stdout
的输出(tcpflow
)流将是无缓冲的。默认行为是在发送到管道中的下一个命令之前自动将数据缓冲到4096 1 字节块中,这是使用stdbuf
覆盖的内容
<子> 1.将此nice detail引用到主题中。 子>