zoukankan      html  css  js  c++  java
  • 批量实现多台服务器之间 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
    

    注意:批量部署信任关系后,目标机器的authorized_keys文件不会被覆盖,只会追加,所以如果目标机器之前做了别的信任关系,在新的信任关系做好后,老的信任关系不会丢失。

    方法一:  适用于机器数量不多情况  [不推荐,也不安全]

    首先在其中任一台服务器,如192.168.10.202上生产公私钥文件:
    [root@server-202 ~]# ssh-keygen -t rsa
    [root@server-202 ~]# ls /root/.ssh/
    id_rsa  id_rsa.pub
    
    [root@server-202 ~]# chmod 600 /root/.ssh/id_rsa                                            #一定要保证私钥id_rsa文件权限是600!
    [root@server-202 ~]# cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
    [root@server-202 ~]# ls /root/.ssh/
    authorized_keys  id_rsa  id_rsa.pub
    
    [root@server-202 ~]# 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
    [root@server-202 ~]# for i in `cat /root/hosts`;do rsync -e "ssh -p22" -avpgolr /root/.ssh root@$i:/root/;done
    执行该命令后,需要多次手动输入密码
     
    执行后,这些机器之间就可以通过ssh密码登录了,即实现了相互信任关系。检查下这些机器的/root/.ssh目录,发现他们的公私钥文件都是192.168.10.202这台机器的。
    该种方法仅适用于少数服务器的情况,因为涉及到中途人工交互(输入密码等),如果服务器数量众多的情况下,适用这种方式就比较傻X了,这就需要用到下面这种方法。 

    方法二:  使用expect批量做ssh信任
    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目录进行编译安装
    [root@server-202 ~]# cd /usr/local/src/
    [root@server-202 src]# tar -zvxf tcl8.4.11-src.tar.gz
    [root@server-202 src]# cd tcl8.4.11/unix
    [root@server-202 unix]# ./configure
    [root@server-202 unix]# make && make install
     
    安装expect
    [root@server-202 src]# tar -zvxf expect-5.43.0.tar.gz
    [root@server-202 src]# cd expect-5.43.0
    [root@server-202 expect-5.43.0]# ./configure --with-tclinclude=/usr/local/src/tcl8.4.11/generic --with-tclconfig=/usr/local/lib/
    [root@server-202 expect-5.43.0]# make && make install
     
    安装完成后进行测试
    [root@server-202 ~]# expect
    expect1.1>
     
    [root@server-202 ~]# which expect
    /usr/local/bin/expect
     
    做个expect执行文件的软件
    [root@server-202 ~]# ln -s /usr/local/bin/expect /usr/bin/expect
    [root@server-202 ~]# ll /usr/bin/expect
     
    批量实现信任关系的脚本如下:
    [root@server-202 ~]# 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 
    ">>$TMP_SCRIPT 
    if [ -f $SSH_DIR/id_rsa ]; then 
        echo  "expect *verwrite*">>$TMP_SCRIPT 
        echo  "send y
    ">>$TMP_SCRIPT 
    fi 
    echo  "expect *passphrase*">>$TMP_SCRIPT 
    echo  "send 
    ">>$TMP_SCRIPT 
    echo  "expect *again:">>$TMP_SCRIPT 
    echo  "send 
    ">>$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
    ">>$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@server-202 ~]# 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文件名(相对路径或绝对路径均可)。
    [root@server-202 ~]# sh /opt/ssh_auth.sh root kevin123456 /opt/host
     
    然后查看下其他服务器,发现.ssh目录下的文件和192.168.10.202机器的.ssh目录下的文件一致。
    最后就可以在这些机器之间进行相互信任的ssh无密码跳转登录了!
     
    ==========================================================================
    注意:上面脚本针对的是服务器ssh端口是22的情况,如果ssh是非22端口,比如是22222端口。
    则只需要在ssh_auth.sh脚本中修改下面两行内容:
    [root@server-202 ~]# cp /opt/ssh_auth.sh /opt/ssh_auth.sh.bak
    [root@server-202 ~]# 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 $DEST_USER@$ip:~/">>$TMP_SCRIPT
    修改为
    echo  "spawn scp -P 22222 -r  $SSH_DIR $DEST_USER@$ip:~/">>$TMP_SCRIPT
     
    [root@server-202 ~]# 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
     
    最后执行脚本,进行相互信任关系批量部署即可
    [root@server-202 ~]# sh /opt/ssh_auth.sh root kevin123456 /opt/host

    方式三:  使用Ansible批量做ssh信任   [推荐这种方式]

  • 相关阅读:
    C语言实现二叉堆BuildHeap操作
    Java大浮点数
    线索二叉树
    二叉树的层次遍历
    CS231n Lecture3-Loss Functions and Optimization学习笔记
    Python函数式编程(高阶函数、map/reduce、filter、sorted、匿名函数、返回函数)-3
    CS231n Lecture2-Image Classification学习笔记
    Python高级特性(生成器、迭代器、列表生成式)-2
    Python函数(定义、参数、递归)-1
    Numpy中的广播(Broadcast)讲解简单易懂,困扰已久,终于想通了
  • 原文地址:https://www.cnblogs.com/kevingrace/p/9063745.html
Copyright © 2011-2022 走看看