0

在 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 行可以同时表示两件事,这取决于你如何看待事物。我认为,因为你不能将 y 与“host”关键字分开,所以将第 4 行视为第 5 行是错误的。

这背后的解析逻辑是什么?谁能解释为什么 1 == 4 == 5 以及为什么 2 != 4 和 3 != 4 ?

4

1 回答 1

1

“我认为这不直观,因此不正确。”

也许。但直觉往往是旁观者的眼睛,一个精确的规范总是比“解析器做直觉的事情”更有用。(除非你喜欢 Perl,我想。但是你需要正确的直觉。)

话虽如此,我找不到 pcap 语法的精确规范,但man pcap-filter确实解释了表达式是如何在原语与布尔运算符的组合中消除歧义的:

否定具有最高优先级。交替和串联具有相同的优先级,并且从左到右关联。

许多原语由一个关键字后跟一个标识符组成,但可以省略该关键字:

如果给出的标识符没有关键字,则假定最近的关键字。

这对分组没有影响。插入省略的关键字而不更改解析。这个例子说明了这一点:

例如,是 不应与混淆
not host vs and ace
的缩写
not host vs and host ace

not ( host vs or ace )

描述并没有真正说明的是您的示例 6 是语法错误的原因,即解析是在括号内递归执行的,因此括号表达式中的关键字不会更改“最近的关键字”。

于 2016-02-01T19:56:09.953 回答