Ubuntu 22 下脚本登录MFA堡垒机

当 SSH 登录需要 MFA(多因素认证,如动态验证码) 时,由于涉及交互式提示(密码输入后需进一步输入验证码),普通的 ssh 或 sshpass 无法直接处理,需要使用 expect 工具 来自动化交互式会话。expect 可以监听 SSH 输出的提示信息,然后自动(或手动)输入对应的验证码。

解决思路

  1. 安装 expectexpect 是专门用于自动化交互式命令的工具,支持监听特定字符串提示并发送响应。
  2. 编写 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'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值