首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么关闭sftp客户端不关闭整个SSH连接?

为什么关闭sftp客户端不关闭整个SSH连接?
EN

Stack Overflow用户
提问于 2020-06-10 16:26:42
回答 1查看 2.2K关注 0票数 1

我有一个SFTP客户端,它通过ssh连接并传输文件。我的客户端刚刚向我报告,SFTP客户端没有关闭已打开的连接。

我检查我的代码,发现我正在调用SFTP Close()函数。我创建了一个示例来测试我的理论。

代码语言:javascript
复制
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客户机,并关闭,它在代码中做了一些修改,从而使工作起来。

代码语言:javascript
复制
   if err := sftpClient.Close(); err != nil {
            log.Fatal(err)
        } else {
            client.Close()
        }

那么,SFTP Close() fn会做什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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.到同一台服务器重用它)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62308455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档