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

Bil*_*ong 7 filter tcpdump

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

我试图运行的表达式是:

tcpdump -i eth0 -U -w - host 192.168.2.29 and (port 22222 or port 22221 or port 80)
Run Code Online (Sandbox Code Playgroud)

这种特殊的格式会抛出:

bash: syntax error near unexpected token '('
Run Code Online (Sandbox Code Playgroud)

我预计这会基于THIS起作用。

以下工作不会引发错误:

a)  tcpdump -i eth0 -U -w - host 192.168.2.29
b)  tcpdump -i eth0 -U -w - port 22222
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*edl 9

总结一下答案的评论:

处理 tcpdump 表达式的最简单方法是将其全部放在引号中,否则 shell 会在出现特殊字符时妨碍操作。括号是最常见的麻烦元字符,但许多其他元字符也可以使用:[ ] &以及其他元字符,并且每当您改进表达式时,您都必须检查是否添加了危险的内容。

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

tcpdump -i eth0 -U -w - 'host 192.168.2.29 and (port 22222 or port 22221 or port 80)'
Run Code Online (Sandbox Code Playgroud)

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

tcpdump -i eth0 -U -w - host 192.168.2.29 and \(port 22222 or port 22221 or port 80\)
Run Code Online (Sandbox Code Playgroud)

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

  • 还!在 `zsh` 中,您可以在像 `((` 这样的参数中加倍不带引号的括号,然后它仍然有效: `tcpdump -i eth0 -U -w - host 192.168.2.29 and ((port 22222 or port 22221 or port 80))`...我发现这比反斜杠或引号更好输入,因为它不需要我将手指移动到许多不同的特殊字符。遗憾的是,这只适用于“zsh”。 (2认同)