为什么我无法在 EC2 Linux 实例上运行 sudo 命令?

上次更新时间:2020 年 3 月 27 日

我在 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例上运行 sudo 命令时,收到了这样的错误:“sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set”或“sudo: /etc/sudoers is world writable”。如何修复此问题?

简短描述

/usr/bin/sudo 文件由非根用户所有时,系统会显示错误:“sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set”。/usr/bin/sudo 文件应该以 root:root 作为拥有者。

/etc/sudoers 文件具有不正确的权限时,系统会显示错误:“sudo: /etc/sudoers is world writable”sudoers 文件不得为全局可写文件。如果某个文件为全局可写文件,则表示每个人都可以写入此文件。默认情况下,sudoers 文件的文件模式是 0440。这允许拥有者和组中的任何人读取该文件,但会禁止写入该文件。

您可以在基于 Red Hat 的发行版版本(如 Red Hat、SUSE、CentOS、Amazon Linux 1、Amazon Linux 2 和 RHEL)或基于 Debian 的 Linux 发行版(如 Ubuntu)中,使用用户数据脚本更正这些错误。

解决方法

1.    打开 Amazon EC2 控制台,然后选择您的实例。

2.   依次选择操作实例状态停止

注意:如果停止处于禁用状态,则表示要么实例已停止,要么其根设备是一个实例存储卷。

3.     依次选择操作实例设置查看/更改用户数据

4.     复制以下命令并将其粘贴到用户数据字段中,再选择保存。请务必复制完整的脚本内容。粘贴脚本时,不要插入任何额外的空格。

基于 Red Hat 的发行版

对于基于 Red Hat 的发行版,请使用以下用户数据脚本。

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:
rpm --setugids sudo && rpm --setperms sudo
--//

基于 Debian 的发行版

对于基于 Debian 的发行版,请使用以下用户数据脚本。

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
/bin/chown root:root /usr/bin/sudo
/bin/chmod 4111 /usr/bin/sudo
/bin/chmod 644 /usr/lib/sudo/sudoers.so
/bin/chmod 0440 /etc/sudoers
--//

5.    启动实例,然后使用 SSH 连接到实例

注意:如果您在编辑 sudoers 文件后,尝试使用 SSH 连接到实例时收到语法错误,请参阅我编辑了 EC2 实例上的 sudoers 文件,可尝试运行 sudo 命令时,收到了语法错误。如何修复此问题?


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?