SSH密钥批量配置免密登录多台服务器集群实操教程
SSH密钥批量配置免密登录多台服务器集群,最实用的做法是:在管理机上生成一对密钥,再用一条循环命令把公钥依次推送到各台服务器,最后通过免密登录命令验证。
整个过程不需要逐台输入密码,也不需要借助第三方软件,适合刚接触集群运维的读者直接照做。
动手前需要准备什么
开始前请确认三件事:
- 管理机(你当前操作的电脑或跳板机)已安装
ssh和ssh-copy-id,大多数 Linux 发行版默认自带。 - 已获取每台目标服务器的 IP、SSH 端口(默认 22)和登录账号,且当前密码可正常登录。
- 目标服务器之间的系统版本可以不一致,但建议都支持 SSH 协议。
如果目标服务器数量很多,建议先准备一个文本文件 hosts.txt,每行写一台服务器的 IP 或域名,方便后续批量读取。
第一步:生成SSH密钥对
在管理机上执行:
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
参数说明:-t rsa 指定密钥类型,-b 4096 表示密钥长度,-N "" 表示空密码(免密登录不需要额外输入私钥密码),-f 指定保存路径。
执行后会在 ~/.ssh/ 下生成私钥 id_rsa 和公钥 id_rsa.pub。
如果之前已生成过密钥,想重新生成可以加 -y 参数覆盖,但建议先备份旧密钥,避免影响已有环境。
第二步:批量推送公钥到集群服务器
常见做法是循环读取 IP 列表,逐台执行 ssh-copy-id。
命令如下:
while read host; do
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@$host
if [ $? -eq 0 ]; then
echo "$host 配置成功"
else
echo "$host 配置失败"
fi
done < hosts.txt
这条循环命令会依次读取 hosts.txt 中的 IP,手动输入一次密码后,公钥就会追加到目标服务器的 ~/.ssh/authorized_keys 文件中。
如果服务器用户名不同,把 root 换成对应用户即可。
若 SSH 端口非 22,修改 -p 后面的数字。
对于没有 ssh-copy-id 命令的系统,可以用下面命令替代:
cat ~/.ssh/id_rsa.pub | ssh root@host "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
批量执行时建议在脚本里加上 -o StrictHostKeyChecking=no,避免第一次连接时提示确认指纹导致脚本卡住:
ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub -p 22 root@$host
第三步:验证免密登录是否生效
批量配置完成后,从管理机直接 SSH 连接任意一台服务器:
ssh root@192.168.1.101
如果不再提示输入密码,直接进入命令行,说明该台服务器免密登录配置成功。
如果想批量验证整个集群,可以用循环命令逐台执行:
while read host; do
ssh -o BatchMode=yes -o ConnectTimeout=3 root@$host "echo $host 免密登录正常"
done < hosts.txt
BatchMode=yes 表示禁止交互输入密码,如果配置失败会直接报错,不会卡住脚本。
能看到每台服务器返回“免密登录正常”,说明集群免密配置全部生效。
避坑指南:这些细节最容易出错
- 权限错误:如果目标服务器上的
~/.ssh或authorized_keys权限过宽,SSH 会拒绝使用密钥。确保.ssh为 700,authorized_keys为 600。 - 错误用户:公钥推到了 root 用户下,登录时却用了普通用户,免密必然失败。要保证推送和登录使用同一账号。
- known_hosts 冲突:服务器重装系统后指纹会变化,导致连接失败。可以提前使用
-o StrictHostKeyChecking=no跳过检查,或清理~/.ssh/known_hosts中对应记录。 - 大批量场景:如果服务器超过几十台,建议在
hosts.txt中分批处理,避免单次密码输入超时导致后半段失败。 - 私钥权限:管理机上的
~/.ssh/id_rsa权限建议为 600,否则 SSH 会提示权限不安全而拒绝使用。
常见疑问:一次说清
公钥推送后立刻生效吗?
是的,追加到 authorized_keys 后立即生效,不需要重启 SSH 服务。
所有服务器必须用同一个公钥吗?
可以,集群内共用同一把公钥便于管理;如果安全要求更高,建议每台服务器独立密钥并定期轮换。
不想用密码脚本,有没有更安全的方式?
可以用 Ansible 的 authorized_key 模块或 SSH 证书认证,但前期准备更复杂,适合已经具备自动化运维基础的场景。
按照上面的步骤操作,你会得到一套能够直接免密登录整个集群的环境。
如果中途遇到“Permission denied”或“Connection refused”,优先检查账号、端口、防火墙和权限四个地方,绝大多数问题都出在这里。
若需要管理更复杂的集群环境,可以把本文的批量推送思路扩展成自动化脚本,配合定时任务或 CI/CD 工具使用。