#################以下所有的命令脚本都是在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的使用方法和解释(用户名和密码登录)

  1. #!/bin/bash
  2. #author zhanghe
  3. spawn ssh root@192.168.80.7
  4. expect {
  5. "yes/no" { send "yes\r"; exp_continue }
  6. "password:" { send cba-123\r }
  7. }
  8. 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了。

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

解释:

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

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

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

注意1:

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

注意2:

ssh-copy-id也是可以使用user@192.168.80.7的,上文当中没有写,默认就是当前用户了。

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

[root@linuxprobe tmp]# cat serverhost.txt

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

192.168.80.8 abc-123

[root@linuxprobe tmp]# vim send_key.sh

  1. #!/bin/bash
  2. expect () { #同上,一开始就定义了一个expect的函数
  3. /usr/bin/expect <<-EOF
  4. spawn ssh-copy-id root@$ADDR
  5. expect {
  6. "yes/no" { send "yes\r"; exp_continue }
  7. "password:" { send $PASSWD\r }
  8. }
  9. expect eof
  10. EOF
  11. } #函数在此结束
  12. SERVERHOST=/tmp/serverhost.txt
  13. for ADDR in `cut -d" " -f1 $SERVERHOST`;do #这一cut把所有的ip全都列出来了
  14. PASSWD=$(grep $ADDR $SERVERHOST | cut -d" " -f2)
  15. test -f ~/.ssh/id_rsa
  16. if [ $? -ne 0 ];then
  17. ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null
  18. expect
  19. echo "key already send!"
  20. else
  21. expect
  22. echo "key already send!!"
  23. fi
  24. done

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

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

    ssh密钥的分发 我们在使用客户端账号对主机记性管理的时候,可以分为以下两种情况: .第一种情况,直接使用root账号: 优点:使用root账号密钥分发简单,指令执行简单 缺点:不安全 .第二种情况, ...

  2. ssh+expect批量分发

    Expect安装 [root@web02 scripts]# yum install expect SSH密钥生成 [root@web02 scripts]# ssh-keygen -t dsa   ...

  3. ssh密钥创建分发(端口号非22)&脚本实现自动创建分发密钥

    1.1 服务端端口号变化了,如何基于秘钥连接 1.1.1 环境准备 实验环境: [root@test ~]# cat /etc/redhat-release CentOS release 6.9 (F ...

  4. SSH KEY 批量分发

    代码 #!/bin/sh . /etc/init.d/functions ];then echo "sh $0 arg0" exit fi for ip in 172.23.216 ...

  5. 【SSH项目实战三】脚本密钥的批量分发与执行

    [SSH项目实战]脚本密钥的批量分发与执行 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载, ...

  6. 【SSH项目实战】脚本密钥的批量分发与执行【转】

    [TOC] 前言 <项目实战>系列为<linux实战教学笔记>第二阶段内容的同步教学配套实战练习,每个项目循序衔接最终将组成<Linux实战教学笔记>第二阶段核心教 ...

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

    使用sshpass配合ssh-kopy-id编写脚本批量分发密钥: 首先sshpass是一个ssh连接时的免交互工具,首先要安装一下: yum install sshpass -y 接下来我们就可以使 ...

  8. [svc]ssh批量分发key/批量用户管理

    centos6 sshpass批量分发key yum install sshpass -y ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" 命令说 ...

  9. SSH批量分发管理

    ssh服务认证类型主要有两个: 基于口令的安全验证: 基于口令的安全验证的方式就是大家一直在用的,只要知道服务器的ssh连接账户.口令.IP及开发的端口,默认22,就可以通过ssh客户端登陆到这台远程 ...

随机推荐

  1. c# WF 第7节 对控件的基本操作

    本节内容: 1:修改控件的大小 2:控件的顺序 3:控件的对齐 4:移动button实例 1: 修改控件的大小 第一种: 第二种 : 一次操作多个控件: 选择一个控件.按住ctrl -- 再选择一个控 ...

  2. fiddler设置https抓包

    代理端口设置:127.0.0.1:8888 https抓包设置 模拟post请求: http://xxx.xxxx.com/portal/login.htm Cookie: xxxx account= ...

  3. LG3237 「HNOI2014」米特运输 树形DP

    问题描述 LG3237 题解 问题转化为: 要求将这棵树,满足 结点 \(x\) 所有孩子权值相等 结点 \(x\) 权值等于所有孩子权值和 将乘法转化为 \(\log\) 加法 \(\mathrm{ ...

  4. 第十周计划周二&周三计划

    今天又一次被导师训了,怎么也达不到他的要求,好像我俩不在一条线上.所以现在重新整理一遍思路,继续走. 我认为重点还是主题追踪这一块,但是主题追踪的结果以及显示是个问题,目前还是打算做出来当天最热的前几 ...

  5. 周董新歌搞崩QQ,抓取20W评论看看歌迷在说啥

    9 月 16 日晚间,周董在朋友圈发布了最新单曲<说好不哭> 发布后,真的让一波人哭了 一群想抢鲜听的小伙伴直接泪奔 因为 QQ 音乐直接被搞崩了 没想到干翻 QQ 音乐的不是网易云音乐 ...

  6. HTTP协议第一篇:三握手解读

    TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...

  7. 微信小程序开发-蓝牙功能开发

    0. 前言 这两天刚好了解了一下微信小程序的蓝牙功能.主要用于配网功能.发现微信的小程序蓝牙API已经封装的很好了.编程起来很方便.什么蓝牙知识都不懂的情况下,不到两天就晚上数据的收发了,剩下的就是数 ...

  8. pip 设置阿里云源

    在~/.pip/pip.conf文件中添加或修改 mkdir ~/.pip [global] index-url = http://mirrors.aliyun.com/pypi/simple/ [i ...

  9. win10每次开机都会自检系统盘(非硬件故障)——解决方案2019.07.12

    1.最近反复遇到了这个问题,之前遇到这个问题就把系统重装了,没想到今天又遇到了,目前系统东西太多了,重装太麻烦了,就下决心解决一下. 2.不要使用网络上流传的修改注册表的方案,把注册表的那个键值删除那 ...

  10. nginx 日志配置log_format用法

    nginx服务器日志相关指令主要有两条: 1.一条是log_format,用来设置日志格式: 2.另外一条是access_log,用来指定日志文件的存放路径.格式和缓存大小,可以参加ngx_http_ ...