在日常运维中,给多台服务器配置免密登录是个很常见的需求。虽然完全自动化很理想,但实际场景中往往需要手动输入一次密码来初始化。这里分享一个半自动化的脚本方案——它能批量处理多台服务器,你只需要在首次执行时输入一次密码,后续就全是免密操作了。
知识点解析
先说说核心思路:把本机的公钥自动追加到远程服务器的 ~/.ssh/authorized_keys 文件里。这样,当你用私钥连接时,服务器就能认出来,直接放行,不再问密码。
要完成这件事,先得准备好一个服务器列表。脚本里用数组来存IP地址,要配几台就写几个:
# 生成一个数组,存储服务器的IP,配置几个服务器就写几个 SERVERS=("服务器1的地址" "服务器2的地址" "服务器3的地址")
然后就是密钥对的问题。SSH 生成的 RSA 密钥对是免密登录的基础:
如果本机还没有生成过密钥对,脚本会自动帮你创建一个:
[ ! -f $HOME/.ssh/id_rsa ] && ssh-keygen -t rsa -N "" -f $HOME/.ssh/id_rsa

接下来,用 ssh-copy-id 这个工具把公钥推到远程服务器上。它会把本地的公钥自动写入远程用户的 ~/.ssh/authorized_keys 文件,省去手动操作的麻烦。记住加上 -o StrictHostKeyChecking=no 参数,这样首次连接时就不会弹出“是否信任主机”的确认提示,脚本就不会卡住:
ssh-copy-id -o StrictHostKeyChecking=no $USER@server
这里的 $USER@$server 就是登录信息——比如 root@192.168.88.101。
完整脚本
⚠️ 重要注意事项
检查 SSH 服务状态:
# 1. 检查 SSH 服务状态 systemctl status sshd # 2. 如果没开启,启动服务 systemctl start sshd # 3. 设置开机自启(避免重启后失效) systemctl enable sshd
如果用的是 firewalld(CentOS/RHEL 系列默认),需要放行 22 端口:
# 1. 放行 22 端口 firewall-cmd --permanent --add-port=22/tcp # 2. 重载防火墙规则(让配置生效) firewall-cmd --reload # 3. 验证端口是否放行成功 firewall-cmd --list-ports
创建一个脚本文件,比如 mianmi.sh:
#!/bin/bash
SERVERS=("192.168.88.101" "192.168.88.102" "192.168.88.103")
USER="root"
[ ! -f $HOME/.ssh/id_rsa ] && ssh-keygen -t rsa -N "" -f $HOME/.ssh/id_rsa
for server in "${SERVERS[@]}"
do
echo "开始配置免密登录: $server"
ssh-copy-id -o StrictHostKeyChecking=no $USER@server
done

然后给脚本加上执行权限,运行它:
chmod +x mianmi.sh ./mianmi.sh
执行过程中,脚本会依次连接每台服务器,并提示你输入密码(第一次连接时)。之后,验证一下是否生效:
ssh root@192.168.88.102
如果能直接登录,不再需要密码,那就说明配置成功了。