tcpdump:在复合过滤器中使用 AND 和 OR

tcpdump: Using AND and OR in a compound filter

我正在尝试向 tcpdump 流添加过滤器。

我正在尝试 运行 的表达式是:

tcpdump -i eth0 -U -w - host 192.168.2.29 and (port 22222 or port 22221 or port 80)

此特定格式抛出:

bash: syntax error near unexpected token '('

我预计这会基于 THIS

以下工作没有抛出错误:

a)  tcpdump -i eth0 -U -w - host 192.168.2.29
b)  tcpdump -i eth0 -U -w - port 22222

我已经尝试了所有的关联排列都抛出相同的错误。

总结评论的答案:

处理 tcpdump 表达式的最简单方法是将其全部放在引号中,否则 shell 会在任何时候出现特殊字符时妨碍。括号是最常见的麻烦的元字符,但许多其他元字符也可以发挥作用:[ ] & 和其他,并且任何时候你改进你的表达你必须检查你没有添加一些危险的东西。

所以引号是最简单的方法:

tcpdump -i eth0 -U -w - 'host 192.168.2.29 and (port 22222 or port 22221 or port 80)'

但转义元字符也有效,并且直接响应 OP 的问题:

tcpdump -i eth0 -U -w - host 192.168.2.29 and \(port 22222 or port 22221 or port 80\)

就我个人而言,我更喜欢引号。