前提:主机ip和密码文件已经提供,并且ip和密码保证正确,格式如下:
192.168.107.182:123456
192.168.107.183:123456
192.168.107.184:123456
Linux局域网内,使用运维账号推送公钥,实现ssh免密登录,本文实现方案分为两个步骤:
1、堡垒机管理员(root)账号,创建运维用户(我这里命名为master),安装expect软件包(用于ssh免密登录交互)。
2、使用运维账号登录堡垒机,使用运维账号推送公钥到局域网可ping通的所有服务器,并把能或不能ping通的服务器ip分别输出到文件。
shell具体实现如下:
堡垒机管理员(root)账号操作
1、编辑normal.sh脚本
[root@k8s-master shell]# vim normal.sh
#!/bin/env bash
#目标堡垒机上使用 master 用户批量推送公钥
#判断堡垒机上 master 账号是否存在
{
id master
#如果master用户不存在,创建该用户
[ $? -ne 0 ] && useradd master && echo 123456|pwsswd --stdin master
} &> /dev/null
#判断是否安装expect,用于交互
rpm -q expect
[ $? -ne 0 ] && yum -y install expect && echo "expect安装成功!"
2、为normal.sh脚本赋予可执行权限
[root@k8s-master shell]# chmod +x normal.sh
3、执行normal.sh脚本
[root@k8s-master shell]# ./normal.sh
堡垒机运维账号(master)操作
1、使用master登录堡垒机
[root@k8s-master shell]# su - master
上一次登录:四 12月 5 10:00:01 CST 2019pts/0 上
2、存放服务器ip及密码信息的文件如下
[master@k8s-master ~]$ ll
-rw-r--r--. 1 master master 87 12月 5 10:40 ip.txt
[master@k8s-master ~]$ cat ip.txt
192.168.107.182:123456
192.168.107.183:123456
192.168.107.184:123456
3、编写push_publish_key.sh脚本
[master@k8s-master ~]$ vim push_publish_key.sh
#!/bin/env bash
#描述:实现在堡垒机上使用 master 用户批量推送公钥到局域网内所有可以ping通的机器(多线程)
#执行命令:./push_publish_key.sh
#!/bin/env bash
start_time=`date +%c` #定义脚本运行的开始时间
echo "开始时间:$start_time"
#定义master家目录
home_dir=/home/master
#判断master用户公钥是否存在,如果不存在创建
[ ! -f $home_dir/.ssh/id_rsa.pub ] && ssh-keygen -P "" -f $home_dir/.ssh/id_rsa &>/dev/null
#循环检查主机的网络并进行公钥推送
#服务器信息存放文件
ip_file=$home_dir/ip.txt
#能被ping通的服务器存放文件
ip_up=$home_dir/ip_up.txt
#不能被ping通的服务器存放文件
ip_down=$home_dir/ip_down.txt
for i in `cat $ip_file`
do
{
ip=`echo $i|cut -d: -f1`
pass=`echo $i|cut -d: -f2`
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
#如果能ping通,保存ip
echo $ip >> $ip_up
#调用expect交互
/usr/bin/expect <<-END &>/dev/null
set timeout 10
spawn ssh-copy-id -i $home_dir/.ssh/id_rsa.pub root@$ip
expect {
"(yes/no)?" { send "yes\r";exp_continue }
"password:" { send "$pass\r" }
}
expect eof
END
#验证
remote_ip=`tail -1 ~/ip_up.txt`
ssh root@$remote_ip echo "$remote_ip服务器推送公钥成功!"
else
echo $ip >> $ip_down
fi
}&
done
wait
end_time=`date +%c` #定义脚本运行的结束时间
echo "结束时间:$end_time"
4、为push_publish_key.sh脚本赋予可执行权限
[master@k8s-master ~]$ chmod +x push_publish_key.sh
5、执行push_publish_key.sh脚本
[master@k8s-master ~]$ ./push_publish_key.sh
开始时间:2019年12月05日 星期四 12时15分38秒
192.168.107.183服务器推送公钥成功!
192.168.107.183服务器推送公钥成功!
结束时间:2019年12月05日 星期四 12时15分48秒
6、查看ip_up.txt和ip_down.txt文件
[master@k8s-master ~]$ cat ip_up.txt
192.168.107.182
192.168.107.183
[master@k8s-master ~]$ cat ip_down.txt
192.168.103.164
7、堡垒机使用master账号ssh连接成功推送公钥的服务器
[master@k8s-master ~]$ ssh root@192.168.107.183
Last login: Thu Dec 5 10:42:40 2019 from k8s-master
8、成功实现公钥推送,免密登录