ssh密钥批量分发

#################以下所有的命令脚本都是在centos7系统上实现,centos6略有不同

客户端使用公钥连接服务器的步骤

提起ssh我们就能想到的是远程连接,平时我们都是通过密码来登录linux主机,其实我们还是可以通过密钥来登录linux的,那么它的实现步骤是怎样的呢?

第一步:客户端通过ssh-keygen生成一对密钥,会自动存放在家目录的.ssh/authorized_keys文件下

第二步:客户端通过ssh-copy-id把公钥上传到服务器,会自动保存在目的用户家目录下的.ssh/

这样以后客户端再连接服务器时,就不用使用密码了。

上面的步骤有一个疑惑:客户端和服务器的用户要对应起来吗?不需要对应起来,比如客户端当前账户是zhanghe,而服务器上的账户是root,我们也可以把zhanghe的公钥通过ssh-copy-id放置到服务器上的root家目录下,这样客户端的zhanghe用户再登录服务器端的root就不用再输入密码了。

交互式登录服务器系统

交互式登录服务器效率太低,不适合大批量分发,但是有些步骤非得交互不可,为了避免这种尴尬,可以使用expect程序代替我们进行交互,解放双手!正面我们就来介绍一下expect的使用方法.

expect的使用方法和解释(用户名和密码登录)

#!/bin/bash
#author zhanghe
spawn ssh [email protected]
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send cba-123\r }
}
interact

注意:

第一行的解释器不再是/bin/bash,而不是/usr/bin/expect

spawn是“产生”的意思,就是产生一个会话,会话的就是通过root @192.168.80.7发起的。

expect {

} 这是固定的格式,注意expect整个脚本不能有空格,只能使用tab来缩进,不然会出问题!

"yes/no"是关键词,这个非常的重要,你还记得我们通过交互式连接远程主机是会提示你是否要继续连接,这个yes/no就是从那个结尾复制过来的,这样expect程序就可以定位到在什么地方帮助我们输入原本我们要输入的内容,那么要输入什么内容呢?当然是要输入yes,所以我们在“yes/no”后面加了一个中括号,括号里面内容就是发送yes\r(\r是回车的意思),注意,中括号两端都是有空格的,那么那个exp_continue是什么意思呢?就是为了防止万一没有让我们输入"yes/no"时我们来要继续连接。好了,那么下面的password也是关键词,后面就是发送的密码。最后一点是那个interact的意思是当连接成功之后就停留在服务器端先不要断开的意思。

注意:即使这样登录了之后,然后你退出来再次登录的时候,如果不调用此脚本片断还是要手动与之交互的,此脚本片断只不过是代替你完成了交互,是一次性的,用过一次之后下次再用时,还要再次调用!而密钥认证就不是这样了,密钥认证登录过一次之后,以后登录再也不需要交互了。

非交互式登录系统:(expect代替我们发送公钥与远程主机)

如果想通过密钥登录的话,我们就是先生成密钥,然后再把公钥发送给远程服务器,生成密钥时我们使用ssh-keygen命令,此命令可以交互,也可以不交互,但是通过ssh-copy-id时就必需得交互了,这时我们就得用到expect了。

[[email protected] ~]# vim 1.sh
#!/bin/bash
#author zhanghe
SERVER_ADDR=192.168.80.7
SERVER_PAWD=cba-123
expect () {                         #在这里面定义了一个函数expect,作用是用来把已经生成好的公钥推送到服务器
/usr/bin/expect <<-EOF
spawn ssh-copy-id $SERVER_ADDR
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$SERVER_PAWD\r" }
}
expect eof
EOF
}                                     #函数在此结束
test -f ~/.ssh/id_rsa                #测试密钥是否存在?存在为0,不存在为1.
if [ $? -ne 0 ];then             #如果不存在,就创建
    ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null
    expect                            #然后推送到服务器
    echo "keygen alreadly send!"
else
    expect                             #如果密钥文件存在,就直接推送
    echo "keygen alreadley send2"
fi

解释:

在脚本的开头我们定义了两个变量,一个变量是服务器的地址,另一个变量的服务器的密码

之后我们我们定义一个函数,这个函数其实就是调用了expect来帮助我们完成交互。

最后,我们通过一个id判断当前家目录有没有密钥文件,如果没有话,我们就创建,并且调用expect函数代替我们交互;如果有的话,就不用创建了,直接代替我们交互就可以了。

注意1:

ssh-keygen里面,-P“”的意思是空密码,-f是指定文件名,ssh-keygen不使用这两个选项时是交互的,使用了这两个选项就不用再交互了,也不用expect的帮忙,有的同学可能注意到了后面的文件是.ssh/id_rsa,为什么是这个路径呢?id_rsa是私钥,生成私钥会一块生成公钥的,所以我们在这里指定私钥就可以了。

注意2:

ssh-copy-id也是可以使用[email protected]的,上文当中没有写,默认就是当前用户了。

再加大一点难度,怎样批量给多台服务器推送公钥呢?在上面我们给一台服务器推送脚本会了,给多台服务器推送脚本也不难在上面的脚本里面再加一个for循环就可以了,下面我们就来实现一下。假设我们已经知道和服务器的IP列表和各个密码,然后再给这台服务器推送公钥,IP列表和密码在此:

[[email protected] tmp]# cat serverhost.txt

192.168.80.7 cba-123                #服务器的地址和密码都是用空格隔开的

192.168.80.8 abc-123

[[email protected] tmp]# vim send_key.sh

#!/bin/bash
expect () {   #同上,一开始就定义了一个expect的函数
/usr/bin/expect <<-EOF
spawn ssh-copy-id [email protected]$ADDR
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send $PASSWD\r }
}
expect eof
EOF
}           #函数在此结束
SERVERHOST=/tmp/serverhost.txt
for ADDR in `cut -d" " -f1 $SERVERHOST`;do  #这一cut把所有的ip全都列出来了
PASSWD=$(grep $ADDR $SERVERHOST | cut -d" " -f2)
test -f ~/.ssh/id_rsa
if [ $? -ne 0 ];then
ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null
expect
echo "key already send!"
else
expect
echo "key already send!!"
fi
done

原文地址:https://www.cnblogs.com/yizhangheka/p/11038960.html

时间: 2024-10-08 07:36:05

ssh密钥批量分发的相关文章

ssh密钥的分发之一:ssh-copy-id

ssh密钥的分发 我们在使用客户端账号对主机记性管理的时候,可以分为以下两种情况: 1.第一种情况,直接使用root账号: 优点:使用root账号密钥分发简单,指令执行简单 缺点:不安全 2.第二种情况,使用普通用户账号: 优点:比较安全 缺点:配置比较复杂,命令执行的时候也比较复杂. 这里因为是测试环境,我们选择第一种情况,直接使用root账号来远程管理主机. ssh密钥的分发这里我们有多种方式: 1.第一种,直接使用ssh自带的密钥分发工具命令ssh-copy-id: ssh-copy-id

Linux服务器集群架构部署搭建(三)NFS文件系统、SSH、批量分发管理、实时同步(2)

命运是大海,当你能够畅游时,你就要纵情游向你的所爱,因为你不知道狂流什么会到来,卷走一切希望与梦想. 作者:燁未央_Estelle声明:测试学习,不足之处,欢迎指正. 第四章 部署配置inotfiy+rsync实时同步 4.1 实时同步inotfiy+rsync的操作步骤 ①备份服务器[email protected]运行rsync进程作为rsync的服务端.NFS作为rsync的客户端. ②在备份服务器安装并正常启动rsync进程服务.并设置修改配置文件.实现远程拉取.推送备份. ③在客户端N

ssh密钥分发之二:使用sshpass配合ssh-kopy-id编写脚本批量分发密钥:

使用sshpass配合ssh-kopy-id编写脚本批量分发密钥: 首先sshpass是一个ssh连接时的免交互工具,首先要安装一下: yum install sshpass -y 接下来我们就可以使用sshpass工具了,一条命令形式分发ssh公钥: sshpass -p "ssh登录密码" ssh-copy-id -i /root/.ssh/id_dsa.pub -o StrictHostKeyChecking=no [email protected]123.56.221.190

第三十天-ssh key企业批量分发自动化管理案例

本文实现一个应用ssh key 批量分发案例 目录 一.ssh key 原理及案例原理简图 1.ssh key 简介 2.rsa和dsa区别 3.ssh-copy-id的特殊应用 4.ssh-copy-id的原理 5.案例简图 二.操作步骤 三.具体实现步骤 服务端A: 客户端B: 客户端C: 四.ssh 批量分发与管理方案小结 五.企业级生产场景批量管理,自动化管理方案 一.ssh key 原理及案例原理简图 1.ssh key 简介 特别提示:在整个方案实现中,公钥(public key)和

ssh批量分发服务搭建

SSH批量分发服务 1. 系统环境 [[email protected] ~]# uname -a Linux A 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 2203:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux [[email protected] ~]# ifconfig eth0 | grep 'inet addr' |awk'{print $2}'|awk -F':' '{print $2}' 10.0.0.3

ssh key密钥认证实现批量分发、管理、部署

在实际生产环境中,如果需要批量管理和部署服务器,可以采用ssh+key秘钥认证,然后可以免密码进行数据分发,服务部署及管理. SSH服务(TCP端口号22):安全的命令解释器 为客户机提供安全的Shell 环境,用于远程管理 SSH基于公钥加密(非对称加密)技术: 数据加密传输: 客户端和服务器的身份验证: 公钥 和 私钥   是成对生成的,这两个密钥互不相同,两个密钥可以互相加密和解密:不能根据一个密钥而推算出另外一个密钥: 公钥对外公开,私钥只有私钥的持有人才知道. ssh批量分发 首先需要

linux下SSH服务利用shell脚本实现密钥的批量分发与执行

SSH项目利用shell脚本实现密钥的批量分发与执行 1 ssh密钥的批量分发 开始安装sshpass免交互工具并进行SSH-key的批量分发 1.1 下载epel源并更新yum仓库 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum -y clean all yum makecache 1.2 安装sshpass工具 yum -y install sshpass 2 创建密钥文件 2

SSH认证原理和批量分发管理

SSH密码认证原理 几点说明: 1.服务端/etc/ssh目录下有三对公钥私钥: [[email protected] ssh]# ls moduli ssh_config sshd_config ssh_host_dsa_key ssh_host_dsa_key.pub ssh_host_key ssh_host_key.pub ssh_host_rsa_key ssh_host_rsa_key.pub 其中,ssh_host_key和ssh_host_key.pub 用于ssh协议1版本:其

Linux服务器集群架构部署搭建(三)NFS文件系统、SSH通道建立、批量分发管理(1)

命运是大海,当你能够畅游时,你就要纵情游向你的所爱,因为你不知道狂流什么会到来,卷走一切希望与梦想.  作者:燁未央_Estelle声明:测试学习,不足之处,欢迎指正. 第一章 NFS共享服务器的企业应用 1.1 NFS服务--静态数据存储 NFS是(Network File System)主要功能是通过网络让不同的设备端之间可以彼此共享文件或目录.NFS客户端(一般为应用服务器,如WEB)可以通过挂载(mount)方式,将NFS客户端本地系统中(就是一个挂载点)从NFS服务器端共享的数据文件目