很多公司会给开发人员提供测试或发布服务用的服务器。为了控制权限,通常会通过跳板机统一管理登录入口,并且除了用户名、密码之外,还会增加身份验证码。
安全性是提高了,但对使用者来说也带来了一些不便:
实现:
一条命令登录 JumpServer,并停在资源选择主界面
也就是自动完成:
连接 JumpServer SSH 网关
输入用户名
输入密码
生成并输入身份验证码
进入资源选择页面
一般 JumpServer 的 Web 登录地址类似:
http://xx-ip/core/auth/login/?next=/luna/
脚本不能直接 SSH 这个 Web URL,需要走 JumpServer 的 SSH 网关。常见 SSH 入口是:
ssh -p 2222 用户名@xx-ip
需要先确认两件事:
JumpServer 是否支持 SSH 登录
SSH 网关端口是否为 2222
如果不支持 SSH 登录,需要找管理员开启或确认配置。管理员不同意的话,后面的步骤就不用继续了,看了也没用。
需要两个工具:
brew install expect oath-toolkit
它们的作用分别是:
expect: 自动输入交互式 SSH 登录信息
oathtool: 根据 Google Authenticator secret 生成 6 位验证码
不同身份验证器的导出方式可能不同。这里以 Google Authenticator 为例。
Google Authenticator 已绑定的账号里看不到原始的 TOTP secret,需要通过“转移账号”功能导出。
操作步骤:
otpauth-migration://offline?data=...
然后从这段内容里解码出 TOTP secret。
可以让 AI 帮你解码;不放心的话,也可以自己搜索相关工具,本地安装后自行解码。
如果不想折腾导出,也可以重新绑定一次身份验证器。一般第一次绑定时会显示二维码或密钥,那个密钥就是 TOTP secret。
创建脚本文件:
vim jms.sh
内容如下。注意前几个变量需要根据自己的信息修改:
#!/usr/bin/env bash
export JMS_HOST="跳板机ip"
export JMS_PORT="跳板机ssh端口,一般是2222"
export JMS_USER="登录名称"
export JMS_PASSWORD="登录密码"
export JMS_OTP="$(oathtool --totp -b "身份验证器拿到的TOTP secret")"
if [ -z "$JMS_OTP" ]; then
echo "Failed to generate OTP"
exit 1
fi
expect -c '
set timeout 30
set host $env(JMS_HOST)
set port $env(JMS_PORT)
set user $env(JMS_USER)
set password $env(JMS_PASSWORD)
set otp $env(JMS_OTP)
spawn ssh -p $port $user@$host
expect {
-re "Are you sure you want to continue connecting.*" {
send "yes\r"
exp_continue
}
-re "(?i)password:" {
send "$password\r"
exp_continue
}
-re "(?i)(verification code|otp|mfa|authenticator|验证码|动态码|认证码)" {
send "$otp\r"
exp_continue
}
-re "(?i)(Last login|Welcome|资产|资源|JumpServer|Opt|请选择|ID|Name)" {
interact
}
timeout {
interact
}
eof {
exit
}
}
' chmod +x jms.sh
之后直接运行:
./jms.sh
脚本会自动完成用户名、密码和身份验证码输入,并停在 JumpServer 的资源选择主界面。
如果想把命令再缩短一点,可以加一个 alias。
编辑 ~/.zshrc:
alias jms="/你的路径/jms.sh"
使配置生效:
source ~/.zshrc
之后只需要执行:
jms
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。