當我在 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.    建立掛載目錄,然後使用根權限進行掛載。
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 官方已更新 7 個月前