批量实现多台服务器之间ssh无密码登录的相互信任关系

在多台服务器之间实现ssh无密码登录的相互信任关系,具体的实现思路:在其中的任一台服务器上通过"ssh-keygen -t rsa"产生公私钥文件,然后将公钥文件拷贝成authorized_keys文件,最后将它的.ssh目录下的文件全部批量拷贝到其他服务器的/root/.ssh目录(即当前用户家目录的.ssh)下即可。服务器的端口默认都是22。

服务器的IP信息如下:
192.168.100.105
192.168.100.106
192.168.100.107
192.168.100.108
注意:批量部署信任关系后,目标机器的公私钥文件id_rsa和id_rsa.pub会被覆盖,但是authorized_keys文件不会被覆盖,只会进行新内容追加,所以如果目标机器之前做了别的信任关系,在新的信任关系做好后,老的信任关系不会丢失。

方法一(适用于机器数量不算多的情况下)

首先在其中任一台服务器,如192.168.100.105上生产公私钥文件:
[root@lb01 ~]# ssh-keygen -t rsa
也可以使用非交互式创建密钥对的方法来实现:
第一种方法:ssh-keygen -t dsa -P "" -f ~/.ssh/id_dsa >/dev/null 2>&1
第二种方法:echo -e "\n"|ssh-keygen -t dsa -N ""

[root@lb01 ~]# ls /root/.ssh/
id_rsa  id_rsa.pub
[root@lb01 ~]# cat ip_list
192.168.100.105
192.168.100.106
192.168.100.107
192.168.100.108

[root@lb01 ~]#  for i in `cat /root/ip_list`;do rsync -e "ssh -p22" -avpgolr /root/.ssh root@$i:/root/;done
执行该命令后,需要多次手动输入密码

执行后,这些机器之间就可以通过ssh密码登录了,即实现了相互信任关系。检查下这些机器的/root/.ssh目录,发现他们的公私钥文件都是192.168.100.10这台机器的。
该种方法仅适用于少数服务器的情况,因为涉及到中途人工交互(输入密码等),如果服务器数量众多的情况下,适用这种方式就比较傻X了,这就需要用到下面这种方法。

方法二(使用expect工具,适用于机器数量众多的情况下
expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装。选择其中的任意一台服务器上操作,比如这里还是选择192.168.100.105这台机器.

[root@lb01 ~]# yum install -y expect

安装完成后进行测试
[root@lb01 ~]# expect
expect1.1> exit
[root@lb01 ~]# which expect
/usr/bin/expect

批量实现信任关系的脚本如下:

[root@lb01 ~]# cat ssh_auth.sh
#!/bin/bash
#Author:Mr.Ding
#Created Time:2018-10-19 14:50:08
#Name:ssh_auth.sh
#Description:
DEST_USER=$1
PASSWORD=$2
HOSTS_FILE=$3
if [ $# -ne 3 ]; then
    echo "Usage:"
    echo "$0 remoteUser remotePassword hostsFile"
    exit 1
fi
    
SSH_DIR=~/.ssh
SCRIPT_PREFIX=./tmp
echo ===========================
 
# 1. prepare  directory .ssh
mkdir $SSH_DIR
chmod 700 $SSH_DIR
    
# 2. generat ssh key
TMP_SCRIPT=$SCRIPT_PREFIX.sh
echo  "#!/usr/bin/expect">$TMP_SCRIPT
echo  "spawn ssh-keygen -b 1024 -t rsa">>$TMP_SCRIPT
echo  "expect *key*">>$TMP_SCRIPT
echo  "send \r">>$TMP_SCRIPT
if [ -f $SSH_DIR/id_rsa ]; then
    echo  "expect *verwrite*">>$TMP_SCRIPT
    echo  "send y\r">>$TMP_SCRIPT
fi
echo  "expect *passphrase*">>$TMP_SCRIPT
echo  "send \r">>$TMP_SCRIPT
echo  "expect *again:">>$TMP_SCRIPT
echo  "send \r">>$TMP_SCRIPT
echo  "interact">>$TMP_SCRIPT
    
chmod +x $TMP_SCRIPT
    
/usr/bin/expect $TMP_SCRIPT
rm $TMP_SCRIPT
    
# 3. generat file authorized_keys
cat $SSH_DIR/id_rsa.pub>>$SSH_DIR/authorized_keys
    
# 4. chmod 600 for file authorized_keys
chmod 600 $SSH_DIR/authorized_keys
echo ===========================
 
# 5. copy all files to other hosts
for ip in $(cat $HOSTS_FILE)  
do
    if [ "x$ip" != "x" ]; then
        echo -------------------------
        TMP_SCRIPT=${SCRIPT_PREFIX}.$ip.sh
        # check known_hosts
        val=`ssh-keygen -F $ip`
        if [ "x$val" == "x" ]; then
            echo "$ip not in $SSH_DIR/known_hosts, need to add"
            val=`ssh-keyscan $ip 2>/dev/null`
            if [ "x$val" == "x" ]; then
                echo "ssh-keyscan $ip failed!"
            else
                echo $val>>$SSH_DIR/known_hosts
            fi
        fi
        echo "copy $SSH_DIR to $ip"
                    
        echo  "#!/usr/bin/expect">$TMP_SCRIPT
        echo  "spawn scp -r  $SSH_DIR $DEST_USER@$ip:~/">>$TMP_SCRIPT
        echo  "expect *assword*">>$TMP_SCRIPT
        echo  "send $PASSWORD\r">>$TMP_SCRIPT
        echo  "interact">>$TMP_SCRIPT
            
        chmod +x $TMP_SCRIPT
        #echo "/usr/bin/expect $TMP_SCRIPT" >$TMP_SCRIPT.do
        #sh $TMP_SCRIPT.do&
        
        /usr/bin/expect $TMP_SCRIPT
        rm $TMP_SCRIPT
        echo "copy done."                
    fi
done
    
echo done.

在上面脚本文件的同目录下新建名为host的文件,将要建立ssh互信的机器名或ip地址添加到该文件中,每个机器名或ip占一行,如:
[root@lb01 ~]# cat ip_list
192.168.100.105
192.168.100.106
192.168.100.107
192.168.100.108
最后就可以运行这个脚本ssh_auth.sh文件,ssh_auth.sh接受三个参数,远程机器用户名、密码和host文件名(相对路径或绝对路径均可)。
[root@lb01 ~]# sh ssh_auth.sh  root 123456 ip_list

检测是否分发成功
[root@lb01 ~]# ssh root@192.168.100.106 /bin/uname -a
Linux lb02 3.10.0-862.11.6.el7.x86_64 #1 SMP Tue Aug 14 21:49:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
出现上面的信息就表示分发成功

 
==================================================================================================================================

注意:上面脚本针对的是服务器ssh端口是22的情况,如果ssh是非22端口,比如是22222端口。
则只需要在ssh_auth.sh脚本中修改下面两行内容:

[root@lb01 ~]# vim ssh_auth.sh
......
val=`ssh-keyscan $ip 2>/dev/null`
修改为
val=`ssh-keyscan -p 22222 $ip 2>/dev/null`
.......
echo  "spawn scp -r  $SSH_DIR $DEST_USER@$ip:~/">>$TMP_SCRIPT
修改为
echo  "spawn scp -P 22222 -r  $SSH_DIR $DEST_USER@$ip:~/">>$TMP_SCRIPT
 
[root@lb01 ~]# diff /opt/ssh_auth.sh /opt/ssh_auth.sh.bak
57c57
<             val=`ssh-keyscan -p 22222 $ip 2>/dev/null`
---
>             val=`ssh-keyscan $ip 2>/dev/null`
67c67
<         echo  "spawn scp -P 22222 -r  $SSH_DIR $DEST_USER@$ip:~/">>$TMP_SCRIPT
---
>         echo  "spawn scp -r  $SSH_DIR $DEST_USER@$ip:~/">>$TMP_SCRIPT

最后执行脚本,进行相互信任关系批量部署即可

 文章转自:https://www.cnblogs.com/kevingrace/p/9063745.html

 

posted @ 2018-10-19 15:11  我的城市没有海  阅读(284)  评论(0)    收藏  举报