zoukankan      html  css  js  c++  java
  • 批量实现SSH无密码登陆认证脚本

    批量实现SSH无密码登陆认证脚本

    问题背景

    使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成。主要使用ssh-key-gen实现。

    1.通过 ssh-key-gen 来创建 public and private keys

    2.使用ssh-copy-id复制public key 到远程主机

    3.无密码登陆远程主机

    脚本实例

    但对于大规模集群,人工使用ssh-key-gen生成key,再使用ssh-copy-id显然费时费力。对于N台主机,需要进行N次ssh-key-gen,N*N次ssh-copy-id。

    为此,写了一个批量SSH key-gen脚本,脚本包括四个文件:keygen_master.sh、keygen_slave.sh、hosts.conf、slaves.conf

    使用方法

    使用方法比较简单。把这四个文件拷贝到主节点上,设置hosts.conf和slaves.conf,然后执行keygen_master.sh即可。

    keygen_master.sh在主节点上执行

    [root@localhost ~]# cat keygen_master.sh 
    #!/bin/sh
    this="$0"
    while [ -h "$this" ]; do
    ls=`ls -ld "$this"`
    link=`expr "$ls" : '.*-> (.*)$'`
    if expr "$link" : '.*/.*' > /dev/null; then
    this="$link"
    else
    this=`dirname "$this"`/"$link"
    fi
    done
    
    # init base path
    base=`dirname "$this"`
    script=`basename "$this"`
    base=`cd "$base"; pwd`
    this="$base/$script"
    slavesh="keygen_slave.sh"
    slavescript="$base/$slavesh"
    slaves="$base/slaves.conf"
    hosts="$base/hosts.conf"
    
    # install ssh
    yum install -y openssh* expect
    
    eval `ssh-agent`
    
    if [ ! -s ~/.ssh/id_dsa ]; then
    expect -c "
    spawn ssh-keygen -t dsa
    expect {
    "*y/n*" {send "y
    "; exp_continue}
    "*key*" {send "
    "; exp_continue}
    "*passphrase*" {send "
    "; exp_continue}
    "*again*" {send "
    ";}
    }
    "
    fi
    
    ssh-add $HOME/.ssh/id_dsa # Add private key
    
    # batch ssh 
    if [ -s $hosts ]; then
    for p in $(cat $hosts) # 
    do
    username=$(echo "$p"|cut -f1 -d":") # Get username 
    ip=$(echo "$p"|cut -f2 -d":") # Get ip 
    password=$(echo "$p"|cut -f3 -d":") # Get password 
    id=$HOME/.ssh/id_dsa.pub
    
    echo "ssh-copy-id -i $id $username@$ip -P $password"
    # ssh-copy-id
    expect -c "
    spawn ssh-copy-id -i $id $username@$ip
    expect {
    "*yes/no*" {send "yes
    "; exp_continue}
    "*password*" {send "$password
    "; exp_continue}
    "*Password*" {send "$password
    ";}
    }
    "
    done
    fi
    
    # dispath 
    if [ -s $slaves ]; then
    for p in $(cat $slaves) # 
    do
    username=$(echo "$p"|cut -f1 -d":") # Get username 
    ip=$(echo "$p"|cut -f2 -d":") # Get ip 
    password=$(echo "$p"|cut -f3 -d":") # Get password 
    id=$HOME/.ssh/id_dsa.pub
    
    ssh $username@$ip 'yum install -y openssh*'
    
    echo "scp $slavescript $hosts $username@$ip:~/ -P $password"
    # Dispath to clients
    expect -c "
    spawn scp $slavescript $hosts $username@$ip:~/
    expect {
    "*yes/no*" {send "yes
    "; exp_continue}
    "*password*" {send "$password
    "; exp_continue}
    "*Password*" {send "$password
    ";}
    }
    "
    
    # ssh to clients
    echo "ssh $username@$ip 'sh $HOME/keygen_slave.sh'"
    ssh $username@$ip 'sh $HOME/keygen_slave.sh'
    done
    fi
    

    keygen_slave.sh在所有从节点执行

    [root@localhost ~]# cat keygen_slave.sh 
    #!/bin/sh
    this="$0"
    while [ -h "$this" ]; do
    ls=`ls -ld "$this"`
    link=`expr "$ls" : '.*-> (.*)$'`
    if expr "$link" : '.*/.*' > /dev/null; then
    this="$link"
    else
    this=`dirname "$this"`/"$link"
    fi
    done
    
    # init base path
    base=`dirname "$this"`
    script=`basename "$this"`
    base=`cd "$base"; pwd`
    this="$base/$script"
    hosts="$base/hosts.conf"
    
    echo $base
    echo $script
    echo $this
    echo $hosts
    
    # install ssh
    yum install -y openssh* expect
    
    eval `ssh-agent`
    
    if [ ! -s ~/.ssh/id_dsa ]; then
    expect -c "
    spawn ssh-keygen -t dsa
    expect {
    "*y/n*" {send "y
    "; exp_continue}
    "*key*" {send "
    "; exp_continue}
    "*passphrase*" {send "
    "; exp_continue}
    "*again*" {send "
    ";}
    }
    "
    fi
    
    ssh-add $HOME/.ssh/id_dsa # Add private key
    
    # batch ssh 
    if [ -s $hosts ]; then
    for p in $(cat $hosts) # 
    do
    username=$(echo "$p"|cut -f1 -d":") # Get username 
    ip=$(echo "$p"|cut -f2 -d":") # Get ip 
    password=$(echo "$p"|cut -f3 -d":") # Get password 
    id=$HOME/.ssh/id_dsa.pub
    
    echo $username
    echo $ip
    echo $password
    echo $id
    
    # ssh-copy-id 
    expect -c "
    spawn ssh-copy-id -i $id $username@$ip
    expect {
    "*yes/no*" {send "yes
    "; exp_continue}
    "*password*" {send "$password
    "; exp_continue}
    "*Password*" {send "$password
    ";}
    }
    "
    done
    fi
    

    hosts.conf中设置所有主机(主节点+从节点),格式为用户名:主机IP:用户密码

    <span style="font-size:14px;">username:master_ip:passwd
    username:client1_ip:passwd
    username:client2_ip:passwd
    
    #root:localhost:000000</span>
    

    slaves.conf中设置所有从主机,格式同hosts.conf用户名:主机IP:用户密码

    username:client1_ip:passwd
    username:client2_ip:passwd
    
    #root:192.168.1.12:000000
    
  • 相关阅读:
    leetcode Super Ugly Number
    leetcode Find Median from Data Stream
    leetcode Remove Invalid Parentheses
    leetcode Range Sum Query
    leetcode Range Sum Query
    leetcode Minimum Height Trees
    hdu 3836 Equivalent Sets
    hdu 1269 迷宫城堡
    hud 2586 How far away ?
    poj 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/Serverlessops/p/12564037.html
Copyright © 2011-2022 走看看