Golang SSH拨号超时

5

如何在ssh连接中创建最佳的DialTimeout?例如,这段代码总是返回"Ping deadline exceed":

func (t *Tunnel) ping(sshConn *ssh.Client, addr string) (net.Conn, error) {
    var (
        conn net.Conn
        err  error
        done chan int
    )
    go func() {
        time.Sleep(getSeconds(10))
        err = errors.New("Ping deadline exceed")
        log.Printf("%v\nStatus: bad %s -> %s", err, t.serverAddr, addr)
        t.writeStatus(bad)
        done <- 1
        close(done)
    }()
    go func() {
        conn, err = sshConn.Dial("tcp", addr)
        if err != nil {
            t.writeStatus(bad)
            log.Printf("%v\nStatus: bad %s -> %s", err, t.serverAddr, addr)
        }
        done <- 1
        close(done)
    }()
    <-done
    return conn, err
}

ssh.ClientConfig中的PS超时设置为5秒


我在ssh.ClientConfig中设置了超时时间,但是当ssh服务器关闭时,我仍然遇到无限延迟的问题。然而,我发现了一个错误,需要创建done chan int,即使用make(chan int) - abritov
抱歉,我最初误解了你的问题。无法为ssh“direct-tcpip”命令提供超时,但远程主机应该能够最终超时,尽管可能不会在10秒内(取决于远程主机的内核TCP设置)。 - JimB
2个回答

3
“已经过去两年了,但是可能有人需要这个解决方案。所以在这里分享一下。”
“在ssh.Dial中,你可以通过ssh.ClientConfig来配置。”
config := &ssh.ClientConfig { Timeout: time.Minute }
client, _ := ssh.Dial("tcp", t.ServerAddr, config)

您可以在此处找到更多信息:

// Timeout为零表示没有超时。 Timeout time.Duration


-1

不要使用sshConn.Dial,看一下:

func DialTimeout(network, address string, timeout time.Duration) (Conn, error)

来自连接文档

DialTimeout类似于Dial,但需要一个超时时间。如果需要,超时时间包括名称解析。


direct-tcpip不支持截止日期。https://sourcegraph.com/github.com/golang/crypto/-/blob/ssh/tcpip.go#L453。 - Berkant İpek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接