这是一个与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”用户规范,因为它们在配置文件中更远吗?
#1 楼
您添加的行已被覆盖。从man sudoers
开始:当多个条目与一个用户匹配时,将按顺序应用它们。如果存在多个匹配项,则使用最后一个匹配项(不一定是最具体的匹配项)。
在您的情况下,
nicholsonjf
是sudo
组的成员,因此对他来说这行已应用:%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
被添加到foo
和sudo
组中。主目录设置为
/home/foo
。 shell设置为
/bin/bash
。sed
命令对/etc/sudoers
文件进行内联更新,以允许foo
和root
用户无密码访问sudo
组。sed
命令禁用#includedir
指令将允许子目录中的任何文件覆盖这些内联更新。
评论
注意:ALL = NOPASSWD:ALL必须是ALL =(ALL)NOPASSWD:ALL否则将不起作用...另请参阅此答案:askubuntu.com/questions/139723/sudo-does-not-ask-for-password / ...
为什么sudoers NOPASSWD选项不起作用的可能重复项?