目录
- 背景
- 脚本功能
- 脚本内容及使用方法
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