Ubuntu VPS 如何變更 root 密碼?
了解如何在 Ubuntu VPS 使用 passwd、chpasswd 與 chage 變更 root 或使用者密碼,驗證新密碼;若 SSH 或 root 密碼遺失,也提供重新登入方法。
如何在 Ubuntu 上變更 VPS root 密碼
若要在 Ubuntu 上變更 VPS(virtual private server)的 root 密碼,請以可執行 sudo 的使用者建立 SSH(secure shell)連線,然後執行 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 開啟,本指南中幾乎所有故障都能在 2 分鐘內修正;等最後一個工作階段關閉後,通常就必須使用主控台處理。
已開啟的 shell 在其所屬帳號遭到修改、鎖定或設為過期後,仍可繼續運作,因為 SSH 只會在登入時檢查憑證,不會再次檢查。例外是 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 key。passwd 沒有可供驗證的目前密碼,因此無法通過第一個提示。改用 sudo passwd $USER,因為該映像檔的 sudoers drop-in 檔案允許此帳號免密碼執行 sudo。
使用 sudo passwd 變更其他使用者的密碼
sudo passwd deployroot 不會被要求輸入舊密碼,而 pam_unix 不會對 root 套用一般使用者的密碼強度檢查。因此,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。這會設定空密碼,而不是鎖定密碼。在仍將 nullok 納入 PAM 堆疊的舊版中,任何人都可以使用空密碼登入。
VPS 上的 root 需要密碼嗎?
Ubuntu 預設會鎖定 root。/etc/shadow 會以 ! 取代雜湊值,sudo passwd -S root 則會輸出以 root L 開頭的行。在設定密碼之前,任何人都無法使用密碼以 root 身分登入。因此,映像檔會改為提供具備 sudo 權限的使用者。應維持透過 VPS 上的最低權限使用者帳戶 操作,而不是直接使用 root。
設定 root 密碼只會帶來一項特定用途:提供透過供應商主控台登入的方式。該主控台位於網路堆疊下方,直接連接虛擬機器。因此,即使 sshd 設定錯誤或防火牆規則有誤,主控台仍可運作。但這也有代價。root 設定密碼後,GRUB 復原選單中的 root shell 會要求輸入該密碼。因此,原本可用來重設遺忘密碼的工具,現在也受到同一組密碼保護。
設定 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 會要求輸入密碼兩次,且不回顯輸入內容,然後輸出以 $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 套件不認得該方法名稱。這些雜湊值在升級版本後仍可使用,因此將 24.04 伺服器升級到 26.04不會要求你重設任何人的密碼。
如何確認密碼確實已變更?
先查看中繼資料,再透過登入加以驗證。
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 建議在有證據顯示密碼遭到入侵時,才強制變更密碼。使用密碼管理器保存的長且唯一密碼,再搭配以金鑰為基礎的 SSH 驗證,安全性優於每 90 天變更一次密碼。
忘記 root 密碼時的處理方式
只要系統上的任何帳戶都能執行 sudo,就不需要復原密碼:sudo passwd root 會設定新的密碼。真正棘手的情況是完全沒有可用的登入方式。
以下所有步驟都需要使用服務提供者的主控台。多數控制面板會將它列為 VNC(virtual network computing)或 serial console。它會在網路堆疊下方連接至虛擬機器,因此 sshd 設定與防火牆規則不會影響它。
- 從控制面板重新啟動伺服器,並監看主控台。
- 開啟 GRUB 選單。Cloud image 通常會設定
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 會要求輸入密碼,這條路徑便無法使用。請改為開機進入服務提供者的 rescue image,然後掛載實體磁碟,並在其中變更密碼。
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 image 上,它會位於一個小型 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 stack。關閉其中一項、保留另一項啟用,會讓看似只接受金鑰的伺服器繼續接受輸入的密碼。
拒絕金鑰登入時也會輸出相同訊息。因此,如果您提供的是金鑰而不是密碼,伺服器的密碼設定只是 Permission denied (publickey) 背後的五項問題之一,而 ssh -v 輸出會指出實際原因。
中斷連線訊息中的 Too many authentication failures 表示用戶端在嘗試密碼前先提供了數個金鑰,而伺服器已達到 MaxAuthTries;其預設值為 6。請強制使用單一方法:
ssh -o IdentitiesOnly=yes -o PubkeyAuthentication=no deploy@203.0.113.10在剛才仍可使用的連接埠上出現 Connection refused,通常表示 fail2ban 正在監控 SSH,並在多次失敗後封鎖了您的位址。其預設封鎖規則會拒絕封包,而不是直接丟棄封包,因此拒絕訊息會快速返回,不會逾時。在主控台中,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
如何在不知道舊密碼的情況下變更 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. 失敗,且不會執行。