如何在没有密码的情况下运行sudo命令?


235

没有在其中进行配置时ubuntu,Ubuntu Server 12.04的AWS映像上的用户如何sudo对所有命令都使用无密码/etc/sudoers

我在亚马逊上使用Ubuntu Server 12.04。我想添加一个行为与默认Ubuntu用户相同的新用户。我特别希望sudo这个新用户没有密码。

因此,我添加了一个新用户并进行了编辑/etc/sudoers(当然使用visudo)。通过读取该文件,似乎默认ubuntu用户sudo通过成为该admin组的成员而获得了无密码。所以我添加了新用户。哪个没有用。然后,我尝试将NOPASSWD指令添加到中sudoers。这也没有用。

无论如何,现在我很好奇。ubuntu如果未在中定义用户,则如何获得无密码特权/etc/sudoers。允许这种情况的机制是什么?


Answers:


332

好的,我已经找到了答案,因此也可以将其放在此处以求完整。最后,/etc/sudoers我认为这只是一条评论:

#includedir /etc/sudoers.d

但是,这实际上包括该目录的内容。其中是文件 /etc/sudoers.d/90-cloudimg-ubuntu。具有预期的内容

# ubuntu user is default user in cloud-images.
# It needs passwordless sudo functionality.
ubuntu ALL=(ALL) NOPASSWD:ALL

这就是默认ubuntu用户的sudo配置所在的地方。

您应该使用visudo编辑该文件。以下命令将使您使用visudo编辑正确的文件。

sudo visudo -f /etc/sudoers.d/90-cloudimg-ubuntu

并添加如下一行:

aychedee ALL=(ALL) NOPASSWD:ALL

在末尾。


4
我很确定我必须完全重新启动。
aychedee

2
新须藤规则将用于每个新登录的用户-所以你需要重新登录至少
bluszcz

32
'sudo service sudo restart'的工作原理是:)
Laice

4
在更高版本中(例如14.04),包含的文件为/etc/sudoers.d/90-cloud-init-users(以便编辑.. sudo visudo -f /etc/sudoers.d/90-cloud-init-users)。尽管创建其他文件比编辑生成的文件更干净。请注意,包含文件.或结束在~被包括在内。
Molomby

2
@ Phil_1984_最有可能的是,它被添加为注释,以允许与其他(标准?)版本的sudo兼容,该版本不允许包含,但不会被奇怪的注释绊倒。(标准很难!;-)
jpaugh

94

我发现,为了在多个服务器之间轻松复制此行为,最直接的方法是:

sudo visudo

更改此行:

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

到这行:

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

并移动这一行:

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

您现在应该拥有:

# 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

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

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

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

#includedir /etc/sudoers.d

然后对于每个需要使用密码进行 sudo访问的用户

sudo adduser <user> sudo

对于需要sudo访问而无需密码的每个用户:

sudo adduser <user> admin

最后,运行此命令:

sudo service sudo restart

就是这样!

编辑:您可能必须添加管理员组,因为我默认情况下不存在该管理员组。

sudo groupadd admin

您还可以通过以下命令将默认的AWS ubuntu用户添加到admin组中:

sudo usermod ubuntu -g admin

注意:如@hata所述,您可能需要使用admadmin组名,具体取决于所使用的Ubuntu版本。


3
自己注意:这是一个约定,将较少的限制权限降低到较低的堆栈中。但是不这样做不会影响功能。
poweratom

2
正如jiminikiz解释的那样,我必须将%sudo之后的admin放在我的Ubuntu GNOME 16.04 LTS上。另外,我的Ubuntu上的管理员组ID完全不是admin,而是adm。无需重新启动。
hata

5

我将在/etc/sudoers.d/目录下创建自己的文件-如果进行任何更新,Amazon Cloud创建的文件可能会被覆盖。在/etc/sudoers.d中创建文件后,添加此条目,

<your user name> ALL=(ALL) NOPASSWD:ALL

重新启动系统,这将起作用。


2

不使用任何编辑器的简短答案(在bash上测试,在远程主机上执行非常冒险)。

将sudo配置为不使用当前用户密码:

echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers

使用以下命令检查编辑:

sudo visudo -c

验证是否可以在没有密码的情况下使用sudo:

sudo cat /etc/sudoers | grep "$USER"

...或干脆尝试:

sudo <anything>

21
这是非常危险的建议...复制并粘贴此错误,您将无法使用自己的服务器。因此建议使用visudo。在保存到磁盘之前,它将检查语法是否正确。因此,对于任何想使用它的人。不要在您关心的远程服务器上执行此操作。您可能需要在答案中包含有关此内容的警告。
aychedee

8
不使用visudo是一个可怕的想法。相信我,我知道。
trognanders's

1
恕我直言,复制粘贴比手动编辑更安全。较小的简化:echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
theartofrain 2016年

4
@theartofrain-通常,我会同意,但是visudo对于不允许您破坏sudoers文件,从而不会将您锁定在计算机之外(或至少是sudo)特别好。
乔恩(Jon V)

3
@JonV您也可能会丢失管理员权限visudo,但通常不会偶然,因为visudo仅保存根据sudoers文件语法正确形成的更改。大多数错误在语法上都是错误的,因此不会对造成伤害visudo。如果/etc/sudoers或在一个文件/etc/sudoers.d 形成不良的,sudo拒绝提升的人作为一种安全措施,这就是为什么不使用权限visudo是很危险的。(尽管有时pkexec无需重新启动即可解决它。)
Eliah Kagan

0

这是我在临时Docker映像中实现非root用户,无密码用户以在CICD管道中使用的方式:

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    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 "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id
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.