前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >配置各台虚拟机之间免秘钥登录

配置各台虚拟机之间免秘钥登录

作者头像
CoderJed
发布2018-09-13 10:54:36
1.9K0
发布2018-09-13 10:54:36
举报
文章被收录于专栏:Jed的技术阶梯Jed的技术阶梯

配置各台虚拟机之间免秘钥登录

1. 方法一

(1)在 repo 虚拟机 /root/.ssh 目录下生成 repo 的公钥

/root/.ssh目录原先不存在,使用ssh命令登录自身后就可以自动创建.ssh目录

代码语言:javascript
复制
[root@repo ~]# ssh repo
# 会提示输入密码,输入密码进行登录

[root@repo ~] exit
[root@repo ~] # 这样就回到了最初的连接,也生成了.ssh目录

也可以手动创建该目录

然后生成repo的公钥

代码语言:javascript
复制
[root@repo ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
[root@repo ~]# ll -a
drwx------   2 root root  4096 7月   4 12:53 .ssh
[root@repo ~]# cd .ssh
# repo 的 .ssh 目录下没有 known_hosts 文件
[root@repo .ssh]# ll
-rw------- 1 root root 668 Sep 16 19:07 id_dsa # 私钥
-rw-r--r-- 1 root root 599 Sep 16 19:07 id_dsa.pub # 公钥

(2) node001-node004 用 ssh 命令登录自身,这样可以生成 .ssh 目录和其中的 known_hosts 文件

代码语言:javascript
复制
[root@node001 ~]# ssh node001
[root@node001 ~]# exit
[root@node001 ~]# cd .ssh
[root@node001 .ssh]# ll
# 没有公钥和私钥,只有known_hosts文件
-rw-r--r-- 1 root root 403 Sep 16 19:14 known_hosts
[root@node002 ~]# ssh node002
[root@node002 ~]# exit
[root@node003 ~]# ssh node003
[root@node003 ~]# exit
[root@node004 ~]# ssh node004
[root@node004 ~]# exit

(3) 在 node001-node004 的 /root 下创建一个文件夹来存放repo的公钥

代码语言:javascript
复制
[root@node001 ~]# mkdir pub
[root@node002 ~]# mkdir pub
[root@node003 ~]# mkdir pub
[root@node004 ~]# mkdir pub

(4) 把 repo 的公钥copy到其他节点

代码语言:javascript
复制
[root@repo .ssh]# scp ./id_dsa.pub node001:/root/pub/repo.pub
[root@repo .ssh]# scp ./id_dsa.pub node002:/root/pub/repo.pub
[root@repo .ssh]# scp ./id_dsa.pub node003:/root/pub/repo.pub
[root@repo .ssh]# scp ./id_dsa.pub node004:/root/pub/repo.pub

(5) node001- node004 把 repo 的公钥内容写到各自的authorized_keys文件中

代码语言:javascript
复制
[root@node001 ~]# cat ~/pub/repo.pub >> ~/.ssh/authorized_keys
[root@node002 ~]# cat ~/pub/repo.pub >> ~/.ssh/authorized_keys
[root@node003 ~]# cat ~/pub/repo.pub >> ~/.ssh/authorized_keys
[root@node004 ~]# cat ~/pub/repo.pub >> ~/.ssh/authorized_keys

(6) repo 远程登录自身,也需要配置免秘钥

代码语言:javascript
复制
[root@repo .ssh]# cat ./id_dsa.pub >> ./authorized_keys

经过这些配置后,repo 可以使用 ssh 免密钥登录自身和别的虚拟机

但是,别的虚拟机还不能免秘钥登录其他虚拟机

就是说,repo 现在可以 ssh 免秘钥登录自身和 node001-node004, 但 node001 还不能 ssh 免秘钥登录自身和 repo、node002-node004,必须再生成 node001 的公钥,然后把其中的内容追加到其他虚拟机的 authorized_keys 这个文件中才可以,对node002-node004来说是一样的,想免秘钥登录哪台机器,先使用ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa生成自己的公钥,然后自己的公钥内容追加到其他机器的 authorized_keys 文件中。

当机器数量很多时,这种方式很繁琐,而且容易出错

2. 方法二

(1) 在repo的.ssh目录下生成公钥,参考方法一的步骤(1)

(2) 使用命令ssh -copy-id node001配置repo到node001的免秘钥登录

代码语言:javascript
复制
[root@repo .ssh]# ssh -copy-id node001

(3) 同理,配置repo到其他节点的免秘钥登录

代码语言:javascript
复制
[root@repo .ssh]# ssh -copy-id node002
[root@repo .ssh]# ssh -copy-id node003
[root@repo .ssh]# ssh -copy-id node004

(4) 如果需要配置node001到其他节点的免秘钥登录,重复(1)(2)(3)步骤

代码语言:javascript
复制
[root@node001 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
[root@node001 .ssh]# ssh -copy-id repo
[root@node001 .ssh]# ssh -copy-id node002
[root@node001 .ssh]# ssh -copy-id node003
[root@node001 .ssh]# ssh -copy-id node004

(5) 如果需要配置所有机器两两之间免秘钥,给每个机器执行(1)(2)(3)步骤...

这种方法比第一种方法简单了一些,但是机器很多时,也是很繁琐

3. 方法三

(1) 在repo的.ssh目录下生成公钥,参考方法一的步骤(1)

(2) 把repo的公钥内容写到authorized_keys 文件中,使其可以登录自身免秘钥,参考方法一的步骤(6)

(3) 在repo中,查看 authorized_keys,复制文件中的内容,在末尾粘贴4份,只修改最后的节点名称为node001、node002、node003、node004

代码语言:javascript
复制
[root@repo .ssh]# vi authorized_keys

1

(4) 把.ssh文件夹分发给node001-node004

代码语言:javascript
复制
[root@repo .ssh]# scp ./* node001:`pwd`
[root@repo .ssh]# scp ./* node002:`pwd`
[root@repo .ssh]# scp ./* node003:`pwd`
[root@repo .ssh]# scp ./* node004:`pwd`

经过这样配置,所有的虚拟机两两之间以及和自身都可以 ssh 免秘钥登录。

这种方法简单,但是不安全,不建议在生产环境下使用

4. 方法四:写shell脚本自动执行

(1) 编写一个脚本 autoSSH.sh

该脚本能在集群当中的任意一个节点上去运行,实现当前服务器到任意其他节点的 SSH 免密登录配置

该脚本实现的功能:

该脚本能自动给当前运行的节点生成公钥私钥对

该脚本能自动把自己的公钥文件内容追加到其他服务器的授权列表文件 authorized_keys 中去

脚本内容:

代码语言:javascript
复制
#!/bin/bash

## 脚本接收的参数,也就是要互相配置 SSH 免密登录的服务器列表参数
BASE_HOST_LIST=$*

## 密码,默认用户是当前运行脚本的用户,比如 root 用户
## 这里改成你的用户对应的密码
BASE_PASSWORD="root"

## shell 函数:模拟 SSH 公钥私钥文件生成的人机交互过程
sshkeygen(){
    expect -c "
    spawn ssh-keygen
    expect {
        \"ssh/id_rsa):\" {send \"\r\";exp_continue}
        \"passphrase):\" {send \"\r\";exp_continue}
        \"again:\" {send \"\r\";exp_continue}
    }
    "
}

## shell 函数:模拟配置 SSH 免密登录过程的人机交互过程
sshcopyid(){
    expect -c "
    spawn ssh-copy-id $1
    expect {
        \"(yes/no)?\" {send \"yes\r\";exp_continue}
        \"password:\" {send \"$2\r\";exp_continue}
    }
    "
}

## 本机生成密钥对
sshkeygen

## 然后本机跟其他服务器建立 SSH 免密登录(包括自己)
for SSH_HOST in ${BASE_HOST_LIST}
do
    sshcopyid ${SSH_HOST} ${BASE_PASSWORD}
done

(2) 编写一个启动脚本 startAutoSSH.sh

该脚本在基准服务器 repo 上运行,是整个自动批量配置 SSH 免密登录程序的启动程序

该脚本实现的功能:

发送 autoSSH.sh 到集群各节点

发送命令让各节点自动执行该配置脚本:autoSSH.sh

脚本内容:

代码语言:javascript
复制
#!/bin/bash

## 配置 SSH 免密登录的服务器列表,可写死,也可通过传参或者读配置文件的方式读取
#BASE_HOST_LIST="node001 node002 node003"
BASE_HOST_LIST=$*

## 脚本的放置目录(传送之前,和传送之后都是这个目录)
SCRIPT_PATH="/root/autoSSH.sh"

## 第一步:先让自己先跑 autoSSH.sh 脚本,为了能顺利发送脚本到集群各节点
sh ${SCRIPT_PATH} ${BASE_HOST_LIST}

## 第二步:把脚本发送给其他服务器,让其他服务器也执行该脚本
for SSH_HOST in $BASE_HOST_LIST
do
    ## first : send install script
    ## 注意这行,用户名写死为root,如果是其他用户,记得在这里修改
    scp -r $SCRIPT_PATH root@${SSH_HOST}:$SCRIPT_PATH
    ## send command and generate ssh and auto ssh
    ssh ${SSH_HOST} sh ${SCRIPT_PATH} ${BASE_HOST_LIST}
done

(3) 说明

在还没有配置 SSH 免密登录情况下,进行远程拷贝 scp 的时候会有人机交互过程,在此,我们利用 expect来模拟人机交互过程。

但是,不同的服务器版本不一定都已经安装好了expect,最好的解决方案肯定是自动安装。在此,我们默认各台服务器的 expect 是能正常使用的。

如果需要进行安装,请使用命令:

代码语言:javascript
复制
yum -y install expect

(4) 运行演示

在基准服务器 repo 上执行命令:

代码语言:javascript
复制
[root@repo ~]# sh startAutoSSH.sh node001 node002 node003 node004

该命令表示:在 repo 服务器上,用户 root 执行脚本 startAutoSSH.sh

让集群四个节点 node001 node002 node003 node004 进行互相 SSH 免密登录配置

脚本执行完成后:

在这四台服务器的root用户的主目录/root下的.ssh目录下会生成一个授权列表文件

authorized_keys,该文件的内容如下:

任意选择一台机器进行验证,在此我选择了node001:

代码语言:javascript
复制
[root@node001 ~]# ssh node001
Last login: Thu Dec 21 04:06:52 2017 from 192.168.21.1
[root@node001 ~]# exit
logout
Connection to node001 closed.
[root@node001 ~]# ssh node002
Last login: Thu Dec 21 04:06:31 2017 from node001
[root@node002 ~]# exit
logout
Connection to node002 closed.
[root@node001 ~]# ssh node003
Last login: Thu Dec 21 04:06:36 2017 from node001
[root@node003 ~]# exit
logout
Connection to node003 closed.
[root@node001 ~]# ssh node004
Last login: Thu Dec 21 04:06:06 2017 from node003
[root@node004 ~]# exit
logout
Connection to node004 closed.
[root@node001 ~]# 

5.其他说明

  • 注意:配置完成后,当前虚拟机第一次远程连接别的虚拟机,可能会出现确认是否连接的信息,或者要求输入密码,登录一次之后就不会再出现了,以后可以直接远程免秘钥登录。
  • 以上介绍的4种方法,推荐使用第四种方式:使用shell脚本自动实现ssh免秘钥登录

6.补充记录

  • 2018-03-14 如果配置的是非root用户的免秘钥登录,authorized_keys这个文件的权限要修改为600,否则无法实现面秘钥登录
  • 2018-08-16 如果经过配置后无法免秘钥登录,尝试重启ssh服务:
代码语言:javascript
复制
sudo service sshd restart
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 方法一
    • (1)在 repo 虚拟机 /root/.ssh 目录下生成 repo 的公钥
      • (2) node001-node004 用 ssh 命令登录自身,这样可以生成 .ssh 目录和其中的 known_hosts 文件
        • (3) 在 node001-node004 的 /root 下创建一个文件夹来存放repo的公钥
          • (4) 把 repo 的公钥copy到其他节点
            • (5) node001- node004 把 repo 的公钥内容写到各自的authorized_keys文件中
              • (6) repo 远程登录自身,也需要配置免秘钥
              • 2. 方法二
                • (1) 在repo的.ssh目录下生成公钥,参考方法一的步骤(1)
                  • (2) 使用命令ssh -copy-id node001配置repo到node001的免秘钥登录
                    • (3) 同理,配置repo到其他节点的免秘钥登录
                      • (4) 如果需要配置node001到其他节点的免秘钥登录,重复(1)(2)(3)步骤
                        • (5) 如果需要配置所有机器两两之间免秘钥,给每个机器执行(1)(2)(3)步骤...
                        • 3. 方法三
                        • 4. 方法四:写shell脚本自动执行
                          • (1) 编写一个脚本 autoSSH.sh
                          • (2) 编写一个启动脚本 startAutoSSH.sh
                          • (3) 说明
                          • (4) 运行演示
                          • 5.其他说明
                          • 6.补充记录
                          相关产品与服务
                          腾讯云小微
                          腾讯云小微,是一套腾讯云的智能服务系统,也是一个智能服务开放平台,接入小微的硬件可以快速具备听觉和视觉感知能力,帮助智能硬件厂商实现语音人机互动和音视频服务能力。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档