英文:
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
}
PS:ssh.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("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
}
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 := &ssh.ClientConfig { Timeout: time.Minute }
client, _ := ssh.Dial("tcp", 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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论