我有一个 Amazon EC2 实例。我可以正常登录,但现在“su”和“sudo”都不起作用(它们以前都正常工作):
“su”要求输入密码,但我使用 ssh 密钥登录,而且我认为 root 用户甚至有密码。
“sudo
<anything>
”的作用是:
sudo: /etc/sudoers is owned by uid 222, should be 0
sudo: no valid sudoers sources found, quitting
我可能确实执行了“chown ec2-user /etc/sudoers”(或者更可能是“chown -R ec2-user /etc”,因为我厌倦了 rsync 失败),所以这是我的错。
我该如何恢复?我停止了实例并尝试了 AWS EC2 控制台上的“查看/更改用户数据”选项,但这没有帮助。
编辑:我意识到我可以终止这个实例并创建一个新的实例,但希望避免极端的情况。
答案1
在这种情况下,我认为您应该能够使用第二个实例来解决问题:
- 分离包含损坏系统的 EBS 磁盘
- 创建另一个 EC2 实例
- 将磁盘附加并安装到新实例
- 修复权限
- 卸载、分离并重新连接到原始实例
答案2
- 停止当前实例
- 分离现有卷
- 创建新卷
- 将新卷作为“/dev/xvda”附加到您的实例
- 启动您的实例
- 将旧卷(具有 sudo 权限问题的卷)重新附加到以“/dev/sdf”形式运行的实例
- 使用 putty 登录到您的实例
使用该
lsblk
命令查看可用的磁盘设备及其挂载点(如果适用),以帮助您确定要使用的正确设备名称。ec2-user ~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvdf 202:80 0 100G 0 disk xvda1 202:1 0 8G 0 disk /
lsblk 的输出会从完整设备路径中删除 /dev/ 前缀。在此示例中,/dev/xvda1
被挂载为根设备(请注意,MOUNTPOINT 列为 /,即 Linux 文件系统层次结构的根),并且/dev/xvdf
已连接,但尚未挂载。
使用以下命令为卷创建挂载点目录。挂载点是卷在文件系统树中的位置,也是挂载卷后读取和写入文件的位置。用 mount_point 替换位置,例如 /data。
sudo su cd /mnt mkdir other mount /dev/xvdf other cd / chown -R root:root /mnt/other/etc/ exit
返回 AWS 并停止实例
- 分离两个卷并将旧卷(现已修复)重新附加为 /dev/xvda
- 启动您的实例,现在您的权限应该恢复到原来的状态
答案3
我遇到了同样的问题,因为太难了,所以我制作了一个视频来解释解决方案。这与 Rekee 以视频教程的形式提供的解决方案几乎相同。
希望能帮助到你。 :)
答案4
看起来你自己已经回答了这个问题......
我可能确实执行了“chown ec2-user /etc/sudoers”(或者更可能是“chown -R ec2-user /etc”,因为我厌倦了 rsync 失败),所以这是我的错。
无论如何,我认为如果不获得 root shell,您就无法解决这个问题。 (我不确定在 ec2 上可以使用哪些恢复方法?)
如果您确实以递归方式 chown /etc 那么我认为重建服务器是最好的方法。