前言
这是一个与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”这两个组规范(在下面的sudoers文件中看到)继承sudo权限,这两个组规范覆盖了“ nicholsonjf”用户规范,因为它们在配置文件中更远吗?

评论

注意:ALL = NOPASSWD:ALL必须是ALL =(ALL)NOPASSWD:ALL否则将不起作用...

另请参阅此答案:askubuntu.com/questions/139723/sudo-does-not-ask-for-password / ...

为什么sudoers NOPASSWD选项不起作用的可能重复项?

#1 楼

您添加的行已被覆盖。从man sudoers开始:


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


在您的情况下,nicholsonjfsudo组的成员,因此对他来说这行已应用:

%sudo   ALL=(ALL:ALL) ALL


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

新条目应类似于

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

%sudo ALL=(ALL) NOPASSWD: ALL(适用于一组用户)。

评论


对于一个完整的解决方案,我想在这个答案中看到一些有关NOPASSWD的信息。

–丹尼尔·奥尔德(Daniel Alder)
2014年12月5日15:08

我认为,解决方案应该是:%sudo ALL =(ALL)NOPASSWD:ALL

–丹尼尔·奥尔德(Daniel Alder)
2014年12月8日在9:20

@DanielAlder:问题nicholsonjf的规格行ALL = NOPASSWD:ALL是正确的。正如我在回答中所解释的,那是一个错误的地方。 ------ Runas规范(在您的情况下为ALL)是可选的。如果省略该规范,则可以以root用户身份运行命令,并且不能使用sudo的-u和-g选项。

– pabouk
2014年12月9日在8:12

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

–马克·威廉姆斯
2014年12月9日在8:15

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

–水族馆
2015年11月10日,12:02

#2 楼

对于单个用户,请使用sudoers命令在sudo visudo文件的末尾添加以下行:
superuser ALL=(ALL) NOPASSWD:ALL

对于组
%supergroup  ALL=(ALL) NOPASSWD:ALL


评论


在我阅读此答案之前,我做了%sudo ALL = NOPASSWD:ALL,它可以工作。我是唯一发现扩展Backus-Naur形式真的很难理解的人吗?

–文斯
16 Jan 22'0:01



@Vince当使用您的命令时,如果没有密码,我将无法以sudo身份登录,而没有sudo特权。例如。 sudo -u root -i有效,但sudo -u git -i无效。

–NeverEndingQueue
16 Dec 4'在10:28

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

–马哈茂德·古德西(Mahmoud Al-Qudsi)
18-2-21在1:26



在NOPASSWD:和ALL之间放置空格,这使我的安装更加轻松。它应该是超级用户ALL =(ALL)NOPASSWD:ALL

– Marc
20-2-3在13:31

#3 楼

要在当前用户使用sudo时从不提示当前用户输入密码,请运行以下命令:
echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/dont-prompt-$USER-for-sudo-password

这将创建一个名为/etc/sudoers.d/dont-prompt-<YOUR USERNAME>-for-sudo-password的文件,其内容如下:
<YOUR USERNAME> ALL=(ALL:ALL) NOPASSWD: ALL

优点通过使用/etc/sudoers手动将该行添加到sudo visudo的方法(如其他答案所建议的那样)是


/etc/sudoers有时会被系统更新修改,而/etc/sudoers.d中的文件不是
sudo visudo方法很容易出错(此问题已证明),而复制/粘贴命令则更难弄乱

请注意,仍然会提示您输入密码在其他情况下,例如从Ubuntu Software图形应用程序安装东西。
根据sudo cat /etc/sudoers.d/README,此功能(将额外的sudoer文件放入/etc/sudoers.d中)自Debian 1.7.2p1-1开始默认启用。 1990年代后期(Ubuntu基于Debian)。

评论


我喜欢为当前用户使用的快捷方式

– cljk
20 Sep 25'6:56

#4 楼

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

%sudo ALL=NOPASSWD: ALL


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

评论


@Eliah这与其他答案没有什么不同。它所做的只是用sudo替换Fedir回答中的占位符超组。接下来,另一个用户使用转盘吗?还是用户碰巧正在使用的任何其他组?

–muru
17-10-4在11:19

@muru“它所做的就是用sudo替换Fedir回答中的占位符超组。”什么?在%supergroup ALL =(ALL)NOPASSWD:ALL行中用sudo替换supergroup,将产生%sudo ALL =(ALL)NOPASSWD:ALL,而不是%sudo ALL = NOPASSWD:ALL。

– Eliah Kagan
17-10-4在11:21

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

–muru
17-10-4在11:26

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

– Eliah Kagan
17-10-4在11:34



这对我有用,我想与其他用户分享:)(如果需要,请删除我的评论)。

– E. Fortes
17-10-5在13:44

#5 楼

在研究这一点时,我意识到/etc/sudoers文件中的一行不是注释,而是一条指令,该指令使目录/etc/sudoers/*下的任何文件或文件夹都覆盖/etc/sudoers的内容。

此是一个偷偷摸摸的小指令,乍一看似乎是一条注释行。它看起来像这样:

#includedir /etc/sudoers.d


这就是我如何在临时Docker映像中实现非root用户,无密码的用户,以便在具有基础的CICD管道中使用ubuntu的图像:18.04:

RUN \
  useradd -U foo -m -s /bin/bash -p foo -G sudo && passwd -d foo && passwd -d root && \
  sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
  sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
  sed -i /etc/sudoers -re 's/^#includedir.*/## Removed the #include directive! ##"/g' && \
  echo "Customized the sudoers file for passwordless access!" && \
  echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
  echo "root ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
  echo "foo user:";  su foo -c 'whoami && id' && \
  echo "root user:"; su root -c 'whoami && id'


上面的代码会发生什么:


创建了用户和组foo
用户foo被添加到foosudo组中。
主目录设置为/home/foo
shell设置为/bin/bash
sed命令对/etc/sudoers文件进行内联更新,以允许fooroot用户无密码访问sudo组。
sed命令禁用#includedir指令将允许子目录中的任何文件覆盖这些内联更新。