我使用 vim /etc/sudoers 编辑了我的 Linux Amazon EC2 实例,并尝试将另一个帐户添加到列表中。我现在意识到这是一个可怕的错误。我无法再从任何帐户使用 sudo(这意味着我无法再次编辑该文件),而且我没有 root 帐户密码。我可以做些什么来纠正这个问题?
谢谢。
答案1
希望您使用的是 EBS 根卷。如果是这样,解决方案就不太难。
本质上,您将 EBS 卷附加到另一个实例并进行更改,然后将其重新附加到原始实例:
- 停止(而不是终止)原始实例
- 分离 EBS 卷
- 启动另一个实例
- 将当前 EBS 卷附加到新实例
- 通过 SSH 进入新实例,挂载 EBS 卷并进行必要的更改
- 卸载EBS卷(例如
umount -d /dev/xvdh
或umount -d /dev/sdh
) - 从新实例中分离 EBS 卷并将其附加为
/dev/sda1
旧实例的根卷(例如) - 启动旧实例
- 如果一切正常,终止新实例
这种方法之所以有效,是因为在全新的实例上,您拥有适当的权限 - 其根卷是完整的 - 这使得原始实例中的 sudoers 文件成为您可以编辑的另一个文件。
不幸的是,如果您有一个实例存储根卷,您可能无法解决问题,并且必须恢复到您之前作为备份创建的 AMI。
答案2
这取决于它是 AMI 还是 EBS 根设备。
如果它是 AMI,而您没有 root 密码,并且 AMI 没有配置 root SSH 访问权限,那么您就无能为力。
如果它是 EBS 根,您可以终止它并将卷附加到不同的实例(作为附加磁盘,而不是根)。然后您可以访问数据,或者更正 sudoers 文件并使用该卷启动新实例。
答案3
虽然这篇文章很旧,但这个问题最近才出现,如果您知道导致问题的部分代码,下面是一个解决方案。如果它符合您的需求,这将使您无需卸载分区并安装到另一个分区,然后更改文件,然后反转该过程。
来源:https://aws.amazon.com/premiumsupport/knowledge-center/ec2-sudo-commands/
这适用于:
- 基于 Red Hat 的发行版,例如 SUSE、CentOS、Amazon Linux 1、Amazon Linux 2 和 RHEL。
- 基于 Debian 的发行版(例如 Ubuntu)。
脚步:
- 停止实例
- 停止后,转到“操作”->“实例设置”->“编辑用户数据”
- 粘贴以下代码(前后没有空格)。最后两行添加了一个文件,这样即使 sudoers 更改出现问题,您也知道它已成功运行,并且它还将删除 /etc/sudoers 中包含字符串“string-unique-to-line”的任何行。启动实例您现在应该能够运行 sudo visudo,这样您就不会再次损坏文件
内容类型:multipart/mixed;边界=“//” MIME 版本:1.0 --// 内容类型:text/cloud-config;字符集="us-ascii" MIME 版本:1.0 内容传输编码:7位 内容处置:附件;文件名=“cloud-config.txt” #云配置 云最终模块: - [脚本用户,总是] --// 内容类型:text/x-shellscript;charset="us-ascii" MIME 版本:1.0 内容传输编码:7位 内容处置:附件;文件名=“userdata.txt” /bin/bash #!/bin/bash /bin/echo “Hello World”>>/tmp/testfile.txt sed -i'/字符串唯一到行/d'/etc/sudoers --//--
答案4
以下是我为解决这个问题所做的事情-
- 启动了一个与硬件相同(搞乱了的那个)的实例。
- 停止混乱的情况。
- ssh 完整的 ubuntu 文件夹(其中包含需要的所有文件)。
- 启动副本服务器并确保一切正常。(我们使用 Mongo、Mysql、Tomcat 和 Java)。
- 完成后,我分离了用于混乱实例的弹性 IP,并将其附加到副本实例。
现在您有一个具有相同配置和 IP 的新运行实例。
耗时 30 分钟。