go - 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)
解决方案
查看 ssh.NewServerConn的文档,它似乎返回以下内容:
- *服务器连接
- <-chan 新频道
- <-chan *请求
- 错误
第二个返回值,NewChannel
表示对通道的传入请求
第三个返回值,Request
是在正常数据流之外发送的请求
这并不能真正回答你的问题,但它确实提供了有用的线索来寻找哪里。
所以回答你的问题:
chans接收到服务器的新连接。使用从chans接收到的值,您可以接受该连接并与之通信,或者只是拒绝该连接。这可以认为是多人通过 ssh 登录到远程机器并处理多个会话。
reqs保存发送到服务器或客户端的全局请求(在此处定义),这些请求不应发送到任何特定通道。RFC4254 给出了“为特定端口启动 TCP/IP 转发”这样的请求示例。您可以在此处查看
ssh 包如何使用incomingRequests 通道的内部用法。ssh.NewServerConn 的文档明确指出
必须为 Request 和 NewChannel 通道提供服务,否则连接将挂起。
如果此服务器确实接收到全局请求,则如果请求要求回复,则需要对其进行适当处理。
推荐阅读
- oracle - 在子查询中使用全局临时表给出 NULL
- rust - 改进 Rust 的 Future 以不创建单独的线程
- java - JDBC executeBatch 奇怪的行为
- three.js - Mesh 旋转时 Threejs 和 PhysiJs 物理引擎未更新
- asp.net-mvc - 向 aws elastic beanstalk 发送请求时,Signalr 连接强制关闭
- php - codeigniter 注册表单不显示错误
- sql - 使用重复的空值更新触发器
- asp.net-mvc - MVC Razor - 如果条件出现在 html 渲染中
- google-maps-api-3 - 谷歌地图在铁路轨道上绘制位置
- android - Google play 警告 - Webview 容易受到跨应用脚本的攻击