大家好,我希望了解项目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 文档中的示例
- 1 回答
- 0 关注
- 92 浏览
添加回答
举报
0/150
提交
取消