利用sshpass批量设置SSH免密登录
背景
之前使用vmware vCenter管理虚拟机, 我们在做模版时就将控制节点的公钥放入了虚拟机模版, 因此使用模版新建的虚拟机都可以直接从控制节点免密钥登录的, 能够有效解决虚拟机密码被改了无法登录的问题, 以及通过控制节点来做一些软件安装/配置修改和服务监控等。
最近在OpenStack上新建了100多台机器, 这些机器一开始并没有内置公钥, 机器开机后要对他们进行初始化, 如修改yum源和主机名, 常用工具安装, SELINUX/iptables禁用, vim设置优化等, 逐一手动修改工作量无疑会大到让人奔溃, 在不熟悉Ansible的情况下, 我们要做的第一步就是将控制节点的公钥拷贝到远程虚拟机上, 但是一个个的执行ssh-copy-id 还要输入不同的随机密码,也会累死人的。 现呢? 摸索了一下, 找到了对应的解决办法;
注意:没有提示要求输入yes 进行确认,是我之前就在ssh_config文件中设置了不进行确认:
vim /etc/ssh/ssh_config
#Add at the end of file
StrictHostKeyChecking no
或者
ssh或ssh-copy-id免输yes,ssh首次访问总是提示Are you sure you want to continue connecting (yes/no)
1、ssh -o stricthostkeychecking=no
ssh-copy-id -o stricthostkeychecking=no 验证成功
2、ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.1 验证搭配使用sshpass不行
3、ssh -J root@192.168.0.222 root@192.168.57.3 没有验证
方法一:详细步骤(简单方法)
step1:修改 /etc/yum/pluginconf.d/license-manager.conf 中的enabled=0
step2:下载repo源——可以忽略这步
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
step3:安装sshpass
yum install -y sshpass
step4:批量执行脚本
#-p指的是主机的passwd
for i in {2..4}; do sshpass -p '111' ssh-copy-id -o stricthostkeychecking=no root@172.18.0.$i ; done
执行结果
[root@3228507c4263 pluginconf.d]# for i in {2..4}; do sshpass -p '111' ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.18.0.$i ; done
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
方法二:详细步骤
- 需要的工具
sshpass (添加epel源进行安装)
ssh-copy-id (centos已内置)
- 新建文件保存主机名/IP/密码信息
将需要添加公钥的主机名/IP地址/主机密码存入到文本文件node.hosts中,格式如下:
node01 10.0.0.21 9nDvik7w
node02 10.0.0.22 5fDviDEw
node03 10.0.0.23 FiPp2UpR
node04 10.0.0.24 KeMbe57z
node05 10.0.0.25 FElJ3ArM
- 使用sshpass实现ssh自动填写密码
使用sshpass将密码传递给ssh-copy-id , 使得当需要输入密码时, 能够自动读取变量进行输入并完成验证.
本脚本在原来的基础上添加了一些附加功能, 包括:
- 拷贝本机公钥到远程主机
- 免密钥登录到远程主机设置主机名
- 在远程主机生成ssh-key并将公钥收集到本机
- 将主机列表添加到hosts文件并拷贝到远程主机
- 设置sshd配置文件UseDNS为no以加快ssh连接并拷贝到远程主机
- 设置ssh配置文件禁用远程scp/ssh时询问并拷贝到远程主机
- 汇总所有主机的公钥并拷贝到所有节点,使得能互相免密登录(慎用)
脚本copy_ssh_id.sh如下: