问题描述
每次我希望能够运行需要我成为 sudoer
太多次的东西时,我需要用谷歌搜索 /etc/sudoers
的格式,以再次提醒我正确的编写方法是什么。
现在我在我的 sudoers
文件中看到了不同的写作风格,这是几个月来谷歌搜索结果不同的结果。我还注意到第二个示例(如下)似乎在 XFCE 中有效,但在 Cinnamon(Gnome 3)中无效。这可能完全不相关,但我还是想一劳永逸地知道,sudoer 行的正确语法是什么,给定示例之间有什么区别?
redsandro ALL=NOPASSWD:/path/to/command
redsandro ALL=(ALL) NOPASSWD:/path/to/command
redsandro ALL=(ALL:ALL) NOPASSWD:/path/to/command
另外,所有 ALL
的用途是什么?一个用户,一个命令,但我需要使用 ALL
关键字最多 3 次?我做错了吗?
当然,省略 NOPASSWD:
会使您在被允许运行命令之前输入密码,但有一点令人困惑的是 =
和 :
的用法,因为作为该行主题的最终命令可以由 =
前缀, :
、 或
)
,混淆了相似语义的语法。
最佳答案
它不仅仅是一个用户和一个命令:
redsandro host=(user:group) tag:commands
-
host
指定此行有效的主机名。除非您在需要不同规则的不同主机之间共享 asudoers 文件,否则使用特殊值ALL
意味着 “all hosts” 是一个不错的选择。 -
user
指定可以使用-u
选项运行命令的用户。如果您省略此选项,则无法使用-u
选项。 -
group
指定可以与-g
选项一起使用的组。如果省略它,则不能使用-g
选项。
user
和 group
都将特殊值 ALL
理解为“所有用户/组”
如果省略整个 (user:group)
内容,则不能使用 -u
和 -g
,而只能以 root 身份运行命令。
-
tag
允许您指定一些选项,例如NOPASSWD
因此,在您的第一个示例中,您可以以 root 身份运行命令,但不能使用 -u
和 -g
以任何其他用户或组身份运行它。
对于示例 2,您可以以 root 身份运行该命令,或者使用 -u
以任何其他用户身份运行它。
使用 3. 您可以以 root 身份运行该命令,或者使用 -u
或 -g
以任何其他用户或组的身份运行该命令。
次佳答案
让我们把这个拆开:redsandro ALL=(ALL:ALL) NOPASSWD:/path/to/command
redsandro 是我们授予权限的用户名。在前面放一个 % 使其适用于一个组。
ALL 是此规则的名称。 Sudoers 可以做的不仅仅是授予全局权限。这就是它变得复杂的地方。
= 无需解释
ALL:ALL 读作 (who_to_run_it_as:what_group_to_run_it_as)。通过这种方式,您可以允许运行命令,但只能在特定用户或组的上下文中运行。
NOPASSWD:告诉它关闭密码提示。
/path/to/command 允许您指定特定命令 path_to_commmand, another_command
要记住的是,虽然 sudo 主要由家庭用户用来升级到 root 权限,但它可以并且用于以更精细的方式控制对特定命令的访问。