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(需先安装)实现全自动,但本文面向新手,先用标准方式避免安全风险。
执行脚本时容易踩的坑
- known_hosts 冲突:如果目标服务器的 host key 已更改(比如重装系统),ssh 会询问是否确认连接,导致脚本卡住。解决方案:在
ssh-copy-id命令中添加-o StrictHostKeyChecking=no,但要注意这会降低安全性。更稳妥的做法是提前用ssh-keyscan把所有主机公钥导入~/.ssh/known_hosts。 - 权限问题:目标服务器上
.ssh目录权限必须是 700,authorized_keys文件必须是 600。如果推送后仍提示需要密码,可以手动登录一台目标机检查权限:ls -la ~/.ssh/。 - 非标准端口:如果目标 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_config 中 PasswordAuthentication yes,重启 sshd 后再执行脚本。
Q:脚本中每次都要输入密码,能不能自动输入?
A:可以安装 sshpass,然后在脚本中使用 sshpass -p '你的密码' ssh-copy-id ...。但注意密码会以明文出现在脚本中,有安全风险,仅建议在测试环境使用。
Q:服务器太多,脚本执行很慢怎么办?
A:可以给循环加入 & 后台并行执行,但要注意控制并发数,避免网络拥塞。也可以使用 pssh 或 ansible 等更专业的工具。
如果你正在处理 SSH密钥批量配置免密登录多台服务器集群脚本,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。