使用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
时间: 2024-08-31 21:15:39

使用ssh-copy-id批量拷贝公钥到远程主机的相关文章

请问谁有关SSH框架结构的批量上传文件的case

问题描述 请问谁有关SSH框架结构的批量上传文件的case 解决方案 解决方案二:http://avanry.javaeye.com/blog/256940看下这个解决方案三:网上一搜ssh多的是选择

SSH连接服务器并且拷贝文件

通过SSH可以远程登录到服务器上,基本的语法是: ssh username@ip 回车以后会提示输入密码,并且需要接受证书. 今天在登录的时候,出现了一个错误提示: " Remote Host Identification Has Changed" 每一个SSH服务器都使用的是一个随机的KEY,当SSH被重新安装过以后,这个KEY就发生了变化,但是我们登录的时候,会从本机寻找之前使用过的KEY,这个时候就会出现上面的提示,这种情况大多出现在服务器或者SSH服务被重新安装以后. 解决这个

linux从指定ID批量替换sql文件中记录的方法

  当数据库中的某个字段(例如ID)是整型,那么当新插入数据的时候需要从目前已有的数据库总最大的值加1开始排列. 当前生产数据库的id最大值为150,那么上线时候需要从151开始编号,当然可以使用sequence自增是一种方式. 这里介绍的是手动修改sql,保存如下内容到online.sql中 insert into ct values(1, 'sss', 2, 4); insert into ct values(1, 'sss', 2, 4); insert into ct values(1,

Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)_实用技巧

复制代码 代码如下: using System; using System.IO; using System.Text; using System.Data; using System.Web.UI; using System.Web.UI.WebControls; namespace ec { /// <summary> /// 文件操作类 /// </summary> public class FileObj : IDisposable { private bool _alre

批量修改数据 要根据主键Id 批量修改字段Value的值 且 value 的值是不一样。

问题描述 解决方案 解决方案二:value值和主键值什么关系,如果没关系,就用主键值+1解决方案三:updateStoreInfosetValue=Id所有的value就执行为对应的id了,如果id是要自己设置的话,循环执行sql就可以了.解决方案四:没说到底value的值是啥,光说不一样?解决方案五:引用3楼Z65443344的回复: 没说到底value的值是啥,光说不一样? Value的值是客户端传过来的Id也是....解决方案六:引用1楼bdmh的回复: value值和主键值什么关系,如果

win7怎么批量拷贝硬盘数据

  1.我们直接选择大家键盘上的win+R两个快捷键直接就可以打开电脑中的运行窗口,运行窗口中我们输入命令cmd直接回车键打开新窗口. 2.打开新窗口就是命令提示符窗口直接输入命令copy c:test.txt d: 点击确认,这个命令就是将我们C盘TEST文件直接复制到D盘中,这个时候就可以直接对命令进行修改就可以了; 3.大家在复制文件的时候,可以对文件进行重新设置名字,那么我们需要在C盘TEST文件直接复制到D盘中,就需要再将它重命名为test2.txt,然后输入命令copy c:test

win7系统怎么批量拷贝硬盘数据

  1.按下win+R快捷键打开电脑的运行窗口,在打开的运行窗口中,输入cmd并单击回车;   2.在打开的命令提示符窗口中,输入copy c:test.txt d: 命令,即可将C盘TEST文件直接复制到D盘中,直接对命令进行相应的修改即可;   3.复制文件的同时还可以对文件进行重命名,比如要将C盘TEST文件直接复制到D盘中,再将它重命名为test2.txt,即输入命令copy c:test.txt d:test2.txt

ibatis根据ID批量删除与SQL语句中写“id in(1,2,4)”删除的效率分析

问题描述 大侠们讨论问题如题.请说说各自的见解,在ibatis开发中遇到比较简单的批量删除时会采用那种方式.为什么用采用这种方式,它的优点好处,不足等.欢迎讨论! 解决方案 解决方案二:以本人狭隘经验,同样的语句,当in中的数据比较多的时候,如2w,5w等,oracle中会非常慢,db2中非常快解决方案三:引用1楼ticmy的回复: 以本人狭隘经验,同样的语句,当in中的数据比较多的时候,如2w,5w等,oracle中会非常慢,db2中非常快 我个人认为,如果是很大一批数据的话,比如银行.电信系

Linux配置远程SSH无密码登录_Linux

本文实例为大家分享了jaLinux配置远程SSH无密码登录的方法,供大家参考,具体内容如下 系统:CentOS 6.8 主机1:192.168.0.177 主机2:192.168.0.178工具介绍:ssh-keygen:创建公钥和密钥 ssh-copy-id:把生成的公钥复制到192.168.0.178主机上的authorized_keys文件上, ssh-copy-id也会给远程主机的用户主目录(/home)和/root/.ssh和/root/.ssh/authorized_key设置合适的