Ubuntu VPS 如何變更 root 密碼?
使用 passwd、chpasswd 與 chage 變更 Ubuntu VPS 的 root 或使用者密碼,驗證新密碼,並在 SSH 中斷或遺失 root 密碼時重新登入。
如何在 Ubuntu 上變更 VPS root 密碼
若要在 Ubuntu 上變更 VPS (虛擬專用伺服器) 的 root 密碼,請以可執行 sudo 的使用者開啟 SSH (安全殼層) 工作階段,然後執行 sudo passwd root。系統會要求您輸入新密碼 2 次,且不會要求舊密碼,因為 sudo 已確認您的身分。若要改為變更自己的登入密碼,請不帶引數執行 passwd;系統會先要求您輸入目前的密碼。
passwd # your own password
sudo passwd deploy # another user's password
sudo passwd root # root's password以上就是完整操作。以下內容說明常見的問題:在失去可用來修復問題的工作階段前,先確認新密碼可正常使用;從指令碼設定密碼;刻意讓密碼失效;以及在密碼已遺失時重新登入。
變更密碼前先開啟第二個工作階段
現在開啟第二個 SSH 工作階段,並讓它保持連線。只要仍有一個已驗證的 shell,這份指南中幾乎所有錯誤都能在兩分鐘內修正;如果最後一個工作階段關閉,就必須改用主控台處理。
已開啟的 shell 在其所屬帳戶遭到變更、鎖定或設定為過期後,仍會繼續運作,因為 SSH 只會在登入時檢查憑證,不會再次檢查。例外是 sudo。其時間戳記到期後,sudo 會透過 PAM(可插拔驗證模組)重新檢查密碼。根據預設,這會在上次提示輸入密碼後 15 分鐘發生。因此,新密碼第一次真正受到測試,是在下次 sudo 要求輸入密碼時,而不是登入時。
讓第一個工作階段保持開啟,並在第二個工作階段測試新密碼。
使用 passwd 變更自己的密碼
passwdChanging password for deploy.
Current password:
New password:
Retype new password:
passwd: password updated successfully只有 passwd: password updated successfully 表示 /etc/shadow 中的雜湊值已替換。出現其他任何輸出,表示舊密碼仍然存在。
這裡會發生兩個錯誤。passwd: Authentication token manipulation error 後接 passwd: password unchanged,表示您輸入的目前密碼錯誤,或存放 /etc/shadow 的檔案系統無法寫入;在復原模式中,後者是正常狀態。You must choose a longer password. 來自 /etc/pam.d/common-password 中的 pam_unix,會對一般使用者套用長度和相似度檢查。
在大多數 VPS 映像中,預設帳戶(ubuntu,或供應商提供的其他名稱)完全沒有密碼,只有 SSH 金鑰。passwd 沒有可供核對的目前密碼,因此無法通過第一個提示。請改用 sudo passwd $USER;這是因為該映像的 sudoers drop-in 檔案允許該帳戶免密碼執行 sudo。
使用 sudo passwd 變更其他使用者的密碼
sudo passwd deployroot 不會被要求輸入舊密碼,而 pam_unix 會略過套用至一般使用者的密碼強度檢查。因此,root 可以設定使用者無法自行設定的密碼。
鎖定是獨立的操作。sudo passwd -l deploy 會在儲存的雜湊值前加上 !,因此任何密碼都無法通過比對。sudo passwd -u deploy 會移除該字元。使用 sudo passwd -S deploy 讀取目前狀態。
鎖定密碼不會阻止該使用者登入。其 ~/.ssh/authorized_keys 中的任何金鑰仍然有效,因為公開金鑰驗證不會讀取 /etc/shadow。若要完全停用帳戶,請將帳戶本身設為過期:
sudo usermod --expiredate 1 deploy這會將帳戶到期日設為 1970 年的日期,因此無論提供何種認證,sshd 都會拒絕登入。使用 sudo usermod --expiredate '' deploy 取消此設定。
避免使用 passwd -d。它會設定空密碼,而不是鎖定密碼;在較舊的版本中,如果 PAM 堆疊仍包含 nullok,空密碼便是任何人都能使用的密碼。
VPS 上的 root 需要密碼嗎?
Ubuntu 預設會鎖定 root。/etc/shadow 會保留 !,而不是雜湊值;sudo passwd -S root 會輸出以 root L 開頭的行。在設定密碼之前,任何人都無法使用密碼以 root 登入。因此,映像檔會改為提供具備 sudo 權限的使用者。應遵循 VPS 上的最低權限使用者帳戶,而不是以 root 身分操作。
設定 root 密碼只會提供一項功能:透過供應商主控台登入。該主控台會在網路堆疊下方連接虛擬機器,因此即使 sshd 設定錯誤或防火牆規則有誤,仍可使用。這也會帶來代價。當 root 設有密碼時,GRUB 復原選單中的 root shell 會要求輸入 root 密碼。因此,原本可用來重設遺忘密碼的工具,現在也受同一組密碼保護。
設定 root 密碼不會讓 root 能夠透過 SSH 登入。Ubuntu 預設會啟用 PermitRootLogin prohibit-password,表示只能使用金鑰。請檢查伺服器實際使用的設定:
sudo sshd -T | grep -i permitrootloginsshd -T 會在解析每個 Include 行後,輸出有效設定。因此,當 /etc/ssh/sshd_config.d/ 存放 drop-in 檔案時,這是唯一可靠的答案。
使用 chpasswd 從指令碼設定密碼
passwd 會從終端機讀取輸入,無法由指令碼驅動。chpasswd 會從標準輸入讀取 user:password 組配對,每行一組。
printf '%s:%s\n' 'deploy' "$NEW_PASSWORD" | sudo chpasswd這樣可以運作,但會將純文字密碼寫入 shell 歷程記錄和 CI(持續整合)記錄。請先建立雜湊值:
HASH=$(openssl passwd -6)
printf '%s:%s\n' 'deploy' "$HASH" | sudo chpasswd -eopenssl passwd -6 會在不回顯的情況下提示輸入密碼 2 次,然後輸出以 $6$ 開頭的 SHA-512 crypt 雜湊值。-e 會告訴 chpasswd 第二個欄位已經是雜湊值,因此會原樣複製到 /etc/shadow。這個雜湊值可以安全地儲存在儲存庫或 CI 變數中,純文字密碼也不會離開您輸入密碼的那台機器。
Ubuntu 24.04 在 passwd 設定新密碼時,會使用 yescrypt($y$)建立雜湊值;openssl passwd -6 則會使用 SHA-512。兩種格式都能在登入時驗證,因為 libxcrypt 可以讀取這兩種格式。混用兩種格式沒有問題,而且 openssl passwd -6 在每個 Ubuntu LTS 版本上的行為都相同;chpasswd -c YESCRYPT 則不同:20.04 的舊版 shadow 套件不認得該方法名稱。
如何檢查密碼是否確實變更?
先檢查中繼資料,再透過登入驗證。
sudo passwd -S deploydeploy P 08/01/2026 0 99999 7 -1第二個欄位是狀態:可使用的密碼為 P,已鎖定為 L,完全沒有密碼為 NP。日期是密碼上次變更的時間,因此應顯示今天。後面的數字是下文說明的密碼期限欄位。
最安全的即時測試是直接使用 sudo。sudo -k 會捨棄快取的時間戳記,而 sudo -v 會強制顯示新的提示。如果新密碼在此處獲得接受,表示 PAM 已接受該密碼,且目前工作階段不會受到影響。
sudo -k && sudo -v若要測試其他帳戶,請從非特權 shell 執行 su - deploy。不要執行 sudo su - deploy,因為 root 不會被要求輸入密碼,這項測試無法證明任何事情。輸入錯誤的密碼時會顯示 su: Authentication failure。
真正的測試,是在目前工作階段仍保持開啟的情況下,從筆記型電腦建立新的 SSH 登入:
ssh -o PubkeyAuthentication=no deploy@203.0.113.10這裡的 Permission denied (publickey). 表示伺服器從未提供密碼驗證,因此無論如何變更密碼,都無法使用密碼登入。Permission denied, please try again. 表示伺服器確實提供了密碼驗證,但拒絕了您輸入的密碼。
使用 chage 強制下次登入時變更密碼
sudo chage -d 0 deploy-d 0 會將上次變更日期設為 epoch,因此 PAM 會將密碼視為已過期。下一次互動式登入時,系統會先要求輸入目前的密碼,再要求設定新密碼,之後才提供 shell。sudo passwd -e deploy 的作用完全相同。
僅對使用密碼進行互動式登入的帳戶使用此設定。密碼過期也會影響基於金鑰的登入,因為即使驗證是由金鑰完成,sshd 仍會執行 PAM account 階段。指令碼中的 ssh deploy@203.0.113.10 'systemctl restart app' 會因下列訊息而失敗並停止:
Password change required but no TTY available.該行之後的內容都不會執行,工作只會回報非零結束代碼。
密碼老化欄位的含義
sudo chage -l deployLast password change : Aug 01, 2026
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7這些數字是該使用者在 /etc/shadow 該行中的第 4 到第 8 個欄位。最短天數(chage -m)是使用者再次變更密碼前必須等待的時間,可避免使用者在被強制變更密碼後立即改回舊密碼。最長天數(chage -M)是密碼維持有效的時間。警告天數(chage -W)是登入開始顯示警告的時間。停用天數(chage -I)是密碼到期後,在完全拒絕該密碼前的寬限期。帳戶到期日(chage -E)是固定日期,且與密碼無關。
sudo chage -M 90 -W 14 deploy只有在政策要求時才設定此值。NIST(美國國家標準暨技術研究院)自 2017 年起便不建議例行性密碼到期,因為這會促使使用者對同一個密碼採用可預測的變化形式;NIST 建議在有證據顯示密碼遭到破解時強制變更。使用 password manager 保存長且唯一的密碼,再搭配以金鑰為基礎的 SSH,安全性優於每 90 天變更一次密碼的週期。
遺失 root 密碼時的處理方式
如果伺服器上的任何帳戶都能執行 sudo,就不需要復原:sudo passwd root 會設定新的密碼。真正棘手的情況是完全沒有可用的登入方式。
以下所有操作都需要使用供應商主控台。大多數控制面板會將其列為 VNC(virtual network computing)或序列主控台。它會連接到網路堆疊下方的虛擬機器,因此 sshd 設定和防火牆規則不會影響它。
- 從控制面板重新啟動伺服器,並監看主控台。
- 開啟 GRUB 選單。雲端映像通常會設定
GRUB_TIMEOUT=0,因此在 BIOS 開機時按住Shift,或在 UEFI 開機時於重新啟動開始後立即反覆按下Esc。 - 選擇
Advanced options for Ubuntu,接著選擇以(recovery mode)結尾的項目,然後在復原選單中選擇root。 - 先執行
mount -o remount,rw /。復原模式會以唯讀方式掛載 root 檔案系統,因此若未執行此步驟,passwd會因無法寫入/etc/shadow而以passwd: Authentication token manipulation error失敗。 - 對所需帳戶執行
passwd ubuntu,然後從控制面板重新啟動。
如果 root 已設定密碼,而你遺失的正是該密碼,復原 shell 會要求輸入密碼,因此無法繼續此流程。請改為開機進入供應商的救援映像,然後掛載實體磁碟,並在其中變更密碼。
lsblk
sudo mount /dev/vda1 /mnt
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo chroot /mnt passwd ubuntu
sudo umount -R /mnt請從 lsblk 讀取分割區配置,不要直接複製本頁的 /dev/vda1。root 分割區通常是較大的分割區。在 UEFI 映像中,它會位於一個小型 EFI 分割區旁邊;該分割區完全不包含 /etc 目錄。
SSH 停止接受密碼時的處理方式
請使用仍在使用中的工作階段。如果已沒有任何工作階段,請使用主控台。
Permission denied, please try again. 表示伺服器提供密碼驗證,但拒絕了您傳送的密碼。常見原因是 Caps Lock 開啟,或主控台鍵盤配置與設定密碼時使用的配置不同。
Permission denied (publickey). 表示伺服器完全沒有提供密碼驗證。PasswordAuthentication no 已在某處設定;在 Ubuntu 22.04 及更新版本中,該設定通常位於 /etc/ssh/sshd_config.d/ 下的 drop-in 檔案中,並會覆寫主要設定檔。請讀取實際生效的值:
sudo sshd -T | grep -Ei 'passwordauthentication|kbdinteractiveauthentication|permitrootlogin'KbdInteractiveAuthentication yes 與 PasswordAuthentication no 同時啟用時,仍可使用密碼登入,因為 keyboard-interactive 方法會執行相同的 PAM 堆疊。關閉其中一項、保留另一項啟用,會使看似僅接受金鑰的伺服器繼續接受輸入的密碼。
中斷連線訊息中的 Too many authentication failures 表示用戶端先提供了多個金鑰,之後才嘗試密碼,而伺服器已達到 MaxAuthTries;預設值為 6。請強制使用單一方法:
ssh -o IdentitiesOnly=yes -o PubkeyAuthentication=no deploy@203.0.113.10在剛才還能使用的連接埠上出現 Connection refused,通常表示 監控 SSH 的 fail2ban 在多次驗證失敗後封鎖了您的位址。其預設封鎖規則會拒絕封包,而不是直接丟棄封包,因此拒絕訊息會快速返回,不會逾時。請從主控台執行 sudo fail2ban-client status sshd 列出遭封鎖的位址,並執行 sudo fail2ban-client set sshd unbanip 203.0.113.10 清除您的位址。
密碼只是過渡,金鑰才是最終狀態
可透過 SSH 使用的密碼,就是網際網路上的所有掃描器都能嘗試猜測的密碼。改用以金鑰為基礎的驗證後,猜測密碼就不再有效。產生金鑰組、安裝公開金鑰,並在變更其他設定前,從第二個終端機確認金鑰可以讓您登入。SSH 金鑰管理基礎涵蓋金鑰產生、authorized_keys 和複雜密碼。
接著關閉密碼驗證,並使用 sudo sshd -T 確認設定,而不要只相信您編輯過的檔案。強化 VPS 上的 SSH會逐一說明值得變更的其餘 sshd 設定;新 VPS 上線後的前 10 分鐘則按照在全新伺服器上應採用的順序排列這些操作。
之後仍保留一組密碼。只有金鑰可登入的伺服器若 sshd 設定損壞,就只能透過供應商主控台存取,而該主控台會要求使用者名稱和密碼。保留一個您已妥善儲存的強密碼帳戶,才能在 5 分鐘內修復問題,而不必重新安裝。
FAQ
如果不知道舊的 root 密碼,如何變更 VPS 上的 root 密碼?
以可執行 sudo 的使用者登入,然後執行 sudo passwd root。此命令不會要求舊密碼,因為 sudo 已經完成您的身分驗證。如果此系統上的任何帳戶都無法執行 sudo,請開啟供應商主控台,重新開機並進入 GRUB 復原選單,選擇 root shell 項目,執行 mount -o remount,rw /,然後執行 passwd。如果 root 已設定密碼,而您遺失的正是該密碼,復原 shell 會要求輸入該密碼。此時只能使用供應商的救援映像,掛載磁碟後執行 chroot。
為什麼 passwd 會顯示「Authentication token manipulation error」?
有兩個原因會產生此訊息。常見原因是在 Current password: 提示中輸入了錯誤答案,而下方的 passwd: password unchanged 行會確認沒有寫入任何內容。另一個原因是檔案系統無法寫入。復原模式中會遇到此問題,因為其中的 / 會以唯讀方式掛載。執行 mount -o remount,rw / 後再試一次。
變更 Linux 密碼也會變更 sudo 密碼嗎?
會。sudo 本身沒有獨立的密碼。它會透過 PAM,使用與 SSH 和 su 相同的 /etc/shadow 項目驗證您的身分,因此每個帳戶只有一組密碼。這也是變更密碼後第一次出現的 sudo 提示可作為實際測試的原因。在仍有可用工作階段時,執行 sudo -k && sudo -v 以強制顯示該提示。
變更密碼會使 SSH 金鑰或目前開啟的工作階段失效嗎?
不會。公開金鑰驗證不會讀取 /etc/shadow,因此在變更密碼、執行 passwd -l 或執行 chage -d 0 後,金鑰仍可正常使用。已開啟的工作階段會保持連線,因為 SSH 只會在登入時檢查認證。即時工作階段中唯一會變更的項目是 sudo;其 15 分鐘時間戳記到期後,會要求輸入新密碼一次。
如何強制使用者在下次登入時變更密碼?
執行 sudo chage -d 0 deploy,或執行 sudo passwd -e deploy;兩者作用相同。儲存的上次變更日期會移至 epoch,PAM 會將密碼視為已過期,而下一次互動式登入必須先設定新密碼,才能啟動 shell。請勿對透過 SSH 執行指令碼的帳戶採用此設定,否則非互動式指令會以 Password change required but no TTY available. 失敗,且不會執行。