目录
- 背景
 - 脚本功能
 - 脚本内容及使用方法
 
1.背景
进行linux自动化运维时需要先配置免密,但某些特定场景下,做了互信的节点需要取消免密,若集群庞大节点数量多时,节点两两之间做互信操作非常麻烦,比如有五个节点,彼此两两之间做互信,就需要做54321=120次,工作量十分巨大,因此若将该工作自动化进行将省时省力
2.脚本功能
执行脚本有以下4个选项可选:
- 批量ping服务器
 - 配置SSH免密登录
 - 取消SSH免密配置
 - 退出程序
 
3.脚本内容及使用方法
1.安装依赖
yum install -y openssh-clients expect openssh 
 
2.# 在ip_list中填写节点信息
vim ip_list
 
节点IP 节点用户名 节点登录密码
 
 3.上传脚本至任意目录,并给脚本赋可执行权限
chmod +x ssh_trust.sh
 
4.执行脚本
sh ssh_trust.sh
 
5.根据打印的菜单栏,输入选项1/2/3/4,按回车加粗样式
 
脚本内容:
#!/bin/bash
#批量部署SSH免密登录脚本
ERROR=00
#传参检测
if [ $# -ne 1 ]
then 
    echo -e "Usage:$0 ip_list "
    exit ERROR
fi
#文件检测
if [ ! -f "$1" ]
then
    echo -e "IP_List $1文件异常,请检查内容"
    exit E_ERROR
fi 
#初始化
ip_list=$1
#从文本读取值初始化变量
ip_address=(`awk '{print $1}' $ip_list_file`)
username=(`awk '{print $2}' $ip_list_file`)
password=(`awk '{print $3}' $ip_list_file`)
#打印菜单
echo -e "\n===============================================" 
echo -e "该脚本可以实现批量部署和删除SSH免密配置"   
echo -e "===============================================" 
    while :
    do
    echo -e ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" 
	echo -e "1. 批量ping服务器"
    echo -e "2. 配置SSH免密登录"
    echo -e "3. 取消SSH免密配置"
    echo -e "4. 退出程序"
    
    #功能控制及实现
    read -p "请输入序号>>> " nu
    if [[ "$nu" == "4" ]]
    then
        #退出程序
        echo -e "\n###!!!BYE!!!###"
        exit 0
    elif [[ "$nu" == "1" ]]
    then
		#循环控制
		echo -e "###开始逐个ping服务器,结果如下:###"
		echo -e "--------------------------------------------------------------------------------------"
        count=`grep -v '^$' $ip_list_file | wc -l `
        for (( i=0;i<$count;i++ ))
        do
			ping -c 1 ${ip_address[$i]}  >/dev/null 2>&1 
			if [ $? -eq 1 ];then
				echo ${ip_address[$i]} "ping failed."
			else
				echo ${ip_address[$i]} "ping successed."	
			fi		
        done               
		echo -e "--------------------------------------------------------------------------------------"
        echo -e "###批量ping结束,请检查结果。###"	
		echo -e "--------------------------------------------------------------------------------------"
	elif [[ "$nu" == "2" ]]
    then    
        echo "开始推送"
        #检测公钥文件是否存在,不存在则生成
        echo -e "正在生成秘钥"
        if [ ! -e "$HOME/.ssh/id_rsa.pub" ];then
           /usr/bin/expect<<-EOF
           spawn ssh-keygen -t rsa 
             expect {
             "*id_rsa):" {send "\r";exp_continue}
             "Overwrite (y/n)?" {send "y\n";exp_continue}
             "*passphrase):" {send "\r";exp_continue}
             "*again:" {send "\r"}
              }
            expect eof
EOF
        else
            echo -e "====已创建公钥文件,开始向远端服务器推送公钥==="
        fi
        #循环控制
        count=`grep -v '^$' $ip_list_file | wc -l `
        for (( i=0;i<$count;i++ ))
        do
            #echo -e "${ip_address[$i]}\t${username[$i]}\t${password[$i]}"
            #自动化交互实现推送ssh公钥
            /usr/bin/expect<<-EOF
            spawn ssh-copy-id -i $HOME/.ssh/id_rsa.pub ${username[$i]}@${ip_address[$i]}
            expect {
            "*yes/no"    { send "yes\r";exp_continue }
            "*password"  { send "${password[$i]}\r" }
        }
        expect eof 
EOF
        done
        echo -e "--------------------------------------------------------------------------------------"
        echo -e "--------------------------------------------------------------------------------------"
        echo -e "--------------------------------------------------------------------------------------"
        echo -e "###推送完成,检查是否能成功免密登录,结果如下:###"
		echo -e "-------------------------------------------"
        # 尝试免密登录		
		check_ssh(){
			host=$1
			uname=$2
			upass=$3
			expect <<EOF
			set timeout 10
			spawn ssh -o StrictHostKeyChecking=no $uname@$host echo "SSH Connected"
			expect {
				timeout {puts "Timeout happened";exit 1}
				eof {puts "$uname Logined $host Faild"; exit 1}
				"password:" {puts "$host login failed"; exit 1}
				"Connected" {puts "$host login successed"; exit 0}
			}
EOF
}
		
        for (( i=0;i<$count;i++ ))
        do
		
			check_ssh ${ip_address[$i]} ${username[$i]}   >/dev/null 2>&1 
			#执行完成后可调用$?系统变量判断连接状态 
			#可通过如下方式进行后续操作
			if [ $? = 0 ];then
				echo ${ip_address[$i]} " 免密登录成功"
			else
				echo ${ip_address[$i]} " 免密登录失败"
			fi		
        done
        echo -e "-------------------------------------------"
        echo -e "已完成SHH免密配置, 针对登录失败的服务器,请检查是否存在网络问题或密码错误。"
    elif [[ "$nu" == "3" ]]
    then
        #自动化交互实现删除配置免密的远程主机上的authorized_keys
        count=`grep -v '^$' $ip_list_file | wc -l `
        for (( i=0;i<$count;i++ ))
        do
        /usr/bin/expect<<-EOF
        spawn ssh ${username[$i]}@${ip_address[$i]}
        expect "*]#"    
        send "rm -f /root/.ssh/authorized_keys 2> /dev/null\r"
        expect "*]#"
        send "exit\r"
EOF
        done 
        echo -e "-------------------------------------------"
        echo -e "已取消SHH免密配置,请尝试SHH登录远端主机确认"
done
                

![【Linux】-Linux的实用操作:快捷键与软件安装操作、构建软连接、日期时区的设置[4]](https://img-blog.csdnimg.cn/direct/7654e33cac074abc994fff5b95c8fd8d.png)
















