批量實現多臺服務器之間ssh無密碼登陸的相互信任關係

隨筆- 486  文章- 0  評論- 366 html

批量實現多臺服務器之間ssh無密碼登陸的相互信任關係

 

最近IDC上架了一批hadoop大數據業務服務器,因爲集羣環境須要在這些服務器之間實現ssh無密碼登陸的相互信任關係。具體的實現思路:在其中的任一臺服務器上經過"ssh-keygen -t rsa"產生公私鑰文件,而後將公鑰文件拷貝成authorized_keys文件,最後將它的.ssh目錄下的文件所有批量拷貝到其餘服務器的/root/.ssh目錄(即當前用戶家目錄的.ssh)下便可。這批hadoop服務器的ssh端口默認都是22,密碼默認都是kevin123456,ip列表以下:linux

1vim

2服務器

3運維

4ssh

5工具

6oop

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)方法一(適用於機器數量不算多的狀況下)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

首先在其中任一臺服務器,如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 ~]# 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了,這就須要用到下面這種方法。

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

將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 \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@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

相關文章
相關標籤/搜索