背景
为了安全,多数公司会采用跳板机的方式访问内网服务器,登录需要输入AD密码和谷歌验证码,非常繁琐,这里提供一个基于expect脚本的方法,实现一键登录跳板机
注:笔者在 MacOS 和 Ubuntu20.04 环境下测试ok,其他环境大同小异,按需修改即可。
方法
此方式思路是利用expect脚本交互式输入预设的AD密码,输入实时获取的谷歌验证码(使用 python authenticator 工具)
所需依赖
安装以下工具,各平台安装方法请自行搜索:
- expect
- python
- pip
- authenticator
authenticator配置
安装
pip install authenticator
若不成功,请先升级pip到最新版本
配置
- 执行
authenticator add $user
(AD账号无邮箱后缀) - 提示
Enter passphrase
这里输入2次AD密码 - 提示
Enter shared secret
需要把谷歌验证码的字符串输入到这里 - 到这里就配置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
|
使用
- 把脚本开头的几个变量设置一下,或者自己修改为从argv里读取
USERNAME
AD账户不带邮箱后缀PASSWORD
AD密码JUMP_ZONE
是跳板机的区域代码,按需LINK_TYPE
是连接协议,比如 ssh | sftp
,按需
- 假设保存文件为
~/jump_ssh.exp
- 执行脚本即可自动化登录到跳板机
expect ~/jump_ssh.exp
- 也可以给脚本加上可执行权限
chmod a+x ~/jump_ssh.exp
- 然后直接执行即可
~/jump_ssh.exp