shell脚本实现集群免密码登录

说明:1.hadoop集群,共三十台机器,之间相互免密码登录

           2.用到expect命令

           3.合并公钥:机器全部挂在nas上的(相当于共享目录吧),合并文件放在nas上,遍历机器公钥,

                     追加到nas上的文件,然后分发至各台机器

           4.编写好存放ip的配置文件,读取配置文件,循环遍历ip

          5.需要编写一个登录master机器的脚本,下发到各台机器,遍历登录各台机器时,执行该脚本,

             从而实现slave登录master(第一次登录要输入密码,省去了几十台slave登录master这一步)

-----------------------------------------------------------------------------------主脚本-------------------------------------

#!/bin/bash

echo -e "\n-------------####开始生成公钥私钥并且合并下发文件###---------------------\n"
if [[ $1 = "" || $2 = "" ]]; then
    echo "请依次传入密码,nas路径 eg:sshId_rsa.sh password /home/ap/nas"
else
    password=$1
    ips=`cat /tmp/root_hosts |awk '{print $3}'`
    for ip in $ips
    do 
        echo -e "\n\n开始生成 $ip 公钥私钥并且合并 \n"
        /usr/bin/expect<         spawn ssh $ip
        expect {
            "(yes/no)?" {
                send "yes\r"
                expect "*assword" {
                    send "$password\r"
                }
            }
            "*assword" {
                send "$password\r" 
            }
        } 
        expect "*]#"
        send "ssh-keygen -t rsa\r"
        expect "*id_rsa)"
        send "\r"
        expect {
            "*passphrase)"
            {
                send "\r"
            }
            "*write (y/n)?"
            {
                send "y\r"
                expect "*passphrase)"
                send "\r"
            }                         
        }
        expect "*again"
        send "\r"
        expect "*]#"
        send "touch  $2/authorized_keys\r"
        expect "*]#"
        send "cat /home/ap/pcts/.ssh/id_rsa.pub >> $2/authorized_keys\r"
        
        expect eof
EOF
        echo -e "\n\n生成 $ip 公钥私钥并且合并结束\n"
    done
    for ip in $ips
    do
        /usr/bin/expect<         spawn scp $2/authorized_keys pcts@$ip:/home/ap/pcts/.ssh/
        expect {
            "(yes/no)?" {
                send "yes\r"
                expect "*assword" {
                    send "$password\r"
                }
            }
            "*assword" {
                send "$password\r" 
            }
        }
        expect eof
EOF
    done

    for ip in $ips
    do
        echo -e "\n--$ip 登录masters---\n"
        /usr/bin/expect<         spawn scp /tmp/slaveTmasters.sh pcts@$ip:/home/ap/pcts/
        expect {
            "(yes/no)?" {
                send "yes\r"
                expect "*assword" {
                    send "$password\r"
                }
            }
            "*assword" {
                send "$password\r" 
            }
        }
        spawn ssh $ip
        expect {
            "(yes/no)?" {
                send "yes\r"
                expect "*assword" {
                    send "$password\r"
                }
            }
            "*assword" {
                send "$password\r" 
            }
        } 
        expect "*]#"
        send "/home/ap/pcts/slaveTmaster.sh\r" 
        expect eof
EOF
        echo -e "\n--$ip 登录masters完毕!---\n"
    done
    rm $2/authorized_keys
    echo -e "\n-------------###已删除$2/authorized_keys###---------------------\n"
    echo -e "\n-------------###生成公钥私钥并且合并下发文件结束###---------------------\n"
fi

------------------------------------------配置文件root_hosts--------------------------------------------------------------------

128.196.118.67  W117PC02VM18 Master01
128.196.118.68  W117PC05VM18 Master02
128.196.118.69  W117PC01VM19 Slave01
128.196.118.70  W117PC06VM18 Slave02
128.196.118.71  W117PC02VM19 Slave03
128.196.118.72  W117PC03VM19 Slave04

...............

------------------------------------------在各台机器执行的登录master的脚本----------------------------------------------

#!/bin/bash
#
echo -e "\n-------------####Slave登录Master###---------------------\n"
password="pcts"
master="Master01,Master02"
mArr=(${ string//,/ })

for mip in ${mArr[@]}
do
    /usr/bin/expect<     spawn ssh $mip
    expect {
        "(yes/no)?" {
            send "yes\r"
            expect "*assword" {
                send "$password\r"
            }
        }
        "*assword" {
            send "$password\r" 
        }
    } 
    expect eof
EOF
done


 

你可能感兴趣的:(shell)