在自動化部署、集群互通、rsync 備份等場景,SSH 免密登入是基礎中的基礎。本文以 192.168.201.236(Client) → 192.168.201.237(Server) 為例,詳述從產生金鑰到驗證通聯的標準流程,並整理四大常見報錯的解決方案。
ssh -p 30330 user@237 免密登入 Serverssh-keygen -t rsa -b 4096 -C "auto-deploy@236"
# 一路 Enter(預設路徑 ~/.ssh/id_rsa,無密語)
產出:~/.ssh/id_rsa(私鑰,權限 600)與 ~/.ssh/id_rsa.pub(公鑰,權限 644)。
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 30330 user@192.168.201.237
# 若無 ssh-copy-id,手動執行:
cat ~/.ssh/id_rsa.pub | ssh -p 30330 user@237 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# 若家目錄權限過鬆(如 777),同樣會導致拒絕:
chmod 755 ~
原則: .ssh 只能擁有者讀寫執行;authorized_keys 只能擁有者讀寫;家目錄不可被群組/其他寫入。
ssh -p 30330 user@192.168.201.237
# 成功則直接進 Shell,無需輸入密碼
| 報錯訊息 | 原因 | 解決指令 |
|---|---|---|
POSSIBLE BREAK-IN ATTEMPT! |
反向 DNS 解析不一致 | Client/Server 同改 GSSAPIAuthentication no、Server 另加 UseDNS no 並 systemctl restart sshd |
Agent admitted failure to sign using the key. |
ssh-agent 未載入私鑰 | ssh-add ~/.ssh/id_rsa;若失敗 eval $(ssh-agent) && ssh-add |
| SELinux 阻擋 | sestatus 顯示 Enforcing |
暫時 setenforce 0;永久 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 後重開機 |
| 仍提示輸入密碼 | sshd_config 未啟用金鑰認證 | Server 確認 PubkeyAuthentication yes、AuthorizedKeysFile .ssh/authorized_keys、RSAAuthentication yes 皆未註解,重啟 sshd |
authorized_keys 找到對應公鑰,生成隨機挑戰字串,用公鑰加密傳回全程私鑰永不離開 Client,網路傳輸僅有公鑰加密資料,安全性遠高於密碼認證。
scp 至生產機最佳實踐清單:
ed25519 替代 RSA(更短、更快、更安全):ssh-keygen -t ed25519command="..." 限制可執行指令(authorized_keys 行首)PasswordAuthentication no(確認金鑰通後再關)