我有一个SFTP客户端,它通过ssh连接并传输文件。我的客户端刚刚向我报告,SFTP客户端没有关闭已打开的连接。
我检查我的代码,发现我正在调用SFTP Close()函数。我创建了一个示例来测试我的理论。
func main() {
config := &ssh.ClientConfig{
User: "admin",
Auth: []ssh.AuthMethod{
ssh.Password("admin123"),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
for {
client, err := ssh.Dial("tcp", "192.168.0.100:22", config)
if err != nil {
log.Fatal("Failed to dial: ", err)
}
sftpClient, err := sftp.NewClient(client)
if err != nil {
log.Fatalf("SFTP client got error %s", err)
}
results, err := sftpClient.Glob("/Users/admin/Desktop/sftp/*")
if err != nil {
log.Fatal("GLOB error: ", err)
}
for _, r := range results {
log.Println(r)
}
fmt.Println("We are closing connection ..")
if err := sftpClient.Close(); err != nil {
log.Fatal(err)
}
time.Sleep(20 * time.Second)
}我将在fmt.Println语句之后关闭连接。
我从netstat中检查的确实是连接are not closed。
我决定关闭ssh.Dial客户机,并关闭,它在代码中做了一些修改,从而使工作起来。
if err := sftpClient.Close(); err != nil {
log.Fatal(err)
} else {
client.Close()
}那么,SFTP Close() fn会做什么呢?
发布于 2020-06-10 16:30:14
sftpClient.Close()是做什么的(与client.Close()不同
它只关闭SSH传输上的sftp连接,但保持该传输打开。
这有什么用?
因为您可能希望通过该传输访问其他服务--运行shell命令,或与终端进行交互会话,等等--而不需要再次验证和支付其他设置的费用。
我能看到这个“在现实生活中”使用的功能吗?
当然!In OpenSSH, use the ControlMaster / ControlSocket options可以缓存每个远程目的地的单个传输,并在其上运行多个客户端,您的Go程序将具有与这里相同的行为(运行一个OpenSSH sftp命令,退出它,传输仍然是打开的,等待另一个sftp命令,一个ssh命令,&c.到同一台服务器重用它)。
https://stackoverflow.com/questions/62308455
复制相似问题