批量实现多台服务器之间ssh无密码登录的相互信任关系
Posted 散尽浮华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批量实现多台服务器之间ssh无密码登录的相互信任关系相关的知识,希望对你有一定的参考价值。
最近IDC上架了一批hadoop大数据业务服务器,由于集群环境需要在这些服务器之间实现ssh无密码登录的相互信任关系。具体的实现思路:在其中的任一台服务器上通过"ssh-keygen -t rsa"产生公私钥文件,然后将公钥文件拷贝成authorized_keys文件,最后将它的.ssh目录下的文件全部批量拷贝到其他服务器的/root/.ssh目录(即当前用户家目录的.ssh)下即可。这批hadoop服务器的ssh端口默认都是22,密码默认都是kevin123456,ip列表如下:
192.168.10.202 192.168.10.203 192.168.10.205 192.168.10.206 192.168.10.207 192.168.10.208
注意:批量部署信任关系后,目标机器的公私钥文件id_rsa和id_rsa.pub会被覆盖,但是authorized_keys文件不会被覆盖,只会进行新内容追加,所以如果目标机器之前做了别的信任关系,在新的信任关系做好后,老的信任关系不会丢失。
1)方法一(适用于机器数量不算多的情况下)
首先在其中任一台服务器,如192.168.10.202上生产公私钥文件: [[email protected] ~]# ssh-keygen -t rsa [[email protected] ~]# ls /root/.ssh/ id_rsa id_rsa.pub [[email protected] ~]# cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys [[email protected] ~]# ls /root/.ssh/ authorized_keys id_rsa id_rsa.pub [[email protected] ~]# vim /root/hosts 192.168.10.202 192.168.10.203 192.168.10.205 192.168.10.206 192.168.10.207 192.168.10.208 [[email protected] ~]# for i in `cat /root/hosts`;do rsync -e "ssh -p22" -avpgolr /root/.ssh [email protected]$i:/root/;done 执行该命令后,需要多次手动输入密码 执行后,这些机器之间就可以通过ssh密码登录了,即实现了相互信任关系。检查下这些机器的/root/.ssh目录,发现他们的公私钥文件都是192.168.10.202这台机器的。 该种方法仅适用于少数服务器的情况,因为涉及到中途人工交互(输入密码等),如果服务器数量众多的情况下,适用这种方式就比较傻X了,这就需要用到下面这种方法。
2)方法二(使用expect工具,适用于机器数量众多的情况下)
expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装。选择其中的任意一台服务器上操作,比如这里还是选择192.168.10.202这台机器。expect-5.43.0.tar和tcl8.4.11-src.tar的下载地址:https://pan.baidu.com/s/1kVyeLt9 提取密码:af9p
将expect和tcl的软件包下载放到/usr/local/src目录下,解压tcl,进入tcl解压目录,然后进入unix目录进行编译安装 [[email protected] ~]# cd /usr/local/src/ [[email protected] src]# tar -zvxf tcl8.4.11-src.tar.gz [[email protected] src]# cd tcl8.4.11/unix [[email protected] unix]# ./configure [[email protected] unix]# make && make install 安装expect [[email protected] src]# tar -zvxf expect-5.43.0.tar.gz [[email protected] src]# cd expect-5.43.0 [[email protected] expect-5.43.0]# ./configure --with-tclinclude=/usr/local/src/tcl8.4.11/generic --with-tclconfig=/usr/local/lib/ [[email protected] expect-5.43.0]# make && make install 安装完成后进行测试 [[email protected] ~]# expect expect1.1> [[email protected] ~]# which expect /usr/local/bin/expect 做个expect执行文件的软件 [[email protected] ~]# ln -s /usr/local/bin/expect /usr/bin/expect [[email protected] ~]# ll /usr/bin/expect 批量实现信任关系的脚本如下: [[email protected] ~]# vim /opt/ssh_auth.sh #!/bin/sh 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 [email protected]$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占一行,如: [[email protected] ~]# vim /opt/host 192.168.10.202 192.168.10.203 192.168.10.205 192.168.10.206 192.168.10.207 192.168.10.208 最后就可以运行这个脚本ssh_auth.sh文件,ssh_auth.sh接受三个参数,远程机器用户名、密码和host文件名(相对路径或绝对路径均可)。 [[email protected] ~]# sh /opt/ssh_auth.sh root kevin123456 /opt/host 然后查看下其他服务器,发现.ssh目录下的文件和192.168.10.202机器的.ssh目录下的文件一致。 最后就可以在这些机器之间进行相互信任的ssh无密码跳转登录了! ========================================================================== 注意:上面脚本针对的是服务器ssh端口是22的情况,如果ssh是非22端口,比如是22222端口。 则只需要在ssh_auth.sh脚本中修改下面两行内容: [[email protected] ~]# cp /opt/ssh_auth.sh /opt/ssh_auth.sh.bak [[email protected] ~]# vim /opt/ssh_auth.sh #注意下面一个小写p,一个大写P ....... val=`ssh-keyscan $ip 2>/dev/null` 修改为 val=`ssh-keyscan -p 22222 $ip 2>/dev/null` ....... echo "spawn scp -r $SSH_DIR [email protected]$ip:~/">>$TMP_SCRIPT 修改为 echo "spawn scp -P 22222 -r $SSH_DIR [email protected]$ip:~/">>$TMP_SCRIPT [[email protected] ~]# 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 [email protected]$ip:~/">>$TMP_SCRIPT --- > echo "spawn scp -r $SSH_DIR [email protected]$ip:~/">>$TMP_SCRIPT 最后执行脚本,进行相互信任关系批量部署即可 [[email protected] ~]# sh /opt/ssh_auth.sh root kevin123456 /opt/host
以上是关于批量实现多台服务器之间ssh无密码登录的相互信任关系的主要内容,如果未能解决你的问题,请参考以下文章