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
) test_server ec2-user .xx.xx.xx key key_abs_path
) prod_server root .xxx.x.x8 password dasdxxxxx
除第一行之外,每行代表一台服务器连接信息,配置文件信息比较简单,仅仅包含一些连接需要的必要信息和简单说明。
过程说明
打印服务器配置文件信息
用户输入需要连接服务器的 id
读取用户选择行的信息到数组中,组成对应的 shell执行
其中如果需要密码输入,自动交互由 expect 完成。
expect是什么?
一个可以帮助完成 用户与 终端交互的小工具(可以自行了解下,很简单,花不了10分钟)
比如连接服务器需要输入密码,你写好 expect 脚本,让它在指定的时候,帮你输入你的密码,下面是脚本内容
expect_login.sh
#!/usr/bin/expect -f
# @author : wangjia
# @time : // :
# desc : expect 登录
set timeout
#接受传入参数,
#参数1是 user@ip,
#参数2 password
set user_ip [lindex ${argv} ]
set password [lindex ${argv} ]
#套壳 根据 expect 发送 对应信息
spawn ssh ${user_ip}
# 根据期望做出对应的动作,自动输入密码
expect {
"*assword:*" { send "${password}\r"}
}
#将操作权交还给用户
interact
相关代码
第一步读取配置文件,并打印到 终端
# 读取配置文件到数组
# @param1 $1服务器信息配置表
function init_server_info_arr(){
conf_file_path=$;
lineCount=;
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=$
if [[ ${input} =~ ^[-]+$ ]] && [ ${input} -lt ${lineCount} ]
then
input="pass"
else
echo " wrong enter"
exit
fi
}
第三步,连接
#进行连接
#@param1 配置文件的行
function connect_by_line(){
choose_server=$;
#将行信息按空格分割成数组
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 $ $
}
尾
本文没有什么深奥的地方,仅仅是很早之前简单了解 shell 之后,对日常操作做了一点点改进和优化,相信还有许多更好更优化的方式,也希望本文对一些朋友有帮助。
该自动登录需要 expect 支持,如果不想装 expect ,可以将 ecpect 相关注释掉,需要输入密码的时候,将打印出的密码 copy 进去即可。
#进行连接
# @param1 配置文件的行
function connect_by_line(){
choose_server=$;
#按空格分割成数组
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)
shell全自动登录远程终端的更多相关文章
- 交互式shell和非交互式shell、登录shell和非登录shell的区别
交互式shell和非交互式shell.登录shell和非登录shell的区别.首先,这是两个不同的维度来划分的,一个是是否交互式,另一个是是否登录. 交互式shell和非交互式shell(intera ...
- linux 本地账号密码无法登陆(shell可以登录),一直返回 登陆的login界面
今天我在我虚拟机测试的时候遇到了一个问题.登陆centos一直是返回login,账号和密码没错,我也换了两个用户. 1.问题描述 我正常的输入用户名和密码 错误提示截图:返回登陆界面,我重新试了另外的 ...
- SSH Secure Shell 无法登录:server responded "algorithm negotiation failed”
SSH Secure Shell Client 连接 ubuntu系统报错 修改ssh的配置文件 /etc/ssh/sshd_config在配置文件中添加: Ciphers aes128-cbc,ae ...
- shell脚本登录数据库
#!/bin/bashHOSTNAME="localhost" #数据库信息 PORT="3306" USERNAME="root" PAS ...
- shell脚本登录远程服务器并下载至本地
通常有这样备份的需求,将远程服务器的代码或者数据打包压缩然后下载到本地路径 实现方式 需要对远程服务器实现无密码访问,通过配置公钥实现: 使用ssh执行命令然后转向到本地的方法一步完成打包和下载,可参 ...
- 登录式与非登录式&交互式与非交互式shell及其环境初始化过程
交互式shell和非交互式shell(interactive shell and non-interactive shell) 交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的 ...
- Linux登录shell和非登录(交互式shell)环境变量配置
使用Jenkins执行shell脚本的时候, 碰到command not found. 比如java mvn, 这些环境变量配置在/etc/profile 中, 但jenkins执行的时候并没有加载. ...
- 快Key:按一下鼠标【滚轮】,帮你自动填写用户名密码,快速登录,可制作U盘随身(开源免费-附安装文件和源代码)
* 代码以本文所附下载文件包为准,安装文件和源文件包均在本文尾部可下载. * 快Key及本文所有内容仅供交流使用,使用者责任自负,由快Key对使用者及其相关人员或组织造成的任何损失均由使用者自负,与本 ...
- shell与变量的声明的操作
1.给命令起别名:alias 执行下面命令后,可以使用dir代替ls –l 命令,显示目录中的文件详细信息: 还可以用一个别名表示几个命令 的结合: 2.ps:显示当前登录会话的所有活动进程: 3.更 ...
随机推荐
- python之爬虫
一.从网页爬下字符串清除特殊字符 import re def validateTitle(title): rstr = r"[\/\\\:\*\?\"\<\>\|\t] ...
- js 按条件 serialize() 对应标签
serialize 非常方便的帮我们创建 URL 编码文本字符串 输出的字符串格式为 a=1&b=2&c=3 直接可用于Url传参 下面介绍一下选择性的序列化某些标签的使用方法 将 ...
- HDU2282 Chocolate KM算法
第一次做这样的题,其中有几个细节是反复思考反复调试,最后一A的,ORZ,又加深了对KM算法的理解.能不参考网上的题解,而是平静下来思考,参透,最后敢于尝试.....真的很重要,以后遇到才会有更深的印象 ...
- GBK和UTF8有什么区别
GBK编码:是指中国的中文字符,其它它包含了简体中文与繁体中文字符,另外还有一种字符“gb2312”,这种字符仅能存储简体中文字符. UTF-8编码:它是一种全国家通过的一种编码,如果你的网站涉及到多 ...
- Unity 使用 陀螺仪 实现 《王者荣耀》 登入界面 背景动态效果
在 <王者荣耀> 登入界面 左右上下晃动手机(有些手机不支持)可以看到背景在变化 我使用的是iPhone SE 效果如下: 对比两张图片的左下角 可以看到差异 至于为什么要这么做: 1.使 ...
- 张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块
HC-SR04 采用 IO 触发测距.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 H ...
- 真正从0开始用Unity3D制作类战地2玩法的类龙之谷、王者荣耀的手游(暨全平台游戏)
如题,(从2017年10月18日开始)正在利用业余时间研发一款神泣Shaiya2手游,引擎用Unity3D. 原因主要有2点: 对神泣太多感情,希望能做点什么来纪念乃至留下神泣这款网游: 时机已到,是 ...
- 浅谈Django的生命周期和CBF和FBC
Django的生命周期和CBF和FBC 对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端,客户端和服务端通信,字符串(Http协议):请求头和请求体 响应头+响应体 ...
- chromium 34以后中文字体粗体渲染问题
估计不少人更新后都遇到这个情况了吧,粗体渲染如然变得很模糊,很奇怪,Google下说是字体实现方式变了,国内一些网站用的中文字体都是宋体,但是宋体本身没有粗体,Win下的粗体是微软自己通过某种方式实现 ...
- 【译】Java中的字符串字面量
原文地址:https://javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html 作者:Corey McGlone 让我们由一个简 ...