shell全自动登录远程终端

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell全自动登录远程终端相关的知识,希望对你有一定的参考价值。

 

先看效果

技术分享图片

技术分享图片

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

 

传统手工连接

#密码方式 
ssh [email protected]   # 然后输入服务器密码

#密钥登录
ssh -i identity_file  [email protected]

#将本机 id_rsa.pub 添加到服务器authorized_keys中
ssh ssh [email protected]

?   弊端很明显,需要记服务器地址、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是 [email protected],
#参数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.. [email protected]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自动登录

 

以上是关于shell全自动登录远程终端的主要内容,如果未能解决你的问题,请参考以下文章

Shell登陆

深信服终端检测响应平台 远程RCE漏洞,任意用户登录

shell脚本实现ssh自动登录远程服务器示例

linux下如何使用ssh远程登录主机 执行shell脚本?

Linux下使Shell 命令脱离终端在后台运行

sh SHELL:管理SSH密钥创建和分发:对于GitHub,自动登录远程实例,....