在 Linux 上配置 SSH 免密码登录,最推荐的方式是生成 SSH 密钥对并将公钥部署到目标服务器的 authorized_keys 文件中,适合需要频繁远程登录、自动化脚本执行或集群管理的场景。
先说结论:SSH 免密码登录通过公钥认证机制实现,配置过程简单但需要注意权限设置和密钥保管,配置完成后能显著提升运维效率。
- 适合:需要频繁登录多台服务器、自动化部署脚本、集群节点间通信的场景
- 先准备:确认 SSH 服务已安装运行、目标服务器可网络连接、有目标服务器的登录凭证
- 验收:使用 ssh 命令直接登录目标服务器,无需输入密码即表示配置成功
命令速用版
如果只是想快速完成配置,以下是核心命令序列:
# 1. 生成 SSH 密钥对(本地机器执行)
ssh-keygen -t rsa -b 2048
# 2. 将公钥复制到远程服务器
ssh-copy-id username@remote_host
# 3. 测试免密登录
ssh username@remote_host如果 ssh-copy-id 命令不可用,可以手动复制公钥:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'为什么会这样
SSH 免密码登录的原理是基于非对称加密的公钥认证机制。你在本地生成一对密钥:私钥(id_rsa)保存在本地,公钥(id_rsa.pub)放到远程服务器的~/.ssh/authorized_keys 文件中。
当你发起 SSH 连接时,服务器会用公钥加密一段挑战信息,只有持有对应私钥的客户端才能解密并返回正确响应。这个过程不需要输入密码,但安全性依赖于私钥的保管。
需要注意的是,免密码登录不等于无安全保护。私钥本身可以设置密码短语(passphrase)来增加一层保护,但如果私钥文件泄露,持有者就能访问你的服务器。
分步处理
第一步:检查现有密钥
在生成新密钥前,先确认本地是否已有密钥对,避免覆盖现有密钥:
ls -la ~/.ssh/如果看到 id_rsa 和 id_rsa.pub 文件,说明已有密钥对,可以跳过生成步骤。
第二步:生成 SSH 密钥对
在本地机器(发起连接的机器)上执行:
ssh-keygen -t rsa -b 2048命令会提示你:
- 密钥保存路径:直接回车使用默认路径(~/.ssh/id_rsa)
- 密码短语(passphrase):如果追求方便可以留空,但建议设置以增加安全性
生成完成后,~/.ssh/目录下会有两个文件:id_rsa(私钥,必须保密)和 id_rsa.pub(公钥,可以分发)。
第三步:将公钥部署到远程服务器
方法一(推荐):使用 ssh-copy-id 命令
ssh-copy-id username@remote_host首次执行时需要输入一次远程服务器的密码,之后公钥会自动添加到远程的~/.ssh/authorized_keys 文件中。
方法二:手动复制
# 查看公钥内容
cat ~/.ssh/id_rsa.pub
# 登录远程服务器后,将公钥内容追加到 authorized_keys
echo "公钥内容" >> ~/.ssh/authorized_keys第四步:检查远程服务器权限
远程服务器上的相关文件权限必须正确,否则 SSH 会拒绝公钥认证:
# 在远程服务器上执行
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 400 ~/.ssh/authorized_keys # 也可设置为只读权限过于宽松(如 777)会导致 SSH 出于安全考虑拒绝使用公钥认证。
第五步:配置 SSH 服务端(可选)
如果需要禁用密码登录只允许密钥登录,在远程服务器上编辑/etc/ssh/sshd_config:
PubkeyAuthentication yes
PasswordAuthentication no修改后重启 SSH 服务:
sudo service ssh restart
# 或
sudo systemctl restart sshd注意:在确认密钥登录正常工作前,不要禁用密码认证,否则可能把自己锁在服务器外面。
怎么验证是否生效
配置完成后,在本地机器执行:
ssh -v username@remote_host使用-v 参数可以查看详细日志。如果配置成功,你会看到类似输出:
Offering public key: /home/user/.ssh/id_rsa
Authentication succeeded (publickey).如果仍然提示输入密码,检查以下几点:
- 远程服务器~/.ssh/authorized_keys 文件是否包含你的公钥
- 远程服务器~/.ssh 目录和 authorized_keys 文件权限是否正确
- 远程服务器/etc/ssh/sshd_config 中 PubkeyAuthentication 是否启用
- 本地私钥文件权限是否过于开放(应为 600)
常见坑
1. 权限问题导致公钥认证失败
这是最常见的问题。远程服务器上~/.ssh 目录权限应为 700,authorized_keys 文件权限应为 600 或 400。权限过宽会被 SSH 拒绝。
2. 不同用户密钥不通用
每个用户的密钥存放在各自家目录的.ssh 文件夹中。root 用户的密钥在/root/.ssh,普通用户在/home/username/.ssh。用哪个用户登录就要用对应用户的密钥。
3. 多密钥环境需要指定密钥文件
如果本地有多个密钥对,可以在~/.ssh/config 中配置:
Host myserver
HostName 192.168.1.100
User username
IdentityFile ~/.ssh/id_rsa之后使用 ssh myserver 即可自动使用指定密钥。
4. 首次连接需要确认主机指纹
第一次连接新服务器时会提示确认主机指纹,输入 yes 后服务器会加入 known_hosts 文件。如果服务器重装或密钥变更,需要清理 known_hosts 中对应条目。
5. 私钥保管不当的安全风险
免密码登录的便利性建立在私钥安全的基础上。如果私钥泄露,攻击者可以直接访问你的服务器。建议:
- 私钥文件权限设置为 600
- 生成密钥时设置密码短语
- 不要将私钥上传到公共仓库或共享
- 定期轮换密钥
6. 禁用密码登录前务必测试
在修改 sshd_config 禁用密码认证前,一定要先用新开的终端窗口测试密钥登录是否成功。如果配置有误,保留密码认证可以作为回退手段。
参考来源
- Linux 如何设置无密码 SSH 登录 - 技术教程知识库
- Linux 服务器配置 ssh 免密码登陆教程 - 技术教程知识库
- 如何在 Linux 中设置 SSH 无密码登录 - 技术教程知识库
- Linux 系统之间实现免密码登录 (SSH 无密码登录) - 技术教程知识库
- ssh 配置:在 Linux 中 ssh 配置无密码登陆完整步骤以及易错点分析 - 技术教程知识库
- Linux 如何设置 ssh 密钥 (免密码) 登录 - 技术教程知识库