为什么 sudo 中的 #include 和 #includedir 指令以井号 (#) 字符为前缀

Lam*_*ert 46 sudo

在设置sudo环境时,我注意到 include 指令以井号 (#) 字符为前缀。

Solaris 将此显示为:

## Read drop-in files from /etc/sudoers.d
## (the '#' here does not indicate a comment)
#includedir /etc/sudoers.d
Run Code Online (Sandbox Code Playgroud)

手册(Linux 和 Solaris)指出:

在 sudoers 中包含其他文件 可以使用 #include 和 #includedir 指令从当前正在解析的 sudoers 文件中包含其他 sudoers 文件。

和:

其他特殊字符和保留字井号 (`#') 用于表示注释(除非它是 #include 指令的一部分,或者除非它出现在用户名的上下文中并后跟一个或多个数字,在这种情况下,它被视为 uid)。注释字符和它之后的任何文本,直到行尾,都将被忽略。

有人知道为什么选择在#includeand#includedir指令中使用磅字符吗?

作为旁注:我经常使用类似的东西egrep -v '^#|^$' configfile来获取非默认/活动配置的设置,这显然不适用于该sudoers文件。

Gil*_*il' 43

#include于 2004年添加。它必须与已经存在的东西兼容。不过,我认为include /path/to/file这不会有歧义,但解析起来可能有点困难,因为解析器必须区分include /path/to/file(include 指令) 和include = foo(允许用户include运行命令foo)。

但我认为主要的原因是看起来像 C 预处理器,手册明确引用了它作为灵感。

  • 我第一次分析我的 `sudoers` 文件时,我认为 `include` 是一个指令,而 `#include` 是一个指令 *注释掉*。最不意外的规则被严重违反了。在我看来,这是糟糕的设计。 (12认同)
  • @KamilMaciorowski 这还不错。这是灾难性的!我尝试在 includeir 之前删除哈希标签,但我突然无法再使用 sudo 了。我在 Ubuntu 服务器上,没有其他方法获得 root 权限。结果是完全重新安装(幸运的是,损坏的操作系统只是全新安装) (3认同)

小智 5

附带说明:我经常使用 egrep -v '^#|^$' 配置文件来获取非默认/活动配置的设置,这显然不适用于 sudoers 文件。

这将从sudo 版本 1.9.1 开始作为对 的支持,@include并且@includedir已添加以使其“不那么令人困惑”

添加对@include 和@includedir 的支持

当哈希字符也是注释字符时,它们比 #include 和 #includedir 更容易混淆。

与之前使用的纯词法分析器方法相反,此提交还添加了对包含指令的真正解析。因此,现在可以通过使用双引号字符串或使用反斜杠转义空格字符来包含带有空格的文件。

保留使用#include#includedir是为了与 1.9.1 之前的版本兼容。