为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
守着星空守着你 2022-07-11 16:33:18
大家好,我希望了解项目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 出现如此重要。
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

   time.Sleep(50 * time.Millisecond)

为数据到达提供了足够的时间psChannel,因此当触发复制时,有对读取的引用。

通常管道是同步的,尽管您可以实现异步操作,但最终可能会以这种黑客方式结束。实现代码中内容的一种优雅形式是使用 go 管道

正如代码所说,它将在两个通道之间交换数据,a <-> b。如果什么都没有到达,整个程序将无法正常工作。确保time.Sleep准备就绪。不仅,使用中的底层 ssh 实现需要握手,否则服务器会挂起,这可能会产生一小部分延迟。

顺便说一句,此实现依赖于ssh NewServerConn 文档中的示例


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信