1、背景介绍:
之前写过一篇关于两台服务器之间建立互信的文章,但是现在遇到的问题是20台ECS服务器之间都需要建立互信。如果还是用之前的方法,创建秘钥,scp公钥到其他的服务器授信文件,这样的操作在多台服务器之间显然效率低还容易出错。
2、解决思路:
创建秘钥就不用多说,注意位数(4096),等级高点。
解决难点:多次手动scp到其他服务器。创建一个单独的hosts.txt文件,专门存放服务器列表,然后通过脚本遍历列表,自动复制文件。为保证安全,密码需要单独输入。
3、实现步骤:
1、创建存放脚本文件的目录:
mkdir /root/c_ssh
2、创建hosts.txt
vim hosts.txt
server1.example.com
192.168.1.100
#server2.example.com # 注释行会被跳过
3、创建可执行脚本文件
vim setup_ssh_keys.sh
#!/bin/bash
# 检查是否提供了用户名
if [ -z "$1" ]; then
echo "Usage: $0 username"
exit 1
fi
USERNAME="$1"
HOSTSFILE="hosts.txt"
# 检查 hosts 文件是否存在
if [ ! -f "$HOSTSFILE" ]; then
echo "Error: File $HOSTSFILE not found!"
exit 1
fi
# 检查并创建 .ssh 目录
SSHDIR="$HOME/.ssh"
SSHKEY="$SSHDIR/id_rsa"
# 创建 .ssh 目录(如果不存在)
mkdir -p "$SSHDIR"
chmod 700 "$SSHDIR"
# 生成 SSH 密钥对(如果还没有的话)
if [ ! -f "$SSHKEY" ]; then
echo "Generating SSH key pair..."
ssh-keygen -t rsa -b 4096 -f "$SSHKEY" -N "" -q
if [ $? -ne 0 ]; then
echo "Error: Failed to generate SSH key pair."
exit 1
fi
echo "SSH key pair generated successfully."
else
echo "SSH key pair already exists."
fi
# 读取 hosts.txt 文件并分发公钥
echo "Starting SSH key distribution..."
while read -r HOST; do
# 跳过空行和注释行
if [ -z "$HOST" ] || [[ "$HOST" == \#* ]]; then
continue
fi
echo "Processing host: $HOST"
# 复制公钥到远程主机
ssh-copy-id -i "$SSHKEY.pub" "$USERNAME@$HOST"
if [ $? -eq 0 ]; then
echo "Successfully added key to $USERNAME@$HOST"
else
echo "Error: Failed to add key to $USERNAME@$HOST"
fi
done < "$HOSTSFILE"
echo "SSH key distribution completed."
4、给执行权限:
chmod +x setup_ssh_keys.sh

4、效果展示:
| 192.168.254.131 | 1 |
| 192.168.254.130 | 2 |
| 192.168.254.129 | 3 |
规划:从1通过root/web**与2/3建立互信,实现免密登录。

1、root用户
执行过程:

执行结果:

2、web**用户:
执行过程:

执行结果:


346

被折叠的 条评论
为什么被折叠?



