當我執行 sudo 命令時,如何修復 EC2 執行個體上的 sudo 錯誤?
我在 Amazon Elastic Compute Cloud (Amazon EC2 執行個體) 上編輯或刪除了 /etc/sudoers 檔案。然後,當我執行 sudo 命令時,收到語法或 sudo 錯誤。
簡短說明
當您刪除或錯誤設定 /etc/sudoers 檔案時,會出現以下語法或 sudo 錯誤:
- "/etc/sudoers:abc:x: syntax error"
- "sudo: unable to open /etc/sudoers: No such file or directory"
- "sudo: no valid sudoers sources found, quitting"
- "sudo: error initializing audit plugin sudoers_audit"
如果您收到其中一個錯誤,那麼您將無法授予使用者或使用者群組存取系統資源的權限。若要修正 /etc/sudoers 檔案,請將根磁碟連接到救援執行個體。如果您無法將根磁碟附加到救援執行個體,請使用使用者資料來修改檔案。
解決方法
如果您在執行 AWS Command Line (AWS CLI) 命令時收到錯誤訊息,請參閱 AWS CLI 錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
將根磁碟連接至救援執行個體
最佳做法是將根磁碟連接至救援執行個體,以修改 /etc/sudoers 檔案。
先決條件: 當您停止或啟動執行個體時,執行個體儲存體磁碟區中的資料將會刪除。備份執行個體儲存體磁碟區上您要保留的任何資料。如需詳細資訊,請參閱根裝置類型。此外,當您停止或啟動執行個體時,該執行個體的公有 IP 位址也會變更。如果您將外部流量路由到執行個體,則最佳做法是使用彈性 IP 位址,而不是公有 IP 位址。
若要將根磁碟連接至救援執行個體,請完成下列步驟:
-
在相同可用區域中,從具有相同 Linux 作業系統 (OS) 版本的 Amazon Machine Image (AMI) 啟動復原執行個體。
-
使用新的 SSH 金鑰對連線到復原執行個體。
-
執行下列命令,以變更為根使用者:
[ec2-user ~]$ sudo su
-
若要識別區塊型儲存設備名稱和分割區,請在復原執行個體執行下列命令:
[root ~]$ lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 8G 0 disk └─xvda1 202:1 0 8G 0 part / xvdf 202:80 0 101G 0 disk └─xvdf1 202:81 0 101G 0 part xvdg 202:96 0 30G 0 disk
在上述範例中,/dev/xvda 和 /dev/xvdf 磁碟區裝置名稱是分割磁碟區,而 /dev/xvdg 不是分割磁碟區。
如果您的磁碟區已分割,請執行以下命令來掛載 /dev/xvdf1 分割區,而不是 /dev/xvdf 原始裝置:[root ~]$ mount -o nouuid /dev/xvdf1 /mnt
如果您使用以 AWS Nitro System 為基礎的執行個體,則磁碟區裝置名稱會類似於 dev/nvme[0-26]n1。如果您的執行個體建置在具有 NVMe 的 Nitro System 上,則將分割區掛載至 /mnt 目錄中。使用您透過 lsblk 命令識別的裝置名稱:
[root ~]$ mount -o nouuid /dev/nvme1n1p1 /mnt
如需詳細資訊,請參閱 Amazon EC2 執行個體磁碟區的裝置名稱。
-
若要從工作執行個體複製 /etc/sudoers 檔案作為備份,請執行以下命令:
[root ~]$ cp /etc/sudoers /mnt/etc/sudoers.bak
-
若要在 /mnt 目錄中建立 chroot 環境,請執行下列命令:
[root ~]$ for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt
在前面的範例中,/dev、/proc、/sys 和 /run 目錄是從原始根目錄檔案系統進行繫結掛載。這可讓在 chroot 環境中執行的程序存取這些系統目錄。 若要編輯 /etc/sudoers 檔案,請在 chroot 環境中執行 visudo 命令:
[root ~]$ visudo
注意: 您必須執行 visudo 命令才能編輯 sudoers 檔案。visudo 命令會鎖定 sudoers 檔案。
如果您從上述命令中收到錯誤訊息,請執行以下 diff 命令來比較 /etc/sudoers 檔案與新檔案 /etc/sudoers.bak:
[root ~]$ diff /etc/sudoers /etc/sudoers.bak
注意: 如果您在編輯文件之前沒有進行自訂變更,請將 /etc/sudoers.bak 檔案還原為 /etc/sudoers。 若要結束 chroot 環境,請執行以下命令:
[root ~]$ exit
- 若要卸載磁碟區,請執行以下命令:
[root ~]$ umount -fl /mnt
- 從復原執行個體中,分離作為次要磁碟區連接的根磁碟區。然後,使用步驟 2 中的裝置名稱,將其重新連接到原始執行個體。
- 啟動原始執行個體,然後確認 sudo 命令是否正常運作。
使用使用者資料修改檔案
注意: 以下疑難排解方法使用使用者資料輸入。若要使用此方法,您必須為根使用者設定密碼。
若要使用使用者資料來修改檔案,請完成以下步驟:
-
開啟 Amazon EC2 console (Amazon EC2 主控台)。
-
在導覽窗格中,選擇 Instances (執行個體),然後選取執行個體。
-
選擇 Instance state (執行個體狀態),然後選擇 Stop Instance (停止執行個體)。
-
在 Stop instance? (是否要停止執行個體?) 下,選擇 Stop (停止)。
-
為根使用者設定臨時密碼。
範例:Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud_final_modules: - [scripts-user, always] --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash chpasswd <<<"root:root" --//
重要: 此密碼使用純文字來傳遞密碼,這並不安全。在完成疑難排解步驟後,請確認您已移除根使用者的臨時密碼。
-
啟動執行個體,然後以 ec2-user 身分登入。
-
若要存取 /etc/sudoers 檔案,請執行以下 pkexec 命令:
pkexec /usr/sbin/visudo
-
輸入根使用者密碼,然後修改 /etc/sudoers 檔案。
-
執行 sudo 命令來確認 sudo 是否正常運作。
若要使用 Amazon EC2 主控台刪除使用者資料值 (包含根使用者密碼),請完成以下步驟:
- 開啟 Amazon EC2 console (Amazon EC2 主控台)。
- 在導覽窗格中,選擇 Instances (執行個體),然後選取執行個體。
- 選擇 Actions (動作),然後選擇 Instance settings (執行個體設定)。
- 選擇 Edit user data (編輯使用者資料),然後刪除所有使用者資料。
若要使用 AWS CLI 介面刪除使用者資料值 (包括根使用者密碼),請執行以下 modify-instance-attribute 命令:
aws ec2 modify-instance-attribute --instance-id example-instance-id --user-data Value=""
注意: 將 example-instance-id 取代為執行個體識別碼。
若要確認您是否已移除使用者資料,請執行以下 escribe-instance-attribute 命令:
aws ec2 describe-instance-attribute --instance-id example-instance-id --attribute userData
注意: 將 example-instance-id 取代為執行個體識別碼。
刪除使用者資料之後,請啟動執行個體。
相關資訊
相關內容
- 已提問 1 年前
- 已提問 2 年前
- 已提問 2 年前