我在 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 或需要高级用户访问权限的命令。要修复此语法错误,请完成以下步骤:
- 停止实例。
- 分离其根卷。
- 将根卷作为辅助卷连接到恢复实例。
- 挂载连接的卷。
- 撤消对 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 命令?