SSH密钥批量配置免密登录多台服务器集群脚本实战

当你管理几十甚至上百台服务器时,每次登录都要输入密码会严重拖慢效率。
SSH密钥批量配置免密登录多台服务器集群脚本,就是帮你一次性把公钥推送到所有目标机器,之后 ssh、scp 都不再需要密码。
本文从零开始,手写一个适用于集群的批量配置脚本,并讲解常见坑点。

开始之前:确认环境与工具

在写脚本前,需要做好以下准备:

  • 一台管理节点(你操作的主机),上面已生成 SSH 密钥对。如果还没有,执行 ssh-keygen -t rsa -b 4096,一路回车即可生成默认密钥(~/.ssh/id_rsa.pub 为公钥)。
  • 一个包含所有目标服务器 IP 或主机名的列表文件,比如 server_list.txt,每行一个地址。
  • 确保管理节点能通过密码登录所有目标服务器(初次配置需要密码)。
  • 目标服务器上默认端口 22,如果改过端口需在脚本中指定。

如果你的管理节点是 Windows,可以通过 Git Bash 或 WSL 运行这些命令;
Linux/macOS 直接使用终端。

编写批量推送公钥的脚本

传统做法是手动对每台机器执行 ssh-copy-id user@ip,但集群环境下太慢。
下面是一个 Bash 脚本,自动读取 IP 列表并逐个推送:

#!/bin/bash
# SSH密钥批量配置免密登录多台服务器集群脚本

USER="root"                  # 登录使用的用户名
KEY_FILE="$HOME/.ssh/id_rsa.pub"  # 公钥路径
SERVER_LIST="server_list.txt"

if [ ! -f "$SERVER_LIST" ]; then
    echo "错误:服务器列表文件 $SERVER_LIST 不存在"
    exit 1
fi

if [ ! -f "$KEY_FILE" ]; then
    echo "错误:公钥文件 $KEY_FILE 不存在,请先执行 ssh-keygen"
    exit 1
fi

while IFS= read -r ip; do
    [ -z "$ip" ] && continue   # 跳过空行
    echo "正在配置 $ip ..."
    ssh-copy-id -i "$KEY_FILE" "${USER}@${ip}" 2>&1
    if [ $? -eq 0 ]; then
        echo "✔ $ip 配置成功"
    else
        echo "✘ $ip 配置失败,请检查密码或网络"
    fi
done < "$SERVER_LIST"

将上述内容保存为 batch_ssh_copy.sh,然后执行 chmod +x batch_ssh_copy.sh
第一次运行会提示输入目标服务器的密码,脚本会逐个处理。

注意:这个脚本每次执行都会交互式输入密码。
如果你不想手动输很多次,可以配合 sshpass(需先安装)实现全自动,但本文面向新手,先用标准方式避免安全风险。

执行脚本时容易踩的坑

  1. known_hosts 冲突:如果目标服务器的 host key 已更改(比如重装系统),ssh 会询问是否确认连接,导致脚本卡住。解决方案:在 ssh-copy-id 命令中添加 -o StrictHostKeyChecking=no,但要注意这会降低安全性。更稳妥的做法是提前用 ssh-keyscan 把所有主机公钥导入 ~/.ssh/known_hosts
  2. 权限问题:目标服务器上 .ssh 目录权限必须是 700,authorized_keys 文件必须是 600。如果推送后仍提示需要密码,可以手动登录一台目标机检查权限:ls -la ~/.ssh/
  3. 非标准端口:如果目标 SSH 端口不是 22,需要在 ssh-copy-id 后加 -p <端口号>,比如 ssh-copy-id -i key -p 2222 user@ip。脚本中可加入变量 SSH_PORT=2222

验证免密登录是否生效

脚本跑完后,挑几台机器试一下:

ssh root@192.168.1.101 "hostname && uptime"

如果不需要输密码就返回主机名和运行时间,说明配置成功。
你也可以写一个验证脚本,批量执行指定命令并记录结果:

while IFS= read -r ip; do
    [ -z "$ip" ] && continue
    echo "$ip: $(ssh -o ConnectTimeout=5 root@$ip hostname)"
done < server_list.txt

如果某台机器提示“Permission denied”,说明密钥没有正确推送,请回看避坑部分检查。

高频问题 FAQ

Q:传输密钥时提示“Permission denied (publickey)”?
A:说明目标服务器不允许密码登录,需要先在目标机上调整 /etc/ssh/sshd_configPasswordAuthentication yes,重启 sshd 后再执行脚本。

Q:脚本中每次都要输入密码,能不能自动输入?
A:可以安装 sshpass,然后在脚本中使用 sshpass -p '你的密码' ssh-copy-id ...。但注意密码会以明文出现在脚本中,有安全风险,仅建议在测试环境使用。

Q:服务器太多,脚本执行很慢怎么办?
A:可以给循环加入 & 后台并行执行,但要注意控制并发数,避免网络拥塞。也可以使用 psshansible 等更专业的工具。

如果你正在处理 SSH密钥批量配置免密登录多台服务器集群脚本,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。

分享到:
上一篇
多网卡绑定链路聚合提升服务器出口总带宽上限
下一篇
防火墙放行建站标准80 443 22端口完整规范配置
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意