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

相关文章
相关标签/搜索