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


142

前言

通常,这是一个与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

但是,这没有用,每次我以“ nicholsonjf”命令运行时,仍然会提示我输入密码。一旦我从sudo和admin组中删除了“ nicholsonjf”,我就只能以'nicholsonjf'的身份开始运行sudo命令。

谁能解释为什么这样有效?

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


7
注:所有= NOPASSWD:ALL必须是ALL =(ALL)NOPASSWD:ALL否则它不工作...
安德烈Verwijs


Answers:


163

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

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

您的情况nicholsonjf是该小组的成员,sudo因此对他来说,这条线适用:

%sudo   ALL=(ALL:ALL) ALL

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

新条目应如下所示

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

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


6
对于一个完整的解决方案,我想NOPASSWD在这个答案中看到一些东西……
Daniel Alder

22
我认为,解决方案应该是:%sudo ALL=(ALL) NOPASSWD:ALL
Daniel Alder 2014年

3
@DanielAlder:问题的说明行nicholsonjf ALL=NOPASSWD: ALL是正确的。正如我在回答中所解释的,那是一个错误的地方。------根据Runas您的情况,该规范(ALL)是可选的。如果省略该规范,则可以按方式运行命令,root而不能使用-u-g选项sudo
pabouk 2014年

这给安全性带来了更大的风险,因为它使多个用户无密码访问。如果这是您的个人PC,那并不重要-也许。我只是将个人路线移到最后。
马克·威廉姆斯

4
如果使用基于debian / ubuntu的东西(通常可以应用,在其他地方看不到),那么可以加一个修正而不是纠正。绝对的最佳实践选择是在/etc/sudoers.d/中的文件中添加自定义命令本身由包管理器管理。
Aquarion

119

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

superuser ALL=(ALL) NOPASSWD: ALL

对于一组

%supergroup  ALL=(ALL) NOPASSWD: ALL

8
在我阅读此答案之前,我已经完成%sudo ALL=NOPASSWD: ALL并且可以正常工作。我是唯一发现扩展Backus-Naur形式真的很难理解的人吗?
文斯

4
@Vince使用命令时,如果sudo没有sudo特权,我不能没有密码。例如sudo -u root -i可以,但sudo -u git -i不能。
NeverEndingQueue

这是一个比被接受的答案有用得多的答案,尽管它确实回答了OP的问题,但可能不是大多数人通过Google到达此页面的目的。
Mahmoud Al-Qudsi '18

3

当用户使用以永不提示当前用户输入密码sudo

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

这将创建一个名为的文件/etc/sudoers.d/dont-prompt-<YOUR USERNAME>-for-sudo-password,这意味着您运行该命令的用户将不会在执行sudo命令时提示输入密码。在其他情况下(例如从Ubuntu Software图形应用程序安装内容),系统仍会提示您输入密码。

与在echo命令中添加行来/etc/sudoers使用相比,以这种方式进行操作的优点是sudo visudo(如其他答案所建议的)

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

根据sudo cat /etc/sudoers.d/README此功能(将额外的sudoer文件放入/etc/sudoers.d),从1990年代末发布的 Debian 1.7.2p1-1开始已默认启用(Ubuntu 基于Debian)。


(如果可以提供更好的文件名,请随时编辑我的答案)
鲍里斯

0

正如文斯(Vince在评论提到的那样,您可以使用以下行:

%sudo ALL=NOPASSWD: ALL

(这与这些 答案中显示的行不同,它为我解决了这个问题。)


@Eliah与其他答案没有什么不同。它所做的只是用替换supergroupFedir回答中的占位符sudo。接下来,该组的另一个用户wheel?还是用户碰巧正在使用的任何其他组?
muru 17-10-4

1
@muru “它所做的就是用替换supergroupFedir回答中的占位符sudo。” 什么?更换supergroupsudo的线%supergroup ALL=(ALL) NOPASSWD:ALL的产量%sudo ALL=(ALL) NOPASSWD:ALL,而不是%sudo ALL=NOPASSWD: ALL
伊莱亚·卡根

可以说这更糟,因为现在NOPASSWD仅作为root用户作为目标用户。因此,它甚至无法正确回答问题!
大师

@muru是什么是不是可以说连然而,是替代supergroupsudo。这是它自己的答案,而不是感谢帖或其他答案的副本。但是,是的,我同意:除非他们有意图,否则这对大多数用户而言不会像其他答案中的方法那样好。(但是,尤其是考虑到问题是“所有命令”,而不是“所有目标用户”,我认为这实际上甚至没有试图回答所提出的问题。)
Eliah Kagan

这对我有用,我想与其他用户分享:)(如果需要,请删除我的评论)。
E. Fortes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.