在tcpdump / libpcap语法中观察这些BPF过滤器行:
1: not host x or host y
2: not (host x or host y)
3: not (host x or y)
4: not host x or y
5: (not host x) or host y
6: (not host x) or y
我认为主机z与上述所有内容相匹配(除了6之外,因为它的语法无效)。 我的问题是第4行.tcpdump程序看到它等于5,但我认为这不直观,因此不正确。 第5行是明确的,第3行也是明确的。然而,第4行可以表示两种情况,具体取决于您对事物的看法。我认为,因为你不能分别看到"主持人"关键字,将第4行视为第5行是错误的。
这背后的解析逻辑是什么?谁能解释为什么1 == 4 == 5以及为什么2!= 4和3!= 4?
答案 0 :(得分:1)
"我认为这不直观,因此不正确。"
也许。但通常直觉是旁观者的眼睛,精确的规范总是比#34更有用;解析器做直观的事情"。 (除非你喜欢Perl,否则我认为。但是你需要正确的直觉。)
话虽如此,我无法找到pcap语法的精确规范,但是man pcap-filter
确实解释了如何用布尔运算符的基元组合消除表达式:
否定具有最高优先级。交替和连接具有相同的优先权,并且从左到右相关联。
许多基元由关键字后跟标识符组成,但关键字可以省略:
如果给出的标识符没有关键字,则假定使用最新的关键字。
这对分组没有影响。插入ignored关键字而不更改解析。这个例子清楚地表明了这一点:
例如,
not host vs and ace
是的not host vs and host ace
不应该与
混淆not ( host vs or ace )
描述没有真正说明的是你的例子6是语法错误的原因,即在括号内递归执行解析,因此括号表达式内的关键字不会改变&#34 ;最新的关键字"。