zoukankan      html  css  js  c++  java
  • shell全自动登录远程终端

     

    先看效果

      你需要做的事情,在配置文件中配置服务器信息选择对应的服务器,进行连接。

    传统手工连接

    #密码方式 
    ssh user@ip   # 然后输入服务器密码
    
    #密钥登录
    ssh -i identity_file  user@ip
    
    #将本机 id_rsa.pub 添加到服务器authorized_keys中
    ssh ssh user@ip

    ​   弊端很明显,需要记服务器地址、ip、key位置、密码等,每次都需要自己手打一长串命令啊。。。

    自动连接

    ​   思路很简单,将连接需要的参数提取到配置文件,从读取配置文件读取指定行服务器信息进行连接,下面是配置文件

    server.conf

    id  desc            username   ip              connect-type    key-path/password
    1)  test_server     ec2-user   123.xx.xx.xx    key             key_abs_path
    2)  prod_server     root       121.xxx.x.x8    password        dasdxxxxx

    ​   除第一行之外,每行代表一台服务器连接信息,配置文件信息比较简单,仅仅包含一些连接需要的必要信息和简单说明。

    过程说明

    • 打印服务器配置文件信息

    • 用户输入需要连接服务器的 id

    • 读取用户选择行的信息到数组中,组成对应的 shell执行

      其中如果需要密码输入,自动交互由 expect 完成

      expect是什么?

      ​ 一个可以帮助完成 用户与 终端交互的小工具(可以自行了解下,很简单,花不了10分钟)

      ​ 比如连接服务器需要输入密码,你写好 expect 脚本,让它在指定的时候,帮你输入你的密码,下面是脚本内容

    expect_login.sh

    #!/usr/bin/expect -f
    # @author  : wangjia
    # @time    : 2016/03/12 11:10
    # desc    :  expect 登录
    ​
    set timeout 3
    #接受传入参数,
    #参数1是 user@ip,
    #参数2 password
    set user_ip [lindex ${argv} 0]
    set password [lindex ${argv} 1]
    ​
    #套壳 根据 expect 发送 对应信息
    spawn ssh ${user_ip}
    # 根据期望做出对应的动作,自动输入密码
    expect {
        "*assword:*" { send  "${password}\r"}
    }
    #将操作权交还给用户
    interact
    ​

     

    相关代码

      第一步读取配置文件,并打印到 终端

    # 读取配置文件到数组
    # @param1 $1服务器信息配置表
    function init_server_info_arr(){
        conf_file_path=$1;
        lineCount=0;
        while read oneLine
        do
            lines[lineCount]=${oneLine}
            let lineCount++;
        done < ${conf_file_path}
        print_server_list
    }
    ​
    #服务器信息打印(数组打印)
    function print_server_list(){
        for i in "${!lines[@]}";
        do
            echo "  ${lines[i]}"
        done
    }

      第二步,用户交互

    # 用户选择需要连接的服务器
    function interact_user(){
        read -p " which server to connect? Input the server id : " user_choose
        input_check "${user_choose}"
    }
    ​
    #用户交互 输入检查
    function input_check(){
        input=$1
        if [[ ${input} =~ ^[1-9]+$ ]] && [ ${input} -lt ${lineCount} ]
        then
            input="pass"
        else
            echo " wrong enter"
            exit
        fi
    }

      第三步,连接

    #进行连接
    #@param1 配置文件的行
    function connect_by_line(){
        choose_server=$1;
        #将行信息按空格分割成数组
        server_info_arr=(${choose_server// / })
        #读取数组,key-按密钥方式登录,password按密码方式调用 expect登录
        if [ "${server_info_arr[4]}" == "key" ]
        then
            ssh -i "${server_info_arr[5]}" "${server_info_arr[2]}@${server_info_arr[3]}";
        elif [ "${server_info_arr[4]}" = "password" ]
        then
            pw_login "${server_info_arr[2]}@${server_info_arr[3]}" "${server_info_arr[5]}";
        else
            ssh "${server_info_arr[2]}@${server_info_arr[3]}";
        fi
    }
    ​
    # 账号密码登录 expect 脚本调用
    # @param1  用户登录名@IP eg.. root@123.23.12.22
    # @param2  password
    function pw_login(){
        /Users/wangjia/coder/github/shell/ssh/expect_login.sh  $1 $2
    }

    • 本文没有什么深奥的地方,仅仅是很早之前简单了解 shell 之后,对日常操作做了一点点改进和优化,相信还有许多更好更优化的方式,也希望本文对一些朋友有帮助。

    • 该自动登录需要 expect 支持,如果不想装 expect ,可以将 ecpect 相关注释掉,需要输入密码的时候,将打印出的密码 copy 进去即可。

    #进行连接
    # @param1 配置文件的行
    function connect_by_line(){
        choose_server=$1;
        #按空格分割成数组
        server_info_arr=(${choose_server// / })
        if [ "${server_info_arr[4]}" == "key" ]
        then
            ssh -i "${server_info_arr[5]}" "${server_info_arr[2]}@${server_info_arr[3]}";
    #    elif [ "${server_info_arr[4]}" = "password" ]
    #    then
    #        pw_login "${server_info_arr[2]}@${server_info_arr[3]}" "${server_info_arr[5]}";
        else
            ssh "${server_info_arr[2]}@${server_info_arr[3]}";
        fi
    }
     

      文中所有源码地址 github-shell自动登录,也欢迎指针、交流(微信:wj435532580)

     

    嘿咻
  • 相关阅读:
    JOI2017FinalC JOIOI 王国
    JOISC2017C 手持ち花火
    P4336 [SHOI2016]黑暗前的幻想乡
    SP104 HIGH
    P3160 [CQOI2012]局部极小值
    P4965 薇尔莉特的打字机
    【BZOJ4361】isn
    P3506 [POI2010]MOT-Monotonicity 2
    P3214 [HNOI2011]卡农
    P3704 [SDOI2017]数字表格
  • 原文地址:https://www.cnblogs.com/wdado/p/shell_auto_ssh.html
Copyright © 2011-2022 走看看