SSD Nodes Learn 🎉 VPS $4.99/月起
指南 Matt Connor作者: Matt Connor · 已更新 2026-08-13

Ubuntu VPS 如何變更 root 密碼?

使用 passwd、chpasswd 與 chage 變更 Ubuntu VPS 的 root 或使用者密碼,確認新密碼有效,並在 SSH 或 root 密碼遺失時重新登入。

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, August 1, 2026.

如何在 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 變更自己的密碼

passwd
Changing 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 deploy

root 不會被要求輸入舊密碼,而 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 permitrootlogin

sshd -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 -e

openssl 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 deploy
deploy P 08/01/2026 0 99999 7 -1

第二個欄位是狀態:P 表示密碼可使用,L 表示已鎖定,NP 表示完全沒有密碼。日期是密碼上次變更的時間,因此應顯示今天的日期。後面的數字是下文說明的密碼期限欄位。

最安全的即時測試是直接執行 sudosudo -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 deploy
Last 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 設定與防火牆規則影響。

  1. 從控制面板重新啟動伺服器,並監看主控台。
  2. 進入 GRUB 選單。Cloud image 通常會設定 GRUB_TIMEOUT=0,因此在 BIOS boot 時按住 Shift,或在 UEFI boot 時從重新啟動開始就反覆按下 Esc
  3. 選擇 Advanced options for Ubuntu,再選擇結尾為 (recovery mode) 的項目,最後在 recovery menu 中選擇 root
  4. 先執行 mount -o remount,rw /。Recovery 會以唯讀模式掛載 root filesystem,因此若未執行此步驟,passwd 會因無法寫入 /etc/shadow 而以 passwd: Authentication token manipulation error 失敗。
  5. 對需要的帳號執行 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 yesPasswordAuthentication 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. 而失敗,且不會執行。

#vps#ubuntu#passwords#ssh#server-security