为什么需要免密登录
每次 SSH 登录都要输入密码?管理多台服务器时更痛苦。配置一次免密登录,以后直接 ssh user@host 就能连上,省心省力。
三步搞定
第一步:生成密钥对
在本地机器执行:
ssh-keygen -t ed25519 -C "your_email@example.com"
一路回车即可(默认保存在 ~/.ssh/id_ed25519)。如果想更安全,设置一个 passphrase。
注意:如果系统不支持 ed25519,用 RSA:
ssh-keygen -t rsa -b 4096
第二步:复制公钥到服务器
一条命令搞定:
ssh-copy-id user@remote-server
如果 SSH 端口不是默认 22:
ssh-copy-id -p 2222 user@remote-server
这条命令会把你的公钥追加到服务器的 ~/.ssh/authorized_keys 文件。
第三步:测试连接
ssh user@remote-server
如果不再提示输入密码,恭喜,配置成功!
没有 ssh-copy-id 怎么办
某些系统(如 Windows、部分嵌入式设备)没有 ssh-copy-id,手动复制:
cat ~/.ssh/id_ed25519.pub | ssh user@remote-server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
或者用 scp:
scp ~/.ssh/id_ed25519.pub user@remote-server:~/
ssh user@remote-server "mkdir -p ~/.ssh && cat ~/id_ed25519.pub >> ~/.ssh/authorized_keys && rm ~/id_ed25519.pub && chmod 600 ~/.ssh/authorized_keys"
管理多台服务器
编辑 ~/.ssh/config,给服务器起别名:
# 开发服务器
Host dev
HostName 192.168.1.100
User deploy
Port 22
IdentityFile ~/.ssh/id_ed25519
# 生产服务器
Host prod
HostName 47.94.9.74
User root
Port 51990
IdentityFile ~/.ssh/id_ed25519
配置后直接:
ssh dev # 连接开发服务器
ssh prod # 连接生产服务器
常见问题
权限问题
SSH 对权限要求严格,确保:
# 本地
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
# 服务器
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
还是提示输入密码?
用 -v 参数调试:
ssh -v user@remote-server
常见原因:
- 服务器
~/.ssh或authorized_keys权限不对 - 服务器 SSH 配置禁用了公钥认证(检查
/etc/ssh/sshd_config中的PubkeyAuthentication yes) - SELinux 问题(CentOS/RHEL):执行
restorecon -R ~/.ssh
密钥丢了怎么办
如果有备份,恢复 ~/.ssh/id_ed25519 和 ~/.ssh/id_ed25519.pub。
如果没有备份,重新生成密钥,再 ssh-copy-id 到所有服务器。
安全建议
- 生产环境建议给私钥设置 passphrase
- 禁用密码登录:服务器
sshd_config设置PasswordAuthentication no - 定期轮换密钥
- 不要在公共仓库提交私钥(加入
.gitignore)
总结
SSH 免密登录核心就三步:
ssh-keygen生成密钥ssh-copy-id复制公钥ssh直接连接
配置 ~/.ssh/config 可以进一步简化,用别名代替完整的连接命令。