Featured image of post 使用expect脚本一键登录跳板机

使用expect脚本一键登录跳板机

非常方便的一键登录跳板机教程

背景

为了安全,多数公司会采用跳板机的方式访问内网服务器,登录需要输入AD密码和谷歌验证码,非常繁琐,这里提供一个基于expect脚本的方法,实现一键登录跳板机

注:笔者在 MacOS 和 Ubuntu20.04 环境下测试ok,其他环境大同小异,按需修改即可。

方法

此方式思路是利用expect脚本交互式输入预设的AD密码,输入实时获取的谷歌验证码(使用 python authenticator 工具)

所需依赖

安装以下工具,各平台安装方法请自行搜索:

  • expect
  • python
  • pip
  • authenticator

authenticator配置

安装

pip install authenticator 若不成功,请先升级pip到最新版本

配置

  1. 执行 authenticator add $user(AD账号无邮箱后缀)
  2. 提示 Enter passphrase 这里输入2次AD密码
  3. 提示 Enter shared secret 需要把谷歌验证码的字符串输入到这里
  4. 到这里就配置ok了,执行 authenticator generate ,输入AD密码,看到谷歌验证码正常输出就是成功了

配置完成之后就可以使用expect脚本来自动登录了

注意点

多数公司的AD密码可能需要每隔一段时间更新一次,在更新AD密码后,使用 authenticator 仍然需要输入旧密码,所以下述脚本内相应的做了一下兼容

expect脚本

脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/expect

set timeout 1000
set USERNAME xxx
set PASSWORD_GEN xxxx  # 首次配置 authenticator 时使用的密码
set PASSWORD xxxxxxxx  # AD密码,每隔 xx 天更新一次
set JUMP_ZONE zone     # 假如跳板机区分区域
set LINK_TYPE ssh
set DOMAIN example.com # 登录域名

# 判断是否是 vscode 云端环境
if {$JUMP_ZONE != "vscode"} {
    set main_response "Opt>"
} else {
    set main_response "Ip:"
}

spawn authenticator generate
expect "passphrase:"
send "$PASSWORD_GEN\r"
expect "seconds"
set found [regexp {([0-9]{6})} $expect_out(buffer) match verify_code]
if {$found == 1} {
    send \x03   # 发送 Ctrl-C 结束 authenticator 进程
} else {
    puts "invalid verification code"
    exit
}

spawn ${LINK_TYPE} ${USERNAME}@jump-${JUMP_ZONE}.${DOMAIN}
expect {
    "yes/no" { send "yes\r"; exp_continue }
    "Verification code:" { send "$verify_code\r"; exp_continue }
    "assword:" { send "$PASSWORD\r"; exp_continue }
    "MFA auth" { send "$verify_code\r"; exp_continue }
    $main_response { }
}
interact

使用

  1. 把脚本开头的几个变量设置一下,或者自己修改为从argv里读取
    • USERNAME AD账户不带邮箱后缀
    • PASSWORD AD密码
    • JUMP_ZONE 是跳板机的区域代码,按需
    • LINK_TYPE 是连接协议,比如 ssh | sftp,按需
  2. 假设保存文件为 ~/jump_ssh.exp
  3. 执行脚本即可自动化登录到跳板机 expect ~/jump_ssh.exp
    1. 也可以给脚本加上可执行权限 chmod a+x ~/jump_ssh.exp
    2. 然后直接执行即可 ~/jump_ssh.exp
Built with Hugo
主题 StackJimmy 设计