首页 > 解决方案 > ssh sftp服务器中NewChannel与Request之间的区别

问题描述

我正在查看 go sftp 服务器示例代码

https://github.com/pkg/sftp/blob/master/examples/go-sftp-server/main.go

有些代码我不清楚

_, chans, reqs, err := ssh.NewServerConn(nConn, config)
if err != nil {
    log.Fatal("failed to handshake", err)
}
fmt.Fprintf(debugStream, "SSH server established\n")

// The incoming Request channel must be serviced.
go ssh.DiscardRequests(reqs)

// Service the incoming Channel channel.
for newChannel := range chans {
    ...
}

第一:ssh.NewServerConn如果 NewChannel( chans) 表示对通道的新请求,那么 Request 是什么reqs。那么这里的 chans 和 reqs 有什么区别。

二:为什么需要ssh.DiscardRequests(reqs)

标签: gosshsftp

解决方案


查看 ssh.NewServerConn的文档,它似乎返回以下内容:

  1. *服务器连接
  2. <-chan 新频道
  3. <-chan *请求
  4. 错误

第二个返回值,NewChannel

表示对通道的传入请求

第三个返回值,Request

是在正常数据流之外发送的请求

这并不能真正回答你的问题,但它确实提供了有用的线索来寻找哪里。

所以回答你的问题:

  1. chans接收到服务器的新连接。使用从chans接收到的值,您可以接受该连接并与之通信,或者只是拒绝该连接。这可以认为是多人通过 ssh 登录到远程机器并处理多个会话。

    reqs保存发送到服务器或客户端的全局请求(在此处定义),这些请求不应发送到任何特定通道。RFC4254 给出了“为特定端口启动 TCP/IP 转发”这样的请求示例。您可以在此处查看
    ssh 包如何使用incomingRequests 通道的内部用法。

  2. ssh.NewServerConn 的文档明确指出

    必须为 Request 和 NewChannel 通道提供服务,否则连接将挂起。

    如果此服务器确实接收到全局请求,则如果请求要求回复,则需要对其进行适当处理。


推荐阅读