用tshark greping一个tcpdump

时间:2013-11-30 23:34:39

标签: bash grep pipeline tcpdump

我正在尝试编写一个“脏”网站过滤器 - 例如用户想要访问色情网站(基于域名)

基本上,我有类似

的东西
#!/bin/bash
sudo tshark -i any tcp port 80 or tcp port 443 -V | grep "Host.*keyword"

它很好但现在我需要在找到某些东西后做一些操作(iptables和DROPing数据包...)。我得到的问题是tcp转储仍在运行。如果我有一个包含数据的完整文件,那么我想要达到的目标很容易解决。

在pseudocoude中,我希望有类似的东西:

if (tshark and grep found something)
    iptables - drop packets 
    sleep 600 # a punishment for an user
    iptables accept packets I was dropping
else 
    still look for a match in the tcp dump that's still running

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

也许您可以尝试以下内容:

tshark OPTIONS 2>&1 | grep --line-buffered PATTERN | while read line; do
    # actions for when the pattern is found, the matched input is in $line
    break
done

2>&1非常重要,这样当PATTERN匹配且while循环终止时,由于管道损坏,tshark无处可写并终止。

如果您希望tshark继续运行并分析未来的输出,只需删除break即可。这样,while循环永远不会终止,并且它会继续从tshark读取过滤后的输出。