不输入用户名密码通过跳板机登录到线上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命令.现在密码变了,取消公钥, ...
随机推荐
- java 日期处理相关
/** *获取指定日期 前后指定天数的 日期 * */ public static String getNewDate(String sdate, int days) throws Exception ...
- C++ Primer 第3章 字符串、向量和数组
C++ Primer 第3章 字符串.向量和数组 C Primer 第3章 字符串向量和数组 1 命名空间的using声明 2 标准库类型string 3 标准库类型vector 4 迭代器介绍 5 ...
- tomcat启动后服务访问404
. 解决办法: 在tomcat文件中有个work文件夹.其中,tomcat属于admin用户,work属于 admin用户 ,启动服务由admin用户启动. 但是发现work文件下的目录权限属于 ...
- Fomo3D代码分析以及漏洞攻击演示
Fomo3D过去的一周内赚足了噱头,一场光明正大的"庞氏"游戏疯狂吸金,在链得得此前的报道中提到"Fomo3D的开发者,是对生态有深刻理解的现实主义者.Fomo3D鼓励黑 ...
- fragment中的WebView返回上一页
public final class Text1Fm extends Fragment { static WebView mWeb; private View mContentView; privat ...
- 二、vue响应式对象
Object.defineProperty Object.defineProperty 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象,先来看一下它的语法: Obj ...
- 【CZY选讲·Triangle】
题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解: ①相 ...
- bzoj4772 显而易见的数论
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4772 sol :这个题卡了我一整天QAQ 出题人简直丧心病狂,卡内存+卡常数QAQ 题意就是, ...
- HDU1263 map二维运用
#include <iostream> #include <cstdio> #include <cstring> #include <map> #inc ...
- Hibernate 中 get()和load()的区别
一.1.程序检索数据库中不存在的OID: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回nu ...