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

ayc*_*dee 262 sudo aws

ubuntuUbuntu Server 12.04 的 AWS 映像上的用户如何在sudo没有配置的情况下对所有命令设置无密码/etc/sudoers

我在亚马逊上使用 Ubuntu 服务器 12.04。我想添加一个与默认 Ubuntu 用户具有相同行为的新用户。具体来说,我希望sudo这个新用户无密码。

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

无论如何,现在我只是好奇。怎样的ubuntu,如果他们没有在定义用户密码的获得特权/etc/sudoers。允许这样做的机制是什么?

ayc*_*dee 365

好的,我已经找到了答案,所以为了完整起见,不妨把它放在这里。最后,/etc/sudoers我以为只是评论:

#includedir /etc/sudoers.d
Run Code Online (Sandbox Code Playgroud)

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

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

所以这就是默认 ubuntu 用户的 sudo 配置所在的位置。

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

sudo visudo -f /etc/sudoers.d/90-cloudimg-ubuntu
Run Code Online (Sandbox Code Playgroud)

并添加如下一行:

aychedee ALL=(ALL) NOPASSWD:ALL
Run Code Online (Sandbox Code Playgroud)

在末尾。

  • 'sudo service sudo restart' 有效:) (38认同)
  • 在更高版本(例如 14.04)中,包含的文件是`/etc/sudoers.d/90-cloud-init-users`(所以要编辑.. `sudo visudo -f /etc/sudoers.d/90-cloud-初始化用户`)。尽管创建其他文件比编辑生成的文件更干净。请注意,包含`.` 或以`~` 结尾的文件将*不*包括在内。 (7认同)
  • 我很确定我必须完全重新启动。 (5认同)
  • @Phil_1984_ 最有可能的是,它是作为评论添加的,以允许与其他(标准?)版本的 sudo 兼容,这些版本不允许包含,但不会被奇怪的评论绊倒。(标准很难!;-) (3认同)
  • 新的 sudo 规则将用于每个新登录的用户 - 所以你至少需要重新登录 (2认同)
  • 这是一个很棒的地方。我一直想知道 ubuntu 用户如何可以在没有密码的情况下使用 `sudo -i` 并且没有 `/etc/sudoers` 中的 NOPASSWD 部分,我以为我疯了之类的。# 在配置文件中的一行开头不是注释是对通用标准的公然滥用。 (2认同)

jim*_*kiz 104

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

sudo visudo
Run Code Online (Sandbox Code Playgroud)

改变这一行:

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) ALL
Run Code Online (Sandbox Code Playgroud)

到这一行:

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL
Run Code Online (Sandbox Code Playgroud)

并移动这一行:

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
Run Code Online (Sandbox Code Playgroud)

你现在应该有这个:

# 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
Run Code Online (Sandbox Code Playgroud)

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

sudo adduser <user> sudo
Run Code Online (Sandbox Code Playgroud)

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

sudo adduser <user> admin
Run Code Online (Sandbox Code Playgroud)

(在旧版本的 ubuntu 上,您可能需要这样做):

sudo service sudo restart
Run Code Online (Sandbox Code Playgroud)

就是这样!

编辑:您可能需要添加 admin 组,因为我认为默认情况下它不存在。

sudo groupadd admin
Run Code Online (Sandbox Code Playgroud)

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

sudo usermod ubuntu -g admin
Run Code Online (Sandbox Code Playgroud)

注意:正如@hata 所提到的,您可能需要使用adm作为您的管理员组名称,具体取决于所使用的 Ubuntu 版本。

  • 自我注意:将限制较少的权限移到堆栈中较低的位置是一种约定。但不这样做不会影响功能。 (3认同)
  • 正如 jiminikiz 解释的那样,我必须将 *%admin* 放在我的 Ubuntu GNOME 16.04 LTS 上的 *%sudo* 之后。另外,我的 Ubuntu 上的管理员组 ID 完全不是 *admin* 而是 *adm*。不需要重新启动。 (3认同)

小智 9

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

<your user name> ALL=(ALL) NOPASSWD:ALL
Run Code Online (Sandbox Code Playgroud)

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


小智 6

不使用任何编辑器的简短回答(在 bash 上测试,在远程主机上执行风险很大)。

将 sudo 配置为在没有密码的情况下为当前用户工作:

echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
Run Code Online (Sandbox Code Playgroud)

检查编辑:

sudo visudo -c
Run Code Online (Sandbox Code Playgroud)

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

sudo cat /etc/sudoers | grep "$USER"
Run Code Online (Sandbox Code Playgroud)

...或者简单地尝试一下:

sudo <anything>
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常危险的建议......复制并粘贴错误,你会将自己锁定在自己的服务器之外。因此建议使用 visudo。它在保存到磁盘之前检查语法是否正确。所以,对于任何想要使用它的人。不要在您关心的远程服务器上执行此操作。您可能希望在答案中包含关于此的警告。 (21认同)
  • 不使用 visudo 是一个*可怕的*想法。相信我,我知道。 (11认同)
  • @theartofrain - 通常情况下,我同意,但 `visudo` 尤其擅长不允许你破坏 sudoers 文件,从而不会将你锁定在你的机器之外(或者至少是 sudo)。 (4认同)
  • @JonV 您也可以通过 `visudo` 失去管理员权限,但通常不是偶然的,因为 `visudo` 只会保存根据 [sudoers 文件的语法](http://manpages.ubuntu.com) 格式正确的更改/manpages/xenial/en/man5/sudoers.5.html)。*大多数*错误在语法上都是错误的,因此它们不会对`visudo`造成伤害。如果 `/etc/sudoers` 或 `/etc/sudoers.d` 中的文件 * 格式错误,`sudo` 拒绝为任何人提升权限作为安全措施,这就是为什么不使用 `visudo` 是危险的. (尽管 [有时`pkexec` 可以修复它](https://askubuntu.com/a/73872) 无需重启。) (3认同)