批量实现多台服务器之间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

浙公网安备 33010602011771号