使用ssh-copy-id批量拷贝公钥到远程主机

简介:

使用ssh-copy-id批量拷贝公钥到远程主机

[TOC]

背景

之前使用vmware vCenter管理虚拟机, 我们在做模版时就将控制节点的公钥放入了虚拟机模版, 因此使用模版新建的虚拟机都可以直接从控制节点免密钥登录的, 能够有效解决虚拟机密码被改了无法登录的问题, 以及通过控制节点来做一些软件安装/配置修改和服务监控等。

最近在OpenStack上新建了100多台机器, 这些机器一开始并没有内置公钥, 机器开机后要对他们进行初始化, 如修改yum源和主机名, 常用工具安装, SELINUX/iptables禁用, vim设置优化等, 逐一手动修改工作量无疑会大到让人奔溃, 在不熟悉Ansible的情况下, 我们要做的第一步就是将控制节点的公钥拷贝到远程虚拟机上, 但是一个个的执行ssh-copy-id 还要输入不同的随机密码,也会累死人的。有没有比较好的shell脚本来实现呢? 摸索了一下, 找到了对应的解决办法;

详细步骤

1. 需要的工具

sshpass (添加epel源进行安装)
ssh-copy-id (centos已内置)

2. 新建文件保存主机名/IP/密码信息

将需要添加公钥的主机名/IP地址/主机密码存入到文本文件hostsname.txt 中,格式如下:

tcloud-web01 172.20.68.40 9nDvik7w
operation01  172.20.68.37 5fDviDEw
ngx-gw01     172.20.68.36 FiPp2UpR
gateway01    172.20.68.35 KeMbe57z
vehicle01    172.20.68.34 FElJ3ArM

3. 使用sshpass实现ssh自动填写密码

使用sshpass将密码传递给ssh-copy-id , 使得当需要输入密码时, 能够自动读取变量进行输入并完成验证:
脚本cat copy_ssh_id.sh如下:

#!/usr/bin/env bash
cat hostsname.txt | while read hostname ipaddr passwd
do
sshpass -p $passwd ssh-copy-id $ipaddr
done

也可以使用单条命令:

cat hostsname.txt | while read hostname ipaddr passwd; do sshpass -p $passwd ssh-copy-id $ipaddr; done

4. 验证是否拷贝成功

在CRT会话窗口中, 勾选使用Send command to all sessions选项同时将命令cat .ssh/authorized_keys 发送到ssh主机:

[root@gateway01 ~]# cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA7S0v0xsVaYB1B0NL/tzX0BkFttUWfBqYCL/LokSe3B6fgajY+b5FhxkCElGGvZKdGRQGqL07hcLcDHE3eWldOqv1jJ/rNO/omlogvs0dZwr9vI8QCmb/98ZHKTLrd3iDVMX4WiSTJ1mgxHIKFz6I1K0whcMObioyr8dFHWWTMSx2LDshGEsFQBcNLfAdjMaYE9OOpo05jOxiMaPq8M1oE4sdcJ3yKZHGO1ZzibapUuHiSma2pMbdR2OGC8SSIs5lRif1UUqg9rdsuztaikKpHSVYMrMZuIWW3jaAuJf8wZtnyaKU6y/GDm3H/SD0LWtRE7FUEBIT64aQjptcoOxoYw== root@deploy

5. 验证是否能够免密钥登录

[root@deploy ~]# ssh ngx-gw01
Warning: Permanently added 'ngx-gw01' (RSA) to the list of known hosts.
Last login: Sun Mar 19 22:54:08 2017 from 172.20.224.202
[root@ngx-gw01 ~]#

6. 注意

第5步中没有提示要求输入yes 进行确认,是我之前就在ssh_config文件中设置了不进行确认:

vim /etc/ssh/ssh_config
#Add at the end of file
  StrictHostKeyChecking no
目录
相关文章
|
2月前
|
存储 网络安全 开发工具
【随笔】Gitee -- Gitee仓库创建 & SSH公钥生成 (二)
【随笔】Gitee -- Gitee仓库创建 & SSH公钥生成 (二)
|
2月前
|
Shell 网络安全 数据安全/隐私保护
配置多个SSH公钥流程
配置多个SSH公钥流程
|
5月前
|
人工智能 Linux 网络安全
ssh拷贝文件
ssh拷贝文件
130 0
|
5月前
|
Linux 网络安全 数据安全/隐私保护
Xshell配置ssh免密码登录-公钥与私钥登录linux服务器
Xshell配置ssh免密码登录-公钥与私钥登录linux服务器
220 1
|
5月前
|
Shell 网络安全 开发工具
gitee配置SSH公钥
gitee配置SSH公钥
71 0
|
5月前
|
Shell 网络安全
生成ssh公钥(ssh-keygen)
生成ssh公钥(ssh-keygen)
|
10月前
|
Shell 网络安全 开发工具
Git 查看本机 SSH 公钥
Git 查看本机 SSH 公钥
|
12月前
|
网络安全
生成/添加SSH公钥(Gitee)以及SSH 公钥设置
生成/添加SSH公钥(Gitee)以及SSH 公钥设置
|
Shell 网络安全 开发工具
Git生成ssh公钥(ssh key)以及在GitLab配置ssh公钥
Git生成ssh公钥(ssh key)以及在GitLab配置ssh公钥
566 0
Git生成ssh公钥(ssh key)以及在GitLab配置ssh公钥
|
网络安全 开发工具 数据安全/隐私保护
Java--Git ssh 公钥配置
在使用Git时,我们可以通过SSH和HTTP来获取Git仓库的代码
158 0
Java--Git ssh 公钥配置