0. 写在前面
有时候在控制台访问远程主机,例如远程跳板机,需要二次验证码,每次都去oauth工具获取二次验证码很麻烦。本文介绍一种可以在控制台获取二次验证码,并且能自动填充,整个登录跳板机过程非常丝滑,写成脚本,执行一下就可以登录了。
1. 准备工作:从 Chrome 身份验证器导出密钥
你需要先拿到跳板机对应的 TOTP 密钥(Secret Key),这是命令行生成验证码的关键。
-
打开 Chrome → 点击「身份验证器」插件(Authenticator)
-
点击插件左上角 ⚙️ 设置(齿轮图标)
-
找到跳板机对应的条目 → 点击 「编辑」或「查看密钥」
通常显示为一串 Base32 编码字符串(如:JBSWY3DPEHPK3PXP)
-
复制保存该密钥(记为 YOUR_TOTP_SECRET)
如果插件没有「查看密钥」选项:
点击 「备份」→「导出」,得到加密 / 明文备份
用文本编辑器打开,找到跳板机对应的 secret 字段
2. 安装oath-toolkit工具(生成TOTP验证码)
brew install oath-toolkit
测试工具
oathtool --totp -b "YOUR_TOTP_SECRET"
# 输出:6位数字验证码(如 123456)
3. 安装expect(自动交互输入)
brew install expect
4. 编写自动登录脚本(ssh_jump.exp)
创建 ~/ssh_jump.exp,内容如下:
#!/usr/bin/expect -f
# 配置参数(请修改)
set user "你的用户名"
set jump_host "跳板机地址"
set jump_port 22 ;# 默认22
set totp_secret "YOUR_TOTP_SECRET" ;# 你的TOTP密钥
# 生成6位验证码
set totp_code [exec oathtool --totp -b $totp_secret]
# 启动SSH连接
spawn ssh -p $jump_port $user@$jump_host
# 自动交互:等待验证码提示并输入
expect {
"Verification code" { send "$totp_code\r"; exp_continue }
"验证码" { send "$totp_code\r"; exp_continue }
"Password" { send_user "\n❌ 提示需要密码,检查配置\n"; exit 1 }
eof { send_user "\n连接结束\n"; exit 0 }
}
interact ;# 保持终端交互
5. 授权并运行
# 授权可执行
chmod +x ~/ssh_jump.exp
# 一键登录(自动输验证码)
~/ssh_jump.exp
6. 进阶:添加别名(一键执行)
编辑 ~/.zshrc 或 ~/.bash_profile:
alias jump="~/ssh_jump.exp"
生效:
source ~/.zshrc # 或 ~/.bash_profile
以后在控制台直接输入:
jump