Ubuntu 22 下脚本登录MFA堡垒机
当 SSH 登录需要 MFA(多因素认证,如动态验证码) 时,由于涉及交互式提示(密码输入后需进一步输入验证码),普通的 ssh
或 sshpass
无法直接处理,需要使用 expect
工具 来自动化交互式会话。expect
可以监听 SSH 输出的提示信息,然后自动(或手动)输入对应的验证码。
解决思路
- 安装
expect
:expect
是专门用于自动化交互式命令的工具,支持监听特定字符串提示并发送响应。 - 编写
expect
脚本:脚本中定义 SSH 连接流程,依次处理:- 等待密码提示,发送密码;
- 等待 MFA 验证码提示,发送验证码(支持手动输入或自动获取,如从谷歌验证器获取)。
具体步骤
步骤 1:安装 expect
# Ubuntu/Debian
sudo apt update && sudo apt install expect# CentOS/RHEL
sudo yum install expect
步骤 2:编写 expect
脚本处理 MFA 认证
创建脚本 ssh_mfa_login.exp
,根据实际的提示信息调整(重点匹配 SSH 输出的密码提示和 MFA 提示)。
示例脚本(手动输入验证码)
适用于需要用户手动输入 MFA 验证码的场景:
#!/usr/bin/expect -f# 配置参数(根据实际情况修改)
set username "admin" # SSH 用户名
set host "192.168.1.100" # 目标主机 IP/域名
set port "2222" # SSH 端口
set password "mypass123" # SSH 密码# 启动 SSH 连接
spawn ssh -p $port $username@$host# 处理密码提示(匹配类似 "Password: " 或 "password: " 的提示)
expect {"Password:" { send "$password\r" } # 发送密码(\r 表示回车)"password:" { send "$password\r" } # 兼容小写提示timeout { puts "连接超时(密码阶段)"; exit 1 }
}# 处理 MFA 验证码提示(匹配类似 "Verification code: " 或 "Enter MFA code: " 的提示)
expect {"Verification code:" { puts "请输入 MFA 验证码:"set mfa_code [gets stdin] # 从终端读取用户输入的验证码send "$mfa_code\r" # 发送验证码}"Enter MFA code:" { puts "请输入 MFA 验证码:"set mfa_code [gets stdin]send "$mfa_code\r"}timeout { puts "连接超时(MFA 阶段)"; exit 1 }eof { puts "连接失败(MFA 阶段)"; exit 1 }
}# 保持登录状态(进入交互式会话)
interact
把ssh_mfa_login.exp文件放在用户目录~下。
步骤3:增加命令别名ssh_bastion方便使用
先用expect ~/ssh_mfa_login.exp检查脚本是否正确,若已经正确,则在~/.bash_aliases文件里添加下面代码:
alias ssh_bastion='expect ~/ssh_mfa_login.exp'