Shell批量SSH免交互登录认证

脚本实现功能:批量或单个SSH免交互登录认证

脚本应用场景:当部署集群时,大多数实现要配置好管理节点与从节点的SSH免交互登录,针对这样的情况,写了下面脚本,简化工作。

脚本支持系统:Ubuntu和CentOS


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

#!/bin/bash

# Description: configuration local host and remote host ssh keypair authentication, Support Ubuntu and CentOS operation system.

# Blog: http://lizhenliang.blog.51cto.com

  

function color_echo() {

    if [ $1 == "green" ]; then

        echo -e "\033[32;40m$2\033[0m"

    elif [ $1 == "red" ]; then

        echo -e "\033[31;40m$2\033[0m"

    fi

}

function os_version() {

    local OS_V=$(cat /etc/issue |awk 'NR==1{print $1}')

    if [ $OS_V == "\S" -o $OS_V == "CentOS" ]; then

        echo "CentOS"

    elif [ $OS_V == "Ubuntu" ]; then

        echo "Ubuntu"

    fi

}

function check_ssh_auth() {

    if $(grep "Permission denied" $EXP_TMP_FILE >/dev/null); then

        color_echo red "Host $IP SSH authentication failure! Login password error."

        exit 1

    elif $(ssh $INFO 'echo yes >/dev/null'); then

        color_echo green "Host $IP SSH authentication successfully."

    fi

    rm $EXP_TMP_FILE >/dev/null

}

function check_pkg() {

    local PKG_NAME=$1

    if [ $(os_version) == "CentOS" ]; then

        if ! $(rpm -ql $PKG_NAME >/dev/null 2>&1); then

            echo no

        else

            echo yes

        fi

    elif [ $(os_version) == "Ubuntu" ]; then

        if ! $(dpkg -l $PKG_NAME >/dev/null 2>&1); then

            echo no

        else

            echo yes

        fi

    fi

}

function install_pkg() {

    local PKG_NAME=$1

    if [ $(os_version) == "CentOS" ]; then

        if [ $(check_pkg $PKG_NAME) == "no" ]; then

            yum install $PKG_NAME -y

            if [ $(check_pkg $PKG_NAME) == "no" ]; then

                color_echo green "The $PKG_NAME installation failure! Try to install again."

                yum makecache

                yum install $PKG_NAME -y

                [ $(check_pkg $PKG_NAME) == "no" ] && color_echo red "The $PKG_NAME installation failure!" && exit 1

            fi

        fi

    elif [ $(os_version) == "Ubuntu" ]; then

        if [ $(check_pkg $PKG_NAME) == "no" ]; then

            apt-get install $PKG_NAME -y

            if [ $(check_pkg $PKG_NAME) == "no" ]; then

                color_echo green "$PKG_NAME installation failure! Try to install again."

                apt-get autoremove && apt-get update

                apt-get install $PKG_NAME --force-yes -y

                [ $(check_pkg $PKG_NAME) == "no" ] && color_echo red "The $PKG_NAME installation failure!" && exit 1

            fi

        fi

    fi

}

function generate_keypair() {

    if [ ! -e ~/.ssh/id_rsa.pub ]; then

        color_echo green "The public/private rsa key pair not exist, start Generating..."

        expect -c "

            spawn ssh-keygen

            expect {

                \"ssh/id_rsa):\" {send \"\r\";exp_continue}

                \"passphrase):\" {send \"\r\";exp_continue}

                \"again:\" {send \"\r\";exp_continue}

            }

        " >/dev/null 2>&1

        if [ -e ~/.ssh/id_rsa.pub ]; then

            color_echo green "Generating public/private rsa key pair successfully."

        else

            color_echo red "Generating public/private rsa key pair failure!"

            exit 1

        fi

    fi

}

 

EXP_TMP_FILE=/tmp/expect_ssh.tmp

 

if [[ $1 =~ ^[a-z]+@[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}@.* ]]; then

    install_pkg expect ; generate_keypair

    for in $@; do

        USER=$(echo $i|cut -d@ -f1)

        IP=$(echo $i|cut -d@ -f2)

        PASS=$(echo $i|cut -d@ -f3)

        INFO=$USER@$IP

        expect -c "

            spawn ssh-copy-id $INFO

            expect {

                \"(yes/no)?\" {send \"yes\r\";exp_continue}

                \"password:\" {send \"$PASS\r\";exp_continue}

            }

        " > $EXP_TMP_FILE  # if login failed, login error info append temp file

        check_ssh_auth

    done

elif [[ $1 =~ ^[a-z]+@[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}-[0-9]{1,3}@.* ]]; then

    install_pkg expect ; generate_keypair

    START_IP_NUM=$(echo $1|sed -r 's/.*\.(.*)-(.*)@.*/\1/')

    END_IP_NUM=$(echo $1|sed -r 's/.*\.(.*)-(.*)@.*/\2/')

    for ((i=$START_IP_NUM;i<=$END_IP_NUM;i++)); do

        USER=$(echo $1|cut -d@ -f1)

        PASS=$(echo $1|cut -d@ -f3)

        IP_RANGE=$(echo $1|sed -r 's/.*@(.*\.).*/\1/')

        IP=$IP_RANGE$i

        INFO=$USER@$IP_RANGE$i

        expect -c "

            spawn ssh-copy-id $INFO

            expect {

                \"(yes/no)?\" {send \"yes\r\";exp_continue}

                \"password:\" {send \"$PASS\r\";exp_continue}

            }

        " > $EXP_TMP_FILE

        check_ssh_auth

    done

else

    echo "Example1: $0 <root@192.168.1.10-15@password>"

    echo "Example2: $0 <root@192.168.1.10@password>"

    echo "Example3: $0 [root@192.168.1.10@password root@192.168.1.11@password root@192.168.1.12@password ...]"

fi

时间: 2024-11-08 19:27:46

Shell批量SSH免交互登录认证的相关文章

Linux下实现SSH免密码登录和实现秘钥的管理、分发、部署SHELL脚本分享_linux shell

环境: ssh server: 192.168.100.29  server.example.com ssh client: 192.168.100.30  client.example.com 通过root用户建立秘钥认证实现SHELL脚本管理,分发,部署 首先client端创建秘钥对,并将公钥分发给需要登录的SSH服务端 注:公钥相当于锁,私钥相当于钥匙,我们这里相当于在客户端创建一对钥匙和锁,想要做到SSH免密码登录,就相当于我们将锁分发到服务端并装锁,然后客户端就可以利用钥匙开锁. 一.

如何在 CentOS / RHEL 上设置 SSH 免密码登录

如何在 CentOS / RHEL 上设置 SSH 免密码登录 作为系统管理员,你计划在 Linux 上使用 OpenSSH,完成日常工作的自动化,比如文件传输.备份数据库转储文件到另一台服务器等.为实现该目标,你需要从主机 A 能自动登录到主机 B.自动登录也就是说,要在 shell 脚本中使用ssh,而无需要输入任何密码. 本文会告诉你怎样在 CentOS/RHEL 上设置 SSH 免密码登录.自动登录配置好以后,你可以通过它使用 SSH (Secure Shell)和安全复制 (SCP)来

如何在CentOS/RHEL上设置SSH免密码登录

作为系统管理员,你计划在 Linux 上使用 OpenSSH,完成日常工作的自动化,比如文件传输.备份数据库转储文件到另一台服务器等.为实现该目标,你需要从主机 A 能自动登录到主机 B.自动登录也就是说,要在 shell 脚本中使用ssh,而无需要输入任何密码. 本文会告诉你怎样在 CentOS/RHEL 上设置 SSH 免密码登录.自动登录配置好以后,你可以通过它使用 SSH (Secure Shell)和安全复制 (SCP)来移动文件. SSH 是开源的,是用于远程登录的最为可靠的网络协议

Hadoop-2.8.0集群搭建、hadoop源码编译和安装、host配置、ssh免密登录、hadoop配置文件中的参数配置参数总结、hadoop集群测试,安装过程中的常见错误

25.集群搭建 25.1 HADOOP集群搭建 25.1.1集群简介 HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起 HDFS集群: 负责海量数据的存储,集群中的角色主要有NameNode / DataNode YARN集群: 负责海量数据运算时的资源调度,集群中的角色主要有 ResourceManager /NodeManager 25.1.2服务器准备 本案例使用虚拟机服务器来搭建HADOOP集群,所用软件及版本: ü Vmware 11.

ubuntu16.04服务器配置ssh免密码登录_Linux

在客户端操作 ssh-keygen -t rsa 文件位置写/home/try/.ssh/server_rsa,不使用默认值,我命名为server_rsa担心影响到git的key(因为我的git使用的是默认值) ssh-copy-id root@123.45.56.78(你的服务器ip), 或这使用 cat ~/.ssh/id_rsa.pub | ssh user@123.45.56.78 "mkdir -p ~/.ssh && cat >> ~/.ssh/autho

ssh 免密码登录

注意:如果A机器需要免密码登录B机器,则需要把A机器的公钥id_rsa.pub 加到 B机器的authorized_keys,不要弄反了 ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想A通过ssh免密码登录到B. 1.在A机下生成公钥/私钥对. [chenlb@A ~]$ ssh-keygen -t rsa  不用输入任何东西,回车三次 它在/

ssh免密码登录-ssh 免密码登录 ,不成功 ,还要密码

问题描述 ssh 免密码登录 ,不成功 ,还要密码 总是做不对,每次还是要密码,,有没有 详细点的步骤呢 ,,谢谢 解决方案 是为了hadoop 做ssh免密码登录吗? 以前写过一篇博客 是关于这个的 你看下 不行继续提问http://blog.csdn.net/p_max/article/details/45701241 解决方案二: 根据文章回复 ,现在可以了,ssh-add 有的时候需要执行下 此命令,感谢

CentOS/RHEL上设置SSH免密码登录的教程

以下步骤在 CentOS 5/6/7.RHEL 5/6/7 和 Oracle Linux 6/7 上测试通过. 节点1:192.168.0.9 节点2 : 192.168.l.10 步骤一 : 测试节点1到节点2的连接和访问: [root@node1 ~]# ssh root@192.168.0.10 The authenticity of host '192.168.0.10 (192.168.0.10)' can't be established. RSA key fingerprint i

linux下ssh免密码登录远程服务器配置

在linux下使用ssh登录远程主机是非常容易的事,但对于懒人来说,经常输入密码却是一个非常痛苦的事,下面告诉你怎么免输入远程主机密码而ssh登录到服务器. 以下操作均在本地主机上进行,非root用户,系统是debian wheezy. 本地主机: ssh-keygen -b 1024 -t rsa 连续按Enter回车键即可,就会在~/.ssh/下生成两个文件: id_rsa  id_rsa.pub 我们需要做的就是上传id_rsa.pub到远程主机. #远程主机添加.ssh目录 ssh le