在日常运维中,给多台服务器配置免密登录是个很常见的需求。虽然完全自动化很理想,但实际场景中往往需要手动输入一次密码来初始化。这里分享一个半自动化的脚本方案——它能批量处理多台服务器,你只需要在首次执行时输入一次密码,后续就全是免密操作了。

知识点解析

先说说核心思路:把本机的公钥自动追加到远程服务器~/.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

shell脚本实现服务器免密登录的实现

接下来,用 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

shell脚本实现服务器免密登录的实现

然后给脚本加上执行权限,运行它:

chmod +x mianmi.sh
./mianmi.sh

执行过程中,脚本会依次连接每台服务器,并提示你输入密码(第一次连接时)。之后,验证一下是否生效:

ssh root@192.168.88.102

如果能直接登录,不再需要密码,那就说明配置成功了。

本文转载于:https://www.jb51.net/jiaoben/3673715ea.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。