实现免密登陆脚本, expect登陆远程主机,将生成的密钥写入到目标主机, expect测试远程登陆。
1)通过shift读取脚本参数
2)通过select来选择功能.例如功能有
- 安装mysql
- 安装apache
- 免密钥登陆主机
当前我们只实现免密钥登陆主机
3)通过函数封装每个功能
4)将免密钥登陆的过程可以重复进行, while 循环实现重复,需要有退出过程。当用户输入exit时,退出免密钥功能。
5)支持输入一批主机免密钥,使用数组 实现
#!/bin/bash
# **********************************************************
#
# * Author : zxk
# * Email : zxknico@foxmail.com
# * Create time : 2022-09-02 22:31
# * Filename : main_test.sh
# * Description :
#
# **********************************************************
declare -A host
ssh_except () {
echo "免密登录功能现在运行"
while [ -n "$1" ];do #shift两两读取脚本参数,依次为主机IP和密码,然后向其发送生成的公钥文件
hostip=$1
shift
secret=$1
shift
host[$hostip]=$secret
echo "shift传参完成"
done
while true;do #while循环实现多次的免密登录和增加免密登录的主机
cat <<EOF
请选择1-3
1)再次确认免密登录主机IP和登录密码
2)输入测试主机IP
3)退出免密登录
EOF
read -p "您的选择:" i
case $i in
1)
read -p"IP和密码:" hostip secret
host[$hostip]=$secret
#创建公钥 -P:密码为空 -f:指定公钥位置(实现无交互创建公钥)
[ ! -f /root/.ssh/id_rsa.pub ] && ssh-keygen -t rsa -P '' &>/dev/null
expect <<EOF
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$hostip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$secret\n" }
}
expect eof
EOF
;;
2)
read -p"测试ip:" testip
ssh root@$testip
;;
3)
break
;;
esac
done
}
main="--安装myspl --安装apache --免密钥登录主机 --退出"
select i in $main;do
case $REPLY in
1)
echo "安装mysql成功"
;;
2)
echo "安装apache成功"
;;
3)
ssh_except $*
;;
4) break
;;
esac
done