不输入用户名密码通过跳板机登录到线上linux机器
问题:
一般情况下,公司所有的服务器都在内网,公网访问、管理服务器都要先通过登录一台跳板机,然后再由跳板机登录到相应的服务器进行操作,跳板机与服务器的连接都是内网地址。我们经常看到的现象就是下图这样,每次都要通过 ssh 登录两次,输入两次密码,密码也经常输错,不胜其烦。
先决条件:
mac或者其他类unix操作系统作为本地机器,安装expect
解决办法:
利用expect的自动交互特性与服务器自动交互
#!/usr/bin/expect
#author @qq.com #定义数组,这里有多台就定义多个
#连接枚举
set connection_enum() "第一台目标机器别名" #名字可以随便取
set connection_enum() "第二台目标机器别名" #用户枚举
set connection_user() "第一台目标机器用户名"
set connection_user() "第二台目标机器用户名" #连接密码
set connection_passwd() "第一台目标机器密码"
set connection_passwd() "第二台目标机器密码" #连接ip,这里说下一般跳板机跟目标机器ssh连接是走的内网,所以配置的是内网ip
set connection_ip() "第一台目标机器ip"
set connection_ip() "第二台目标机器ip" #函数定义必须在使用前面否则会报错
#列出可用的host以及枚举
proc connectionlist {} {
global connection_enum #函数里面如果要用全局变量expect语法里要global进来
#[array size connection_enum]命令是求数组connection_enum的长度
for {set i } {$i <= [array size connection_enum]} {incr i} { #这是expect语法的for循环和自增
puts "signin \[$i\] for $connection_enum($i)" #输出到控制台
}
} #登录host
proc connecthost { enum } {
global connection_passwd
global connection_ip
global connection_user #我这里登录跳板机是免密的,所以注释掉下面三行,如果不是免密登录跳板机就需要打开注释
spawn ssh -l 跳板机用户名 跳板机ip
#expect {
# "*password*" { send "登录跳板机密码\r" }
# } #接收到跳板机登录成功的消息后登录目标机器,这一行expect的内容你的跟我的不一定一样,根据跳板机器返回的信息进行匹配
expect "*System restart required*" {send "ssh -l $connection_user($enum) $connection_ip($enum)\r"}
expect {
"yes/no" {send "yes\r";exp_continue;}
"*password:*" { send "$connection_passwd($enum)\r" }
}
interact
} if {[llength $argv] == } {
puts "choice your login host:"
connectionlist expect {
#正则匹配输入的值,1或2
"\[12\]" {
set num $expect_out(buffer); #$expect_out(buffer)获取输入值,set进行类型转换
connecthost $num;
}
# "" { connecthost }
# "" { connecthost }
}
}
根据你的个人及其配置修改好文件之后就可以直接运行脚本了。
不输入用户名密码通过跳板机登录到线上linux机器的更多相关文章
- 【效率工具】SSH一键登录脚本(可一键从跳板机登录线上服务器)
说明 前阵子上线,一次性上了十个服务,一直上到凌晨才完事,期间每个服务都要先输入跳板机的登录信息来登录跳板机,然后再输入线上服务器的信息来登录线上服务器,实在是太过于麻烦,而且有些服务还有好几台服务器 ...
- WAMPserver配置(允许外部访问、phpmyadmin设置为输入用户名密码才可登录等)
对于很多不熟悉PHP环境安装的朋友来说,用集成环境可以更快的上手,更方便的搭建PHP的运行环境,但是,WAMP的集成环境仅仅是将底层基础工作做好 了,有些个别关键的配置操作并没有集成到环境安装中,所以 ...
- WampServer PHP服务配置方法(允许外部访问、phpmyadmin设置为输入用户名密码才可登录等)
WampSever 指的是apache + mySQL + PHP 三合一套装,第一字母W,是指用于windows系统,我用的是2.0f版.用于Linux系统的,是LampSever,第一字母是L.请 ...
- SSH工具登录远程指定节点时输入用户名密码方式【我】
通过堡垒机部署项目, 一种方式:先把补丁传到接入机,然后用CRT等命令行工具登录指定接入机,然后用SCP命令把 补丁传到 生产服务器,比如 scp -P90010 /app/backup/packet ...
- python作业设计:输入用户名密码,认证成功后显示欢迎信息,输错三次后锁定
作业需求: 1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定实现思路: 1.判断用户是否在黑名单,如果在黑名单提示账号锁定. 2.判断用户是否存在,如果不存在提示账号不存在. 3.判 ...
- 解决`向github提交代码是老要输入用户名密码`
在命令行输入命令:git config --global credential.helper store☞ 这一步会在用户目录下的.gitconfig文件最后添加: [credential] help ...
- ubuntu 输入用户名密码又回到登陆界面
问题描述: 输入正确的用户名密码,登陆后又返回登陆界面,重复出现. 问题解决: 环境变量出错,重新配置环境变量. 1.进入命令行模式Ctrl+Alt+F*,然后输入用户名密码: 2.登进去之后,以管理 ...
- git 解决每次更新代码都要输入用户名密码的解决方案
使用git pull或者git push每次都需要输入用户名和密码很繁琐,耽误时间,现在教大家一条命令实现保存用户名和密码不用再输入 git config --global credential.he ...
- git 生成公钥 使用命令行无需输入用户名密码(windows)
之前设置过一次,后来就忘记了,今天改完密码之后发现命令行clone时验证身份失败,重新设置公钥,记录一下 1. 由于之前设置过公钥,所以不用输入用户名密码就可以执行git命令.现在密码变了,取消公钥, ...
随机推荐
- Scrapy爬取到的中文数据乱码问题处理
Scrapy爬取到中文数据默认是 Unicode编码的,于是显示是这样的: "country": ["\u56fd\u4ea7\u6c7d\u8f66\u6807\u5f ...
- 一个符号冲突导致的core分析
问题描述: 修改跟踪程序(Trace)支持IPV6时,发现程序启动后正常,但是客户端一旦下发查询条件进行跟踪,Trace程序就直接coredump! (gdb) bt # 0x00007f7dab9e ...
- 第三节 MVC应用程序架构和测试
在查看如何测试单个功能之后,您可能会问,整个Web应用程序如何? 如前所述,有以下级别的测试: 单元测试 集成测试 功能测试 在开始编写测试时考虑这一点很重要. 可能还有其他类型的测试,但现在让我们关 ...
- realloc在aarch64_be-gcc的奇怪表现
最近遇到一个使用aarch64_be-gcc编译的ssh服务器出现不能通过ssh1协议使用密钥+passphrase不能正常登陆的问题. (⊙o⊙)…不要奇怪为啥还在用SSH1,我也在奇怪.. 一顿捣 ...
- 重复造轮子系列--内存池(C语言)
这个代码是我上个公司工作项目的里面内存管理(基于伙伴算法)的一个简化又简化的版本. 因为没有内存边界检查: 因为没有内存使用统计: 因为没有考虑线程安全: 因为没有内存分配操作的具体文件位置信息: 因 ...
- 文明距离(civil)
文明距离(civil) 题目描述 你被一个一向箔打中了,现在你掉到了一个一维空间中,也就是一个数轴上. 在这个数轴上,每秒会在一段连续的区间上出现“文明”.而你在每一秒开始的时候,可以花费x的代价移动 ...
- 解决:dubbo找不到dubbo.xsd报错
构建dubbo项目的时候会遇到: Multiple annotations found at this line: - cvc-complex-type.2.4.c: The matching wil ...
- Apache-commons.BeanUtils浅析
BeanUtils:通过反射控制JavaBean属性的实用方法. 1.cloneBean(Object) Object 克隆一个bean是基于可用属性的get和set方法,即 ...
- for 循环里的i++
写代码的时间也不短了,今天看快速排序的算法的时候才去更深层次得理解... for (语句 1; 语句 2; 语句 3) { 被执行的代码块 } 语句 1 (代码块)开始前执行 语句 2 定义运 ...
- classpath: spring 中的查找方式
Spring可以通过指定classpath*:与classpath:前缀加路径的方式从classpath加载文件,如bean的定义文件.classpath*:的出现是为了从多个jar文件中加载相同的文 ...