You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:27:04