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

Filter tcpdump:在复合过滤器中使用AND和OR,filter,tcpdump,Filter,Tcpdump,我正在尝试向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 '(' 我希望这能在我的基础上起作用 在不引发错误的情况下执行以下操作: a) tcpdump -i eth0 -U -w - host 192.168.2.

我正在尝试向
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 '('
我希望这能在我的基础上起作用

在不引发错误的情况下执行以下操作:

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\)

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

不高兴的是壳牌公司。在parens.nope之前添加\它仍然会抛出错误。我试着用\插入和打断两行。我也试着把整件事作为一个单独的参数封装起来。没有乐趣。错误消息本身告诉您这是bash问题。交替地将整个表达式(以“host”开头)放在引号中。引号完成了这一操作——保留引号可以使整个表达式作为单个参数传递。谢谢。使用引号可能是最简单和最普遍的,但可以肯定的是,shell以前也这么做过。我测试了相同的
tcpdump
命令,并正确引用了它:
tcpdump-iem1-U-w-host 192.168.2.29和\(端口22222或端口22221或端口80\)
。你的环境有些不同。。。