為什麼 SSH 還在要密碼
你配了金鑰,但 SSH 一直要密碼——意味著伺服器沒接受你的金鑰、退回到了密碼認證。原因幾乎總是六個之一:公鑰不在 authorized_keys、檔案或目錄權限太開放、用錯了使用者名稱、用戶端沒遞這把金鑰、sshd 關了金鑰認證、或 SELinux 標錯了檔案上下文。下面教你按「最快先查」找出是哪個。
六個原因
| # | 原因 | 檢查 |
|---|---|---|
| 1 | 金鑰不在 authorized_keys | 真的複製到這個使用者了嗎? |
| 2 | 權限太開放(最常見) | ~/.ssh 700、authorized_keys 600、家目錄非群組可寫 |
| 3 | 使用者名稱錯 | 金鑰按使用者分——裝在你登入的那個使用者下了嗎? |
| 4 | 用戶端沒遞金鑰 | ssh -v 顯示 "Offering public key…" 嗎? |
| 5 | sshd 不允許金鑰認證 | sshd_config 裡 PubkeyAuthentication yes? |
| 6 | SELinux 上下文錯 | RHEL/Fedora:restorecon -R ~/.ssh |
讓伺服器告訴你
最快的診斷是連線時看伺服器的認證記錄檔。從一個能用的工作階段(或主控台):
sudo tail -f /var/log/auth.log # Debian/Ubuntu
sudo journalctl -u ssh -f # systemd 它會明說原因——Authentication refused: bad ownership or modes for file …(就是原因 #2),或 user not allowed 等。用戶端側,ssh -v user@host 顯示你的金鑰到底有沒有被遞出(原因 #4)。
頭號修法:權限
authorized_keys 太可讀時 OpenSSH 會默默忽略。在伺服器上,對登入使用者:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R $USER:$USER ~/.ssh 也確認你的家目錄不是群組/全員可寫(chmod g-w,o-w ~)。「金鑰裝了還要密碼」的大多數情況都是這個原因。用戶端側對應的鏡像問題——你的私鑰太開放——是 UNPROTECTED PRIVATE KEY FILE。
其它修法
- 金鑰沒裝 / 使用者錯——用 ssh-copy-id 重新複製到對的帳號。給
root裝了不等於能用ubuntu登入。 - 用戶端沒遞——指向對的金鑰:
ssh -i ~/.ssh/mykey user@host,或見 指定金鑰。 - sshd 關了——在
/etc/ssh/sshd_config設PubkeyAuthentication yes,然後sudo systemctl restart ssh。
在手機上
這事在行動端的痛點是讀冗長記錄檔、把它和原因對上。只要你對那臺機器還有任何能用的工作階段,選中 auth.log 那行問助手——TermAI 的 AI 讀它,告訴你是權限問題還是缺金鑰還是設定問題,並給確切命令。而且因為 TermAI 把金鑰存在裝置 Keychain 並替你部署,用戶端側的原因(遞錯金鑰、私鑰權限不對)壓根不會發生。
常見問題
加了金鑰後 SSH 為什麼還要密碼?
伺服器沒接受金鑰、退回密碼。多半是 ~/.ssh(700)或 authorized_keys(600)權限太開放、金鑰在錯的使用者下、或根本沒加。查 /var/log/auth.log。
怎麼確認金鑰被遞出了?
跑 ssh -v user@host——找 "Offering public key"。沒有的話用 -i 指向金鑰。
它說 "bad ownership or modes" 怎麼辦?
那是權限原因:chmod 700 ~/.ssh、chmod 600 ~/.ssh/authorized_keys,並確認家目錄非群組可寫。
會不會是伺服器關了金鑰認證?
會——查 /etc/ssh/sshd_config 的 PubkeyAuthentication yes 並重啟 sshd。
快速事實
- 含義:伺服器拒了你的金鑰、退回密碼
- 頭號原因:權限——
~/.ssh700、authorized_keys600、家目錄非群組可寫 - 診斷:伺服器
/var/log/auth.log,用戶端ssh -v - 還有:使用者錯、沒遞金鑰、
PubkeyAuthentication no、SELinux 上下文
Free on iOS and Android. 5 AI requests/day on the free tier, plus unlimited SSH/SFTP and built-in Tailscale.