这是一个与 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 为一组。
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)
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(如其他答案所建议的)的优点是
/etc/sudoers有时会被系统更新修改,而其中的文件/etc/sudoers.d则不会sudo visudo方法容易出错(正如这个问题所证明的那样),而复制/粘贴命令更难搞砸请注意,在其他情况下仍会提示您输入密码,例如从Ubuntu 软件图形应用程序安装内容。
根据sudo cat /etc/sudoers.d/README此功能(将额外的 sudoer 文件放入/etc/sudoers.d),自 Debian 1.7.2p1-1 以来已默认启用,该功能于 1990 年代后期推出(Ubuntu基于 Debian)。