io.Copy 没有 sleep + golang sftp-proxy 就无法工作

大家好,我希望了解项目https://github.com/Freeaqingme/SSHalama/一个 SFTP 代理。


我偶然发现了这段代码


    go s.pipeRequests(psChannel, sChannel, psRequests, sRequests)

    time.Sleep(50 * time.Millisecond)

    go s.pipe(sChannel, psChannel)

    go s.pipe(psChannel, Channel)

在这里,time.Sleep(50 * time.Millisecond)非常关键的忽略 SFTP 会话建立但没有出现 PTTY。


完整的代码如下所示。


  func (s *Server) handleChannel(newChannel ssh.NewChannel, rClient *ssh.Client) {

    if newChannel.ChannelType() != "session" {

        newChannel.Reject(ssh.UnknownChannelType, "unknown channel type: "+newChannel.ChannelType())

        return

    }

    psChannel, psRequests, err := newChannel.Accept()

    if err != nil {

        panic("could not accept channel.")

    }


    sChannel, sRequests, err := rClient.OpenChannel(newChannel.ChannelType(), nil)

    if err != nil {

        panic("Failed to create session: " + err.Error())

    }


    go s.pipeRequests(psChannel, sChannel, psRequests, sRequests)

    time.Sleep(50 * time.Millisecond)

    go s.pipe(sChannel, psChannel)

    go s.pipe(psChannel, sChannel)

}

    

func (s *Server) pipe(dst, src ssh.Channel) {

    _, err := io.Copy(dst, src)

    if err != nil {

        fmt.Println(err.Error())

    }


    dst.CloseWrite()

}

我想了解为什么sleep ( time.Sleep(50 * time.Millisecond)) 对于 SFTP 会话的工作和 PTTY 出现如此重要。


守着星空守着你
浏览 93回答 1
1回答

蝴蝶不菲

&nbsp;&nbsp;&nbsp;time.Sleep(50&nbsp;*&nbsp;time.Millisecond)为数据到达提供了足够的时间psChannel,因此当触发复制时,有对读取的引用。通常管道是同步的,尽管您可以实现异步操作,但最终可能会以这种黑客方式结束。实现代码中内容的一种优雅形式是使用 go 管道正如代码所说,它将在两个通道之间交换数据,a <-> b。如果什么都没有到达,整个程序将无法正常工作。确保time.Sleep准备就绪。不仅,使用中的底层 ssh 实现需要握手,否则服务器会挂起,这可能会产生一小部分延迟。顺便说一句,此实现依赖于ssh NewServerConn 文档中的示例
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go