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全自动登录远程终端的主要内容,如果未能解决你的问题,请参考以下文章