SSH配置免密登录,多服务器之间免密访问

在多台服务器之间来回切换时,每次都要输入密码确实很麻烦。
SSH免密登录就是通过密钥对代替密码验证,让你从一台机器直接登录另一台机器,不用再输密码。
这篇文章会带你从零开始,在两台或多台服务器之间配置SSH免密访问,并解决常见的权限和配置问题。

先搞清楚:免密登录到底靠什么

SSH免密登录依赖一对密钥:私钥和公钥。
私钥留在本地,公钥放到目标服务器的 ~/.ssh/authorized_keys 文件里。
当你发起连接时,服务器用公钥加密一段随机数据,只有持有私钥的客户端才能解密,验证通过后就允许登录。

整个过程不需要传输密码,比密码登录更安全,也适合自动化脚本和集群管理。

配置前,你需要确认:

  • 本地和远程服务器都安装了OpenSSH客户端和服务端(大多数Linux发行版默认已装)。
  • 你知道远程服务器的IP、SSH端口、登录用户名。
  • 本地用户对 ~/.ssh 目录有写权限。

生成密钥对并分发公钥

第一步是在本地生成密钥对。
打开终端,执行:

ssh-keygen -t rsa -b 4096

连续按回车,使用默认路径 ~/.ssh/id_rsa,密码短语可以留空(直接回车),这样登录时完全不用输入任何密码。
如果对安全性要求高,可以设置一个密码短语,再配合 ssh-agent 使用。

生成后会得到两个文件:

  • ~/.ssh/id_rsa:私钥,绝对不能泄露。
  • ~/.ssh/id_rsa.pub:公钥,需要复制到目标服务器。

随后把公钥复制到远程服务器。
最简单的方式是用 ssh-copy-id:

ssh-copy-id -p 22 user@192.168.1.100

把 user 换成远程用户名,192.168.1.100 换成目标IP,-p 指定SSH端口(默认22可省略)。
执行后会提示输入一次远程密码,成功后公钥会自动追加到远程的 ~/.ssh/authorized_keys 文件中。

如果没有 ssh-copy-id 命令,可以手动复制:

cat ~/.ssh/id_rsa.pub | ssh -p 22 user@192.168.1.100 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

这条命令会一次性创建目录、设置权限并写入公钥。

多台服务器之间互相免密

如果需要在多台服务器之间任意两两免密,比如A能免密登录B,B也能免密登录A,那就需要在每台服务器上都生成密钥对,然后把每台的公钥分发到其他所有服务器。

假设有三台机器:server1、server2、server3。

在每台机器上执行 ssh-keygen -t rsa -b 4096 生成各自的密钥对。

然后,在server1上把自己的公钥复制到server2和server3:

ssh-copy-id user@server2
ssh-copy-id user@server3

同样,在server2上把公钥复制到server1和server3,在server3上复制到server1和server2。

这样,每台服务器的 authorized_keys 里都包含了其他服务器的公钥,互相登录都不需要密码。

如果服务器数量较多,可以用循环批量分发:

for host in server2 server3; do
  ssh-copy-id user@$host
done

权限与配置避坑指南

免密登录失败,十有八九是权限问题。
SSH对文件和目录权限要求非常严格:

  • ~/.ssh 目录权限必须是 700。
  • ~/.ssh/authorized_keys 文件权限必须是 600。
  • 用户家目录 ~ 权限不能是 777,建议 755 或 700。

检查并修正:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 755 ~

另外,检查远程服务器的 /etc/ssh/sshd_config 中这几项:

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

如果修改了配置,需要重启SSH服务:

sudo systemctl restart sshd

注意:在重启sshd之前,务必保持当前SSH连接不要断开,并另外开一个窗口测试新连接,避免配置错误导致无法登录。

如果公司网络或云服务器有安全组,确保SSH端口(默认22)对来源IP开放。

验证免密是否生效

配置完成后,在本地直接执行:

ssh user@192.168.1.100

如果不再提示输入密码,直接进入远程命令行,说明免密登录成功。

你还可以用 -v 参数查看详细过程,确认使用的是公钥认证:

ssh -v user@192.168.1.100

输出中如果出现 Authenticated with public key 或类似字样,就表示公钥认证已生效。

对于多台服务器,可以写一个简单脚本一次性测试所有连接:

for host in server1 server2 server3; do
  echo "Testing $host..."
  ssh -o BatchMode=yes -o ConnectTimeout=3 user@$host "echo OK"
done

如果每台都返回OK,说明互相免密全部配置成功。

常见问题与快速排查

仍然提示输入密码:先检查 ~/.ssh/authorized_keys 内容是否正确,确保没有多余换行或空格。
再确认权限是否为600。

提示“Permission denied (publickey)”:通常是公钥没有正确写入,或者sshd_config中禁用了PubkeyAuthentication。
查看远程服务器日志 /var/log/secure 或 /var/log/auth.log 获取具体原因。

多台服务器之间有的通有的不通:检查是否每台机器的公钥都分发到了所有其他机器。
可以手动在目标机器上查看 authorized_keys 是否包含来源机器的公钥。

想更安全地管理私钥:可以为私钥设置密码短语,然后使用 ssh-agent 缓存。
执行 eval $(ssh-agent) 启动代理,再运行 ssh-add ~/.ssh/id_rsa 输入一次密码短语,当前会话内就不用重复输入了。

按照以上步骤操作后,你应该已经实现了多台服务器之间的SSH免密访问。
如果遇到问题,优先回看权限和sshd配置这两个部分,大部分故障都能在那里找到答案。

分享到:
上一篇
运维灾备演练实操,模拟服务器宕机恢复网站:运维灾备演练
下一篇
SSH配置端口修改,减少端口扫描攻击:SSH端口修改教程
1
系统公告

关于香港云优质服务器IP地址更换的通知

尊敬的客户: 因原IP运营商大幅涨价,为避免成本转嫁至用户,我司决定更换IP服务商。本次更换后,您的续费价格将保持不变,且新IP网络质量与服务标准不受影响。新IP已分配至后台,即刻生效(更换的新IP都是香港原生IPv4)。 涉及 IP 段: 45.192.x.x 旧 IP 停用时间: 2026 年 12 月 1 日
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意