在我的办公室防火墙中,我使用如下命令:
$ sudo tcpdump -v -s 1500 -i eth0 port 25 | grep 'smtp: S'
监控发送邮件的LAN客户端(我需要从某个客户端提前发现任何可能的垃圾邮件机器人,我们有非常宽松的安全策略,这里......: - ()。
到目前为止,非常好:任何客户发送电子邮件后我都会连续输出。
但是,如果我添加一些过滤器来获得更清晰的输出,就像这样:
$ sudo tcpdump -v -s 1500 -i eth0 port 25 | grep 'smtp: S' | perl -pe 's/(.*?\)) (.*?)\.\d+ \>(.*)/$2/'
(这里我打算只获取源ip /名称),直到tcpdump输出超过(bash?)缓冲区大小...(或者至少我想是这样......),我才得到任何输出。 / p>
使用'sed'代替'perl'没有任何变化......
任何提示连续输出过滤数据的提示?
答案 0 :(得分:4)
将stdbuf
放在第一个命令之前:
sudo stdbuf -o0 tcpdump ...
答案 1 :(得分:2)
但是,如果我添加一些过滤器来获得更清晰的输出,就像 这样:
使用--line-buffered
的{{1}}选项:
grep
答案 2 :(得分:0)
尝试使用sed --unbuffered
(或有时像AIX上的-u
)来获得蒸汽版本(不等待EOF)