PowerShell SSH连接双凭据重试实现问询:首套失败自动切换第二套凭据
实现方案
该需求可以实现,你现有脚本的基础逻辑已经成型,只需要修正错误捕获的配置、补充边界校验即可正常运行。
核心问题说明
你现有脚本的try/catch逻辑无法生效的核心原因是:PowerShell的try/catch默认仅能捕获终止错误,而Posh-SSH模块的New-SSHSession命令在认证失败时默认抛出非终止错误,不会进入catch块,需要添加-ErrorAction Stop参数强制将错误转为终止类型,才能触发重试逻辑。
优化后完整脚本
# 导入设备清单CSV $db = Import-Csv -Path ".\testdb.csv" # 读取用户输入的ID并匹配对应设备 $inputID = Read-Host -Prompt "请输入ID" $entry = $db -match $inputID # 校验匹配结果,避免空值报错 if (-not $entry) { Write-Host "未找到ID匹配的设备记录,脚本退出" exit 1 } Write-Host "匹配到目标设备IP:" $entry.IP # 定义两套凭据 $User = "user" $Password = "pass" $User2 = "user2" $Password2 = "pass2" $secpasswd = ConvertTo-SecureString $Password -AsPlainText -Force $Credentials = New-Object System.Management.Automation.PSCredential($User, $secpasswd) $secpasswd2 = ConvertTo-SecureString $Password2 -AsPlainText -Force $Credentials2 = New-Object System.Management.Automation.PSCredential($User2, $secpasswd2) # 清理旧的受信主机记录 Get-SSHTrustedHost | Remove-SSHTrustedHost $SessionID = $null try { # 优先使用第一套凭据连接,加-ErrorAction Stop触发catch $SessionID = New-SSHSession -ComputerName $entry.IP -Credential $Credentials -AcceptKey:$true -ErrorAction Stop Write-Host "使用第一套凭据连接成功" } catch { Write-Host "第一套凭据连接失败,尝试使用第二套凭据连接" try { $SessionID = New-SSHSession -ComputerName $entry.IP -Credential $Credentials2 -AcceptKey:$true -ErrorAction Stop Write-Host "使用第二套凭据连接成功" } catch { Write-Host "两套凭据均连接失败,请检查凭据或目标设备状态" exit 1 } } # 后续可以基于$SessionID执行SSH命令
可选优化(多凭据扩展)
如果后续需要支持更多套凭据,可以将凭据存入数组循环尝试,避免多层嵌套:
# 定义凭据数组,按优先级排序 $credList = @( (New-Object System.Management.Automation.PSCredential("user1", (ConvertTo-SecureString "pass1" -AsPlainText -Force))), (New-Object System.Management.Automation.PSCredential("user2", (ConvertTo-SecureString "pass2" -AsPlainText -Force))), (New-Object System.Management.Automation.PSCredential("user3", (ConvertTo-SecureString "pass3" -AsPlainText -Force))) ) $SessionID = $null foreach ($cred in $credList) { try { $SessionID = New-SSHSession -ComputerName $entry.IP -Credential $cred -AcceptKey:$true -ErrorAction Stop Write-Host "使用凭据$($cred.UserName)连接成功" break } catch { Write-Host "凭据$($cred.UserName)连接失败,尝试下一套" } } if (-not $SessionID) { Write-Host "所有凭据均连接失败" exit 1 }
内容的提问来源于stack exchange,提问作者user12428212
相关产品推荐
相关产品推荐

