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

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

当没有配置时,ubuntuUbuntu Server 12.04 的 AWS 映像上的用户如何实现所有命令均无密码?sudo/etc/sudoers

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

所以我添加了一个新用户并开始编辑/etc/sudoers(当然使用 visudo)。从阅读该文件来看,似乎默认用户作为该组的成员ubuntu无需密码。所以我将我的新用户添加到其中。但这没有用。然后我尝试将指令添加到。但这也没有用。sudoadminNOPASSWDsudoers

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

答案1

好吧,我找到了答案,所以不妨把它放在这里以保证完整性。最后/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

在最后。

答案2

我发现,为了轻松地在多台服务器上复制此行为,最直接的做法如下:

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

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

sudo service sudo restart

就是这样!

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

sudo groupadd admin

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

sudo usermod ubuntu -g admin

注:如@哈塔如上所述,您可能需要使用它adm作为管理员组名称,具体取决于所使用的 Ubuntu 版本。

答案3

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

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

重新启动系统即可。

答案4

当我研究这个问题时,我意识到/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
  • 外壳设置为/bin/bash
  • foo和的密码root均被删除。
  • sed命令对文件进行内联更新,/etc/sudoers以允许foo用户root无密码访问该sudo命令。
  • sed命令禁用#includedir指令允许子目录中的任何文件覆盖这些内联更新。

相关内容