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

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

1. 方法一

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

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

[root@repo ~]# ssh repo
# 会提示输入密码,输入密码进行登录

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

也可以手动创建该目录
然后生成repo的公钥

[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 文件

[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的公钥

[root@node001 ~]# mkdir pub
[root@node002 ~]# mkdir pub
[root@node003 ~]# mkdir pub
[root@node004 ~]# mkdir pub

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

[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文件中

[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 远程登录自身,也需要配置免秘钥

[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的免秘钥登录

[root@repo .ssh]# ssh -copy-id node001

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

[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)步骤

[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

[root@repo .ssh]# vi authorized_keys
1

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

[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 中去

脚本内容:

#!/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

脚本内容:

#!/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 是能正常使用的。
如果需要进行安装,请使用命令:

yum -y install expect

(4) 运行演示

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

[root@repo ~]# sh startAutoSSH.sh node001 node002 node003 node004

该命令表示:在 repo 服务器上,用户 root 执行脚本 startAutoSSH.sh
让集群四个节点 node001 node002 node003 node004 进行互相 SSH 免密登录配置

脚本执行完成后:
在这四台服务器的root用户的主目录/root下的.ssh目录下会生成一个授权列表文件
authorized_keys,该文件的内容如下:

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

[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服务:
sudo service sshd restart
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • ssh使用秘钥免密码登录 使用ssh远程连接服务器,有两种身份校验方式:账号密码和秘钥。使用秘钥的方式理论上更加安...
    最怕认真阅读 558评论 1 1
  • ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式。其中口令(密码)认证方式是我们最常用的一种,这里介...
    wyaoo阅读 4,531评论 2 2
  • 敏去英国了 也不过是一年不见 反正我们常常斗嘴吵架 这个控制欲超强的人 一切不过是习惯和依赖 为什么眼泪还是流了下...
    角落蜷缩阅读 169评论 0 0