在 Amazon EC2 实例上丢失了 sudo/su

8 sudo amazon-web-services sudoers amazon-ec2

我有一个 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 
Run Code Online (Sandbox Code Playgroud)

我可能做了“chown ec2-user /etc/sudoers”(或者,更可能是“chown -R ec2-user /etc”,因为我厌倦了rsync失败),所以这是我的错。

我该如何恢复?我停止了实例并尝试了 AWS EC2 控制台上的“查看/更改用户数据”选项,但这没有帮助。

编辑:我意识到我可以杀死这个实例并创建一个新实例,但希望避免极端情况。

var*_*esa 7

在这种情况下,我认为您应该能够使用第二个实例来解决问题:

  • 分离包含损坏系统的 EBS 磁盘
  • 创建另一个 EC2 实例
  • 将磁盘附加并挂载到新实例
  • 修复权限
  • 卸载、分离和重新附加到原始实例


小智 5

  1. 停止您当前的实例
  2. 分离现有卷
  3. 创建新卷
  4. 将新卷作为“/dev/xvda”附加到您的实例
  5. 启动您的实例
  6. 将旧卷(具有 sudo 权限问题的卷)附加到以“/dev/sdf”身份运行的实例
  7. 使用 putty 登录到您的实例
  8. 使用该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 /
    
    Run Code Online (Sandbox Code Playgroud)

lsblk 的输出从完整设备路径中删除 /dev/ 前缀。在这个例子中,/dev/xvda1挂载为根设备(注意 MOONTPOINT 被列为 /,Linux 文件系统层次结构的根),并/dev/xvdf附加,但尚未挂载。

  1. 使用以下命令为卷创建挂载点目录。挂载点是卷在文件系统树中的位置,也是挂载卷后读取和写入文件的位置。替换 mount_point 的位置,例如 /data。

    sudo su
    cd /mnt
    mkdir other
    mount /dev/xvdf other
    cd /
    chown -R root:root /mnt/other/etc/
    exit
    
    Run Code Online (Sandbox Code Playgroud)
  2. 返回 AWS 并停止实例

  3. 分离两个卷并将旧的(现在固定的)卷重新附加为 /dev/xvda
  4. 启动您的实例,现在您的权限应该恢复到原来的状态