首先,在本地生成SSH密钥对(如果还没有的话):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
创建一个文件servers.txt
vim servers.txt
内容如下:
10.145.114.1 password1 10.145.114.2 password2 10.145.114.3 password3 ...
vim distribute_keys.sh
#!/bin/bash # 本地公钥文件 PUBLIC_KEY_FILE=~/.ssh/id_rsa.pub # 检查公钥文件是否存在 if [ ! -f "$PUBLIC_KEY_FILE" ]; then echo "公钥文件不存在,请先生成SSH密钥对" exit 1 fi # 读取服务器列表 while IFS=' ' read -r HOST PASSWORD; do echo "正在处理 $HOST" # 使用expect自动输入密码 /usr/bin/expect << EOF set timeout 10 spawn ssh $HOST "mkdir -p ~/.ssh && chmod 700 ~/.ssh" expect { "*yes/no*" { send "yes\r"; exp_continue } "*assword:*" { send "$PASSWORD\r" } timeout { exit 1 } eof { exit 2 } } expect { "*assword:*" { exit 1 } timeout { exit 1 } eof { exit 0 } } spawn ssh $HOST "echo '$(cat $PUBLIC_KEY_FILE)' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" expect { "*assword:*" { send "$PASSWORD\r" } timeout { exit 1 } eof { exit 2 } } expect { "*assword:*" { exit 1 } timeout { exit 1 } eof { exit 0 } } EOF if [ $? -eq 0 ]; then echo "成功分发密钥到 $HOST" else echo "分发密钥到 $HOST 失败" fi done < servers.txt
sh distribute_keys.sh