乐趣区

iTerm2结合 expect 脚本实现 ssh 登录跳板机后登录指定服务器

痛点
一般情况下, 公司所有的服务器都在内网,公网访问、管理服务器都要先通过登录一台跳板机,然后再由跳板机登录到相应的服务器进行操作,跳板机与服务器的连接都是内网地址
通常情况下, 我们都是通过两次 ssh, 第一次本地机器登录跳板机, 第二次在跳板机登录指定机器, 需要输入两次密码, 容易输错
后端码农每天要无数次登录各种机器, 如果能通过工具自动化, 每次能省半分钟, 并且心情会愉悦很多, 下面来进行实战
expect 脚本
#!/usr/bin/expect
set host [lindex $argv 0]

# 设置一个变量, 传入的参数,0 表示第一个参数, 同时也为了复用, 毕竟不只是管理一台服务器

set TERMSERV 跳板机 IP
set USER 跳板机用户名
set PASSWORD 跳板机密码
set UATUN 内网服务器用户名
set UATPWD 内网服务器密码

# 登录跳板机
spawn ssh -l $USER $TERMSERV

# expect 是 expect 环境的一个内部命令, 判断上一个指令输入之后的得到输出结果是否包含 ”” 双引号里的字符串,比如后面的 ”*password:*”,表示上一个输出结果包含 password:* 通配符表示前后可以是任意字符

# 类似于编程中的 switch 语句,exp_continue 相当于 continue
expect {
“yes/no” {send “yes\r”;exp_continue;}
“*password:*” {send “$PASSWORD\r”}
}
# 登录内网
expect “*$USER@*” {send “ssh -l $UATUN $host\r”}
expect {
“yes/no” {send “yes\r”;exp_continue;}
“*password:*” {send “$UATPWD\r”}
}
interact
# 执行完成后保持交互状态,把控制权交给控制台

将脚本保存成一个文件, 例如 server.exp
可执行权限,chmod +x server.exp

配置 iTerm2

进入配置页面, Profiles -> Open Profiles -> Edit Profiles

配置如图所示

send text at start: [expect 脚本路径] [参数 0] [参数 1] …
以空格分割
大功告成
到此为止, 已完成所有准备工作, 此时再进入指定机器, 只需要三步

打开 iTerm2
快捷键 Command+o 打开 Profiles 面板
选中某个 profile 单击, 就直接进入目标机器了, 开始挥洒方遒吧!

温馨提示

之所以在 expect 脚本中设置了一个参数, 是为了复用, 要进入别的机器, 复用同一个 .exp 脚本, 添加一个新的 profile 即可
exp 脚本可以多个参数, 达到更多场景下复用, 具体又童鞋自己考量
也可以把 exp 脚本当做 sh 脚本一样执行, 比如 ./test-server.exp in-test-server-goapi-1, 这样可以不必要配置 profile

GitHub

源码传送门
各种数据结构及算法实现, LeetCode 解题思路及答案
大厂面试题汇总及答案解析

本文为原创文章,转载注明出处,欢迎扫码关注公众号 楼兰 或者网站 https://lovecoding.club, 第一时间看后续精彩文章,觉得好的话,顺手分享到朋友圈吧,感谢支持。

退出移动版