Sudo

為什麼 sudo 中的 #include 和 #includedir 指令以井號 (#) 字元為前綴

  • July 24, 2020

在設置sudo環境時,我注意到 include 指令以井號 (#) 字元為前綴。

Solaris 將其顯示為:

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

該手冊(Linux 和 Solaris)指出:

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

和:

其他特殊字元和保留字 井號 (`#’) 用於表示註釋(除非它是 #include 指令的一部分,或者除非它出現在使用者名的上下文中並且後跟一個或多個數字,在這種情況下,它被視為 uid)。註釋字元和它之後的任何文本,直到行尾,都被忽略。

有誰知道為什麼選擇在#includeand#includedir指令中使用井號字元?

作為旁注:我經常使用類似egrep -v '^#|^$' configfile的東西來獲取非預設/活動配置設置,這顯然不適用於sudoers文件。

#include於 2004 年加入。它必須與已經存在的東西兼容。不過,我認為include /path/to/file這不會模棱兩可,但解析起來可能會有點困難,因為解析器必須區分include /path/to/file(include directive) 和include = foo(allow user includeto run the command foo)。

但我認為主要是因為它看起來像 C 預處理器,手冊明確引用它作為靈感。

作為旁注:我經常使用 egrep -v ‘^#|^$’ 配置文件來獲取非預設/活動配置設置,這顯然不適用於 sudoers 文件。

這將從sudo 版本 1.9.1開始支持,@include@includedir已添加以使其“不那麼混亂”

添加對@include 和@includedir 的支持

當雜湊字元也是註釋字元時,它們比 #include 和 #includedir 更容易混淆。

與之前使用的純詞法分析器方法相比,此送出還添加了對包含指令的真實解析。因此,現在可以通過使用雙引號字元串或使用反斜杠轉義空格字元來包含帶空格的文件。

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

引用自:https://unix.stackexchange.com/questions/244064