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

SSH连接失败重试异常:公网IP失败未触发私网IP重试

问题:SSH公网连接失败未自动重试私网IP

我要实现「公网IP(PublicIpAddress)SSH连接失败时自动尝试私网IP(PrivateIpAddress)」的逻辑,但当前代码不生效——当公网IP连接返回255错误码时,程序根本没触发私网IP的重试。

现有代码实现

遍历机器列表的逻辑:

for _, machine := range selected {
    err := ssh(machine.KeyName, Username, machine.PublicIpAddress)
    if err != nil {
        err = ssh(machine.KeyName, Username, machine.PrivateIpAddress)
    }
    if err != nil {
        fmt.Println(err)
    }
}

SSH函数代码:

func ssh(keyname string, user string, address string) error {
  var err error
  // 省略其他初始化代码...

  if err := cmd.Run(); err != nil {
        fmt.Println(err.Error())
  }
  return err
}

问题根源

问题出在ssh函数的错误变量作用域上:

  • 函数开头声明的var err error是外层变量,但cmd.Run()时用了if err := cmd.Run();,这里的err是局部变量,和外层的err完全无关。
  • 哪怕cmd.Run()返回了255错误,外层的err依然是nil,导致上层的if err != nil判断永远不成立,自然不会执行私网IP的重试逻辑。

修复方案

1. 修正SSH函数的错误赋值

把局部错误变量去掉,直接将cmd.Run()的结果赋值给外层的err:

func ssh(keyname string, user string, address string) error {
  var err error
  // 省略其他初始化代码...

  err = cmd.Run()
  if err != nil {
        fmt.Println(err.Error())
  }
  return err
}

2. (可选)精准捕获255错误重试

如果只需要针对255错误码触发重试,可以在上层调用时做更精准的判断(需要根据exec.ExitError断言错误类型):

for _, machine := range selected {
    err := ssh(machine.KeyName, Username, machine.PublicIpAddress)
    // 判断是否是退出码为255的执行错误
    if exitErr, ok := err.(*exec.ExitError); ok && exitErr.ExitCode() == 255 {
        err = ssh(machine.KeyName, Username, machine.PrivateIpAddress)
    }
    if err != nil {
        fmt.Println(err)
    }
}

内容的提问来源于stack exchange,提问作者badman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:15:54