我正在尝试向流添加过滤器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)
我已经尝试了关联的每种排列都抛出相同的错误。
总结一下答案的评论:
处理 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)
就我个人而言,我更喜欢引用。