如何快速的批量配置某台主机对多台主机免密码登陆
今天来玩个花的,不过这个花的其实在日常工作中既不被大众所熟知,却又相当重要实用的一个东东。
日常工作中可能会有这样一个需求,比如你需要往十台二十台主机上传输什么东西,或者直接说了吧,你要实现基于某台主机免密码登陆这些主机,有人可能会想到使用批量管理用 ansible 非常合适,请注意,这里说的正是实现免密码登陆的操作,也就是说,这是一个 ansible 之前的操作,或者换句话说,要想应用起来 ansible,那么首先就要把这个需求给满足了才行。
大家在往下看的时候,不妨也先想想,该如何实现这样一个需求。
我这里再描述一下需求:
那就是现在已经配置好主机 A 为 ansible 的 server 端,那么接下来需要配置 A 主机对网段内主机 IP 为 192.168.10.10–50 的主机实现免密码登陆。
显而易见,要想免密码登陆,那就是将主机 A 生成的公钥传输到对应的各个主机上去,在我看来,似乎有三种办法。
# 办法 1,传统法。
使用传统法,我们可以一台一台来进行ssh-copy-id root@192.168.10.10--50
秘钥的传输,其中每执行一次都要输入一下对应主机的密码。这种方式耗时费力,自然不是今天的主角,也不是今天想要说的,因此就按下不表。
# 办法 2,使用跳过密码法。
这就引出了今天的第一个神器:sshpass
。
事实上这款工具的操作应用也蛮广的,可在各大需要输入密码才能完成的事儿中。
关于他的用法,大概有如下几种(参考地址 (opens new window)):
使用-p参数指定登录密码
# 免密码登录
$ sshpass -p password ssh username@host
# 远程执行命令
$ sshpass -p password ssh username@host <cmd>
# 通过scp上传文件
$ sshpass -p password scp local_file root@host:remote_file
# 通过scp下载文件
$ sshpass -p password scp root@host:remote_file local_file
2
3
4
5
6
7
8
9
10
11
忽略 RSA Key 检查信息
第一次认证时,一般会有RSA key
检查的提示:
The authenticity of host ’10.x.x.x (10.x.x.x)' can't be established.
RSA key fingerprint is a4:eb:8c:7d:2a:ef:d6:1c:a3:0c:e8:e5:00:d2:eb:60.
Are you sure you want to continue connecting (yes/no)?
2
3
可以使用-o StrictHostKeychecking=no
选项来忽略 key 检查信息。
如:
sshpass -p "$SSH_PASSWD" ssh root@"$host" -o StrictHostKeyChecking=no "$@" 2>/dev/null
OK,了解完这款神器之后,我们回到今天的主题。
根据如上功能,大概可以用如下脚本来实现需求:
声明:本文当中介绍的两种方案,都是基于一个前提下才能够成立的,那就是所有的这些要操作的主机登陆密码都必须保持一致(如:123456),如果您觉得非要跟我拿这个来抬杠,那我只好 “恕不奉陪”!
#!/bin/bash
#author:eryajf
#time:2018-8
for ((i=10;i<51;i++)); do
sshpass -p "123456" ssh-copy-id root@192.168.10.$i -o StrictHostKeyChecking=no "$@" &> /dev/null
sleep 1
done
2
3
4
5
6
7
8
通过上边的脚本方式,则自动的就实现了主机 A 对远程各个主机的免密码功能。
注意:主机 A 要安装 sshpass 工具:yum -y install sshpass
。
# 办法 3,使用密码输入法。
密码输入法将引出今天的第二个神器:expect
。
事实上这个东东是一个非常深刻的,有厚度的,有温情的工具,以后将会有文章专门来介绍这个神器,今天只针对今天的需求来进行讲解。
于是乎,我们同样可以直接通过脚本来满足需求:
#!/usr/bin/expect -f
#author:eryajf
#time:2018-8
foreach ip {
192.168.10.1
192.168.10.2
192.168.10.3
} {
set timeout 15
spawn ssh-copy-id root@$ip
expect {
"yes/no" {send "yes\r";}
"password:" {send "123456\r";}
}
sleep 1
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
使用方式如下:
yum -y install expect
expect test
2
我不知道别人在看到这些神器的时候是如何运用的,也不知道别人在遇到像今天这样一个需求的时候是如何来考虑以及实现的,总之通过自己了解过的学过的东西,来进行灵活的运用,所谓学以致用,触类旁通,真心是一件非常快乐的事儿!
当然,如果您还有更好的办法来满足这一需求,欢迎在下方留言区留下您的方案一起探讨哦!!!