当我编辑 EC2 实例上的 sudoers 文件后,在运行 sudo 命令时收到语法错误。如何解决此问题?

2 分钟阅读
0

我在 Amazon Elastic Compute Cloud(Amazon EC2)实例上手动编辑了 sudoers 文件。现在,当我运行 sudo su 命令或需要高级用户访问权限的命令时,会收到类似下面的语法错误:"/etc/sudoers: syntax error near line xx"、"sudo: parse error in /etc/sudoers near line xx"、"sudo: no valid sudoers sources found, quitting"、"sudo: unable to initialize policy plugin"

简述

当您手动编辑 /etc/sudoers 文件以更改 sudo 用户并在文件中添加多余字符时,就会发生此语法错误。这将导致实例受损,无法运行 sudo su 或需要高级用户访问权限的命令。要修复此语法错误,请完成以下步骤:

  1. 停止实例。
  2. 分离其根卷。
  3. 将根卷作为辅助卷连接到恢复实例。
  4. 挂载连接的卷。
  5. 撤消对 sudoers 文件的更改。

解决方案

先决条件

**注意:**不要使用诸如 vi、vim 或 nano 之类的文本编辑器在可以连接的正在运行的实例上手动编辑 sudoers 文件。运行 visudo 命令编辑可以连接的实例上的 /etc/sudoers 文件。visudo 命令会在您编辑时检查解析错误,并在保存更改之前提醒您注意文件中出现的问题。

1.打开 Amazon EC2 控制台

2.在导航窗格中,选择实例

3.选择受损实例,选择实例状态,然后选择停止实例

4.在停止实例?弹出窗口中,选择停止

5.在存储选项卡下,单击根设备名称的卷 ID。

6.在页面上,选择卷,选择操作,然后选择分离卷

7.在弹出窗口中,选择分离。验证卷状态是否为可用

8.在与原始实例相同的可用区中启动新 EC2 实例。该新实例将成为您的救援实例。

9.救援实例启动后,从导航窗格中选择

10.选择原始实例的已分离根卷。选择操作,然后选择连接卷

11.对于实例,选择救援实例 ID 并输入设备名称。然后,选择连接卷

12.使用您的密钥对,通过 SSH 连接到实例。

13.要验证连接的卷的设备名称,请运行 lsblk 命令。

lsblk

输出示例:

NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTxvda    202:0    0    8G  0 disk
└─xvda1 202:1    0    8G  0 part /
xvdf    202:80   0  500G  0 disk
└─xvdf1 202:81   0  500G  0 part

14.创建挂载目录,然后使用 root 权限挂载。
Amazon Linux、Ubuntu 和 Debian:

sudo mount /dev/xvdf1 /mnt

Amazon Linux 2023、Amazon Linux 2、CentOS 7 或 8、SUSE Linux 12 以及 RHEL 7.x 或 8.x:

sudo mount -o nouuid /dev/xvdf1 /mnt

检查控制台中的挂载点是否有新连接的卷。挂载点通常是 /dev/xvdf1

15.Chroot 进入已挂载的目录。

for dir in {/dev,/dev/pts,/sys,/proc}; do sudo mount -o bind $dir /mnt$dir; donechroot /mnt

16.要编辑 subdoers 文件,请运行 visudo 命令:

visudo

编辑文件时,可以还原导致语法错误的更改。或者,您可以从恢复实例中复制该文件,然后将 /mnt/etc/sudoers 文件替换为正确文件:

创建原始文件的备份。

sudo mv /mnt/etc/sudoers /mnt/etc/sudoers.backup

将文件复制到实例。

sudo cp /etc/sudoers /mnt/etc/sudoers

17.编辑或替换 sudoers 文件后,请卸载该卷。

for dir in {/dev,/dev/pts,/sys,/proc}; do umount /mnt$dir; donesudo umount /mnt

18.将卷连接到原始实例。将装载点指定为 /dev/xvda/dev/sda1,因为这是原始实例的根卷。

19.启动原始实例。

20.使用 SSH 连接到实例并运行 sudo 命令。

相关信息

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

AWS 官方
AWS 官方已更新 6 个月前