SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 已更新 2026-08-30

Ubuntu VPS 如何變更 root 密碼?

了解如何在 Ubuntu VPS 使用 passwd、chpasswd 與 chage 變更 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

整個操作只有這些步驟。以下內容說明容易發生問題的部分:在失去可用來修正問題的連線前,先確認新密碼可正常使用;從指令碼設定密碼;刻意讓密碼失效;以及在密碼已遺失時重新登入。

修改密碼前,先開啟第二個工作階段

現在開啟第二個 SSH 工作階段,並保持連線。只要仍有一個已驗證的 shell 開啟,本指南中幾乎所有故障都能在 2 分鐘內修正;等最後一個工作階段關閉後,通常就必須使用主控台處理。

已開啟的 shell 在其所屬帳號遭到修改、鎖定或設為過期後,仍可繼續運作,因為 SSH 只會在登入時檢查憑證,不會再次檢查。例外是 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 的檔案系統無法寫入;這是復原模式中的正常狀態。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 套用一般使用者的密碼強度檢查。因此,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 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 會要求輸入密碼兩次,且不回顯輸入內容,然後輸出以 $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。它會在網路堆疊下方連接至虛擬機器,因此 sshd 設定與防火牆規則不會影響它。

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

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