192.168.1.2 root 123456
192.168.1.3 root 123456
192.168.1.4 root 123456
#!/bin/bash
FILENAME=$1
if [ ! -n "$FILENAME" ]; then
echo "[ERROR]: no host ip address account file supplied!!!"
echo "Usage : $0 [host_ip_account.txt]"
exit 1
fi
yum install -y expect
HOSTSADDR=()
USERNAMES=()
PASSWORDS=()
while read line; do
if [ ! -n "$line" ]; then
break 1
fi
ip=$(echo $line | cut -d " " -f1)
user_name=$(echo $line | cut -d " " -f2)
pass_word=$(echo $line | cut -d " " -f3)
if [ ! -n "$ip" ]; then
echo "[ERROR]: File content format error,reason get [ip address] empty"
exit 1
fi
if [ ! -n "$user_name" ]; then
echo "[ERROR]: File content format error,reason get [user name] empty"
exit 1
fi
if [ ! -n "$pass_word" ]; then
echo "[ERROR]: File content format error,reason get [password] empty"
exit 1
fi
if [ "$ip" == "$user_name" ]; then
echo "[ERROR]: File content format error,reason invalid file format"
exit 1
fi
HOSTSADDR[${#HOSTSADDR[*]}]=$ip
USERNAMES[${#USERNAMES[*]}]=$user_name
PASSWORDS[${#PASSWORDS[*]}]=$pass_word
done <$FILENAME
[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -t rsa -p '' &>/dev/null
echo "#### [1] call ssh-keygen to generate key..."
for ((i = 0; i < ${#HOSTSADDR[@]}; i++)); do
ip=${HOSTSADDR[$i]}
user_name=${USERNAMES[$i]}
pass_word=${PASSWORDS[$i]}
echo "IP:$ip User:$user_name Password:$pass_word"
expect <<EOF
spawn ssh $user_name@$ip "rm -rf ~/.ssh; ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa -q"
expect {
"yes/no" { send "yes\n";exp_continue}
"password" { send "$pass_word\n"}
}
expect eof
EOF
done
echo "#### [2] copy remote public key to local..."
TMP_AUTHORIZED_KEYS="./.id_rsa.pub.$ip.tmp"
for ((i = 0; i < ${#HOSTSADDR[@]}; i++)); do
ip=${HOSTSADDR[$i]}
user_name=${USERNAMES[$i]}
pass_word=${PASSWORDS[$i]}
echo "IP:$ip User:$user_name Password:$pass_word"
TMP_FILE="./.id_rsa.pub.$ip.tmp"
expect <<EOF
spawn scp $user_name@$ip:~/.ssh/id_rsa.pub $TMP_FILE
expect {
"yes/no" { send "yes\n";exp_continue}
"password" { send "$pass_word\n"}
}
expect eof
EOF
cat $TMP_FILE >>~/.ssh/authorized_keys
rm -f $TMP_FILE
done
echo "#### [3] send local key to each host..."
for ((i = 0; i < ${#HOSTSADDR[@]}; i++)); do
ip=${HOSTSADDR[$i]}
user_name=${USERNAMES[$i]}
pass_word=${PASSWORDS[$i]}
echo "IP:$ip User:$user_name Password:$pass_word"
CMD="scp /root/.ssh/authorized_keys root@$ip:/root/.ssh/authorized_keys"
if [ "$user_name" != "root" ]; then
CMD="scp /home/$user_name/.ssh/authorized_keys $user_name@$ip:/home/$user_name/.ssh/authorized_keys"
fi
expect <<EOF
spawn $CMD
expect {
"yes/no" { send "yes\n";exp_continue}
"password" { send "$pass_word\n"}
}
expect eof
EOF
done
echo "[INFO]: config auto ssh success!"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App