Sudoers 文件,为用户启用 NOPASSWD,所有命令

Jam*_*son 180 sudo

前言

这是一个与 sudoers 文件和 sudo 命令相关的相当复杂的问题。

注意:我在运行 Ubuntu Desktop 13.04 的专用机器上进行了这些更改,我仅将其用于学习目的。我知道启用 NOPASSWD sudo 会带来巨大的安全风险。

最初,我对 sudoers 文件 ( /etc/sudoers) 的唯一更改是一行,该用户规范应该使 nicholsonjf 能够使用 sudo 运行所有命令而无需输入密码(请参阅以 nicholsonjf 开头的行):

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL
nicholsonjf    ALL=NOPASSWD: ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,每次我以 nicholsonjf 身份运行命令时,仍然提示我输入密码。从 sudo 和 admin 组中删除 nicholsonjf 后,我只能开始以 nicholsonjf 的身份运行 sudo 命令。

谁能解释为什么这有效?

是否因为用户 nicholsonjf 继承了admin和的两个组规范sudo(见下面的 sudoers 文件)的sudo 权限,这两个组规范覆盖了 nicholsonjf 用户规范,因为它们在配置文件中更靠后?

pab*_*ouk 224

您添加的行已被覆盖。来自man sudoers

当多个条目与用户匹配时,它们将按顺序应用。如果有多个匹配项,则使用最后一个匹配项(不一定是最具体的匹配项)。

在您的情况下,他nicholsonjf是该组的成员,sudo因此对他而言,这句话适用:

%sudo   ALL=(ALL:ALL) ALL
Run Code Online (Sandbox Code Playgroud)

如果您想覆盖条目,/etc/sudoers只需将新条目放在它们之后。

新条目应如下所示

myuser ALL=(ALL) NOPASSWD: ALL 对于单个用户,或

%sudo ALL=(ALL) NOPASSWD: ALL 为一组。

  • 我认为,解决方案应该是:`%sudo ALL=(ALL) NOPASSWD:ALL` (24认同)
  • 对于完整的解决方案,我想在此答案中看到有关“NOPASSWD”的信息... (8认同)
  • 如果使用基于 debian/ubuntu 的东西(可能普遍应用,在其他地方看不到它),您绝对最好的做法是将自定义命令添加到 /etc/sudoers.d/ 中的文件并保留 sudoers本身由包管理器管理。 (8认同)
  • @DanielAlder:问题`nicholsonjf ALL=NOPASSWD: ALL` 中的规范行是正确的。正如我在答案中所解释的那样,它只是在错误的地方。------ `Runas` 规范——在你的例子中是 `(ALL)` - 是可选的。如果省略规范,则可以以“root”身份运行命令,并且不能使用“sudo”的“-u”和“-g”选项。 (5认同)

Fed*_*TIK 135

对于单个用户,请sudoers使用以下sudo visudo命令在文件末尾添加此行:

superuser ALL=(ALL) NOPASSWD:ALL
Run Code Online (Sandbox Code Playgroud)

对于一组

%supergroup  ALL=(ALL) NOPASSWD:ALL
Run Code Online (Sandbox Code Playgroud)

  • 在我阅读这个答案之前,我做了 `%sudo ALL=NOPASSWD: ALL` 并且它有效。我是唯一一个觉得扩展巴科斯-诺尔式真的很难理解的人吗? (8认同)
  • @Vince 使用您的命令时,我不能以没有 sudo 权限的用户身份在没有密码的情况下使用“sudo”。例如`sudo -u root -i` 有效,但`sudo -u git -i` 无效。 (4认同)

Bor*_*ris 19

要在当前用户使用时从不提示当前用户输入密码,请sudo运行以下命令:

echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/dont-prompt-$USER-for-sudo-password
Run Code Online (Sandbox Code Playgroud)

这将创建一个包含/etc/sudoers.d/dont-prompt-<YOUR USERNAME>-for-sudo-password以下内容的文件:

<YOUR USERNAME> ALL=(ALL:ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

这样做比手动添加该行/etc/sudoers使用sudo visudo(如其他答案所建议的)的优点是

  1. /etc/sudoers有时会被系统更新修改,而其中的文件/etc/sudoers.d则不会
  2. sudo visudo方法容易出错(正如这个问题所证明的那样),而复制/粘贴命令更难搞砸

请注意,在其他情况下仍会提示您输入密码,例如从Ubuntu 软件图形应用程序安装内容。

根据sudo cat /etc/sudoers.d/README此功能(将额外的 sudoer 文件放入/etc/sudoers.d),自 Debian 1.7.2p1-1 以来已默认启用,该功能于 1990 年代后期推出(Ubuntu基于 Debian)。