golang ssh拨号超时

huangapple go评论65阅读模式
英文:

golang ssh dial timeout

问题

创建 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
}

PSssh.ClientConfig 中的超时设置为 5 

请注意,此代码中的 DialTimeout 是通过使用 goroutine 和 channel 来实现的。首先,一个 goroutine 用于等待一段时间后设置错误并关闭通道。另一个 goroutine 用于执行 SSH 连接并在完成后关闭通道。主函数通过 <-done 语句等待通道关闭,然后返回连接和错误。

此外,需要注意的是,ssh.ClientConfig 中的超时设置为 5 秒。

英文:

What is the best way to create DialTimeout on ssh connection? For example, this code always returns "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(&quot;Ping deadline exceed&quot;)
		log.Printf(&quot;%v\nStatus: bad %s -&gt; %s&quot;, err, t.serverAddr, addr)
		t.writeStatus(bad)
		done &lt;- 1
		close(done)
	}()
	go func() {
		conn, err = sshConn.Dial(&quot;tcp&quot;, addr)
		if err != nil {
			t.writeStatus(bad)
			log.Printf(&quot;%v\nStatus: bad %s -&gt; %s&quot;, err, t.serverAddr, addr)
		}
		done &lt;- 1
		close(done)
	}()
	&lt;-done
	return conn, err
}

PS Timeout in ssh.ClientConfig is set to 5 seconds

答案1

得分: 3

过去两年了,但是可能有人需要这个解决方案。所以在这里给出解决方案。

在ssh.Dial中,你可以通过ssh.ClientConfig来提供配置,

config := &ssh.ClientConfig { Timeout: time.Minute }
client, _ := ssh.Dial("tcp", t.ServerAddr, config)

你可以在这里找到更多信息:

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

英文:

> It's been two years but, may someone need the solution. So here it is.

In ssh.Dial, you can give configuration via ssh.ClientConfig,

config := &amp;ssh.ClientConfig { Timeout: time.Minute }
client, _ := ssh.Dial(&quot;tcp&quot;, t.ServerAddr, config)

You can find more in here:

>// A Timeout of zero means no timeout.
Timeout time.Duration

答案2

得分: -1

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

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

连接文档中可以了解到:

DialTimeout的功能类似于Dial,但它接受一个超时参数。超时包括必要的名称解析。

英文:

Instead of using sshConn.Dial take a look at:

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

From the connection docs:

> DialTimeout acts like Dial but takes a timeout. The timeout includes
> name resolution, if required.

huangapple
  • 本文由 发表于 2017年3月30日 19:36:08
  • 转载请务必保留本文链接:https://go.coder-hub.com/43116757.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定