如何自动化实现带MFA验证的OpenVPN命令行连接
OpenVPN 自动传入TOTP验证码实现全自动化连接
你之前使用--static-challenge参数无效是预期行为:该参数的设计目标就是面向人工交互场景,哪怕你预传入OTP值,也会强制停在确认步骤等待用户手动回车,没有内置跳过确认的选项。
以下是两种实际验证过的可行方案,按易用性排序:
方案1:进程替换传参(无额外依赖,优先尝试)
绝大多数OpenVPN MFA部署的认证输入顺序是固定的:依次读取用户名、账号密码、TOTP验证码。你可以通过进程替换的方式,把所有需要输入的内容按顺序喂给OpenVPN进程,完全不需要修改原有ovpn配置或凭证文件。
如果你的~/.ssh/credentials_vpn遵循OpenVPN标准格式(第一行用户名、第二行密码),直接执行以下命令即可:
sudo /usr/local/opt/openvpn/sbin/openvpn --config ~/.ssh/client.ovpn --auth-user-pass <( cat ~/.ssh/credentials_vpn totp vpn )
部分服务端会要求将TOTP验证码直接拼接在密码字段后提交,不需要单独输入第三行。遇到这种情况直接把凭证文件的密码行改成
原密码$(totp vpn)的格式即可,不需要额外传参。
如果执行后仍然卡在验证码输入步骤,说明服务端启用了动态挑战应答机制,用下面的expect方案可以全场景兼容。
方案2:Expect 交互自动化(100%兼容所有MFA场景)
Expect是专门处理交互式命令行流程的工具,macOS环境可通过brew install expect直接安装。它会实时监听OpenVPN的输出,一旦匹配到验证码输入提示,就实时生成TOTP码填入提交,完全不需要适配服务端的认证逻辑,还能避免提前生成TOTP导致的码过期问题。
新建连接脚本auto_vpn.sh,写入以下内容:
#!/usr/bin/expect -f set timeout 15 # 启动OpenVPN连接进程 spawn sudo /usr/local/opt/openvpn/sbin/openvpn --config ~/.ssh/client.ovpn --auth-user-pass ~/.ssh/credentials_vpn # 匹配各类常见的MFA输入提示,自动填入实时生成的TOTP码 expect { -re "(验证码|OTP|MFA|CHALLENGE|Challenge).*: " { send "[exec totp vpn]\r" } } # 连接成功后保持交互,把控制权交还给用户 interact
给脚本添加执行权限后直接运行即可完成自动连接:
chmod +x auto_vpn.sh ./auto_vpn.sh
避坑提示
- 不要在自动化场景下使用
--static-challenge参数,该参数没有提供跳过人工确认的开关,所有尝试修改该参数实现无交互的方案都是无效的。 - 如果遇到TOTP码校验失败,优先检查TOTP生成命令的执行时机:必须在弹出输入提示的瞬间生成验证码,提前生成很容易因为OpenVPN启动耗时长导致码过期。
内容的提问来源于stack exchange,提问作者iArc13
相关产品推荐
相关产品推荐

