如何通过PowerShell脚本实现带Cisco DUO MFA的Linux SSH登录
解决Cisco DUO MFA交互式认证的PowerShell SSH脚本问题
问题背景
部署Cisco DUO MFA作为二次认证环节(需选择认证方式选项)后,无法通过脚本参数触发MFA认证。一级认证采用Linux用户名与密码,不确定SSH会话是在MFA认证之前还是之后建立,现有脚本无法完成MFA触发流程。
问题分析
原脚本的核心错误在于:DUO MFA是交互式SSH认证流程的一部分,并非在SSH会话建立完成后执行的命令。当调用New-SSHSession时,用户名密码认证通过后,SSH连接会卡在DUO的交互式提示阶段,此时$session.Connected并不会返回true,后续的Invoke-SSHCommand也无法正常发送命令——因为会话根本没完成认证流程。
解决方案
需要直接在SSH认证的交互式流中处理DUO MFA的选择输入,而非试图在“已建立的会话”中发送命令。以下是修改后的脚本:
# 导入Posh-SSH模块 Import-Module Posh-SSH # 定义连接参数 $hostname = "your.linux.server" $username = "your_username" $password = "your_password" $mfaOption = "1" # DUO提示中对应的推送认证选项编号 # 创建安全密码对象 $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($username, $securePassword) # 初始化SSH连接并获取交互流 try { $sshClient = New-SSHSession -ComputerName $hostname -Credential $credential -AcceptKey -PassThru $stream = $sshClient.CreateShellStream("dumb", 80, 24, 800, 600, 1024) # 等待并处理MFA提示 $output = "" do { Start-Sleep -Milliseconds 500 $output += $stream.Read() # 检测DUO的MFA提示关键词(根据实际提示调整,比如"Please select an authentication method") } until ($output -match "Please select an authentication method" -or $output -match "Verification code") # 发送MFA选项 $stream.WriteLine($mfaOption) Write-Output "已发送MFA选项 $mfaOption,请在DUO客户端确认推送" # 等待认证完成并验证会话 Start-Sleep -Seconds 10 $whoamiOutput = Invoke-SSHCommand -SSHSession $sshClient.SessionId -Command "whoami" if ($whoamiOutput.Output) { Write-Output "认证成功,当前登录用户:$($whoamiOutput.Output)" # 在这里执行后续需要的命令 } else { Write-Output "MFA认证失败" } } catch { Write-Output "连接或认证出错:$_" } finally { # 清理会话 if ($sshClient) { Remove-SSHSession -SessionId $sshClient.SessionId } }
关键修改说明
- 使用
CreateShellStream获取SSH的交互式输入流,直接处理认证过程中的提示信息 - 通过循环检测DUO的MFA提示关键词,确保在正确时机发送认证选项
- 修正了原脚本中错误假设SSH会话已在MFA前建立的逻辑
内容的提问来源于stack exchange,提问作者Vijay Js
相关产品推荐
相关产品推荐

