Ubuntu VPS 如何變更 root 密碼?
使用 passwd、chpasswd 與 chage 變更 Ubuntu VPS 的 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整個操作就是這些。以下內容說明容易出錯的部分:在失去可用來修正問題的連線前,先確認新密碼可正常使用;從 script 設定密碼;刻意讓密碼過期;以及密碼遺失後重新登入。
在修改密碼前開啟第二個工作階段
現在開啟第二個 SSH 工作階段,並保持連線。只要還有一個已驗證的 shell 存在,本指南中幾乎所有失敗都能在 2 分鐘內修正;一旦最後一個工作階段關閉,就可能必須前往主控台處理。
已開啟的 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 的檔案系統無法寫入;這是 recovery mode 中的正常狀態。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 可以設定使用者無法自行設定的密碼。
鎖定密碼是另一項操作。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 stack 中包含 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 套件不認得該方法名稱。這些雜湊值在跨版本升級後仍可使用,因此將 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。它會在 network stack 下方連接至 virtual machine,因此不受 sshd 設定與防火牆規則影響。
- 從控制面板重新啟動伺服器,並監看主控台。
- 進入 GRUB 選單。Cloud image 通常會設定
GRUB_TIMEOUT=0,因此在 BIOS boot 時按住Shift,或在 UEFI boot 時從重新啟動開始就反覆按下Esc。 - 選擇
Advanced options for Ubuntu,再選擇結尾為(recovery mode)的項目,最後在 recovery menu 中選擇root。 - 先執行
mount -o remount,rw /。Recovery 會以唯讀模式掛載 root filesystem,因此若未執行此步驟,passwd會因無法寫入/etc/shadow而以passwd: Authentication token manipulation error失敗。 - 對需要的帳號執行
passwd ubuntu,然後從控制面板重新啟動伺服器。
如果 root 已經設定密碼,而你遺失的正是這組密碼,recovery 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 讀取 partition layout,不要直接複製本頁的 /dev/vda1。root partition 是容量較大的分割區。在 UEFI image 中,它會位於一個小型 EFI partition 旁邊;該分割區完全不包含 /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。關閉其中一項、保留另一項啟用,會使看似僅接受金鑰的伺服器繼續接受輸入的密碼。
中斷連線訊息中的 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. 而失敗,且不會執行。