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
相关产品推荐
相关产品推荐

