配置各台虚拟机之间免秘钥登录
/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 # 公钥
[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
[root@node001 ~]# mkdir pub
[root@node002 ~]# mkdir pub
[root@node003 ~]# mkdir pub
[root@node004 ~]# mkdir pub
[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
[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
[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 文件中。
当机器数量很多时,这种方式很繁琐,而且容易出错
ssh -copy-id node001
配置repo到node001的免秘钥登录[root@repo .ssh]# ssh -copy-id node001
[root@repo .ssh]# ssh -copy-id node002
[root@repo .ssh]# ssh -copy-id node003
[root@repo .ssh]# ssh -copy-id node004
[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
这种方法比第一种方法简单了一些,但是机器很多时,也是很繁琐
(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 免秘钥登录。
这种方法简单,但是不安全,不建议在生产环境下使用
该脚本能在集群当中的任意一个节点上去运行,实现当前服务器到任意其他节点的 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
该脚本在基准服务器 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
在还没有配置 SSH 免密登录情况下,进行远程拷贝 scp 的时候会有人机交互过程,在此,我们利用 expect
来模拟人机交互过程。
但是,不同的服务器版本不一定都已经安装好了expect,最好的解决方案肯定是自动安装。在此,我们默认各台服务器的 expect 是能正常使用的。
如果需要进行安装,请使用命令:
yum -y install expect
在基准服务器 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 ~]#
sudo service sshd restart