我有一个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 是什么呢?
答案 0 :(得分:1)
sftpClient.Close()
的作用(与client.Close()
不同吗?它仅通过SSH传输关闭sftp连接,但使该传输保持打开状态。
因为您可能希望通过该传输访问 other 服务-运行shell命令或与终端的交互式会话等,而无需重新认证并支付其他设置费用第二次。
当然! In OpenSSH, use the ControlMaster
/ ControlSocket
options为每个远程目标缓存单个传输并在其上运行多个客户端,您将具有Go程序在此处所做的相同行为(运行OpenSSH sftp
命令,退出它,然后传输仍将处于打开状态,等待另一个sftp
命令,一个ssh
命令,以及转到同一服务器以重用它)。