SwiftNIO SSH

2020-11-21 12:03:03

我很高兴为Swift Server生态系统引入一个新的开源项目SwiftNIO SSH。 SwiftNIO SSH作为Swift软件包分发,旨在使Swift开发人员能够与SSH网络协议进行交互。

SwiftNIO SSH是SSH的程序化实现:即,它是API的集合,允许程序员实现讲SSH的终结点。至关重要的是,这意味着它比libssh更像libssh2。 SwiftNIO SSH不会交付可用于生产环境的SSH客户端和服务器,而是提供了构建此类客户端和服务器的构件。

提供编程SSH实现有多种原因。一个是SSH与用户交互性具有独特的关系。技术用户非常习惯于与SSH进行交互,以在远程计算机上运行命令或运行交互式Shell。能够以编程方式响应这些请求的功能可以实现有趣的交互方式。作为现有技术,我们可以指向Twisted的Manhole,它使用称为chench的编程SSH实现在运行中的Python服务器或ssh-chat(提供聊天室而不是常规SSH shell功能的SSH服务器)内提供交互式Python解释器。 。对于TCP转发,也可以想象创新的用途。

提供编程SSH的另一个很好的理由是,服务需要以一种涉及运行命令的方式与其他服务进行交互的情况并不少见。尽管Process为本地用例解决了此问题,但有时需要调用的命令是远程的。虽然Process可以将ssh客户端作为子进程启动以运行此调用,但直接直接调用SSH可能要简单得多。这是libssh2的目标用例。 SwiftNIO SSH提供了与libssh2的网络和加密层相同的功能,使有动力的用户可以直接从Swift服务内部驱动SSH会话。

仅限现代密码原语:非对称密码在主要NIST曲线(P256,P384,P521)上的Ed25519和EDCSA,对称密码用于AES-GCM,密钥交换用于x25519

SwiftNIO SSH提供了一个SwiftNIO ChannelHandler NIOSSHHandler。该处理程序实现了大部分SSH协议。不应期望用户直接生成SSH消息:相反,他们通过子通道和委托与NIOSSHHandler进行交互。

SSH是一个多路复用协议:每个SSH连接都细分为多个双向通信通道,这些通道称为适当的通道。 SwiftNIO SSH通过使用“子通道”抽象来反映这种构造。当对等方创建新的SSH通道时,SwiftNIO SSH将创建一个新的NIO通道,该通道用于表示该SSH通道上的所有流量。在此子Channel内,所有事件都严格按照彼此进行排序:但是,实现中可以自由地交错不同Channel中的事件。

IO──NIO频道─────────────IO│┌─────────────────────┐││││││ │││││││││NIOSSHHandler│────────────────┐│││││││││││││││││ │└──────────────────┘│││└──────────────────────── ──┘│││││▼┌──SSH子频道──────────────────────────── ────────────────┐│││┌─────────────┐ ────────────────────────────────────────││││││││││││││├ ─│││││││││││││││││││││││││││││││││││││││ ││││││││││││││└─────────────────┘ ──────────────────┘│││││││┘───┬────────────── ────────────────────────────────────────────────── ────┘│││││└───┬────────────────────── ────────────────────┘│││└────────── ────────────────────────────────────────────────── ──────────┘

使用通道类型调用SSH通道。 SwiftNIO SSH支持三种:会话,directTCPIP和转发的TCPIP。最常见的通道类型是会话,用于表示程序的调用,无论是特定的命名程序还是外壳程序。其他两种通道类型与TCP端口转发有关,将在后面讨论。

SSH通道对单一数据类型进行操作:SSHChannelData。这种结构封装了SSH支持常规和“扩展”通道数据的事实。常规通道数据(SSHChannelData.DataType.channel)用于绝大多数核心数据。在会话通道中,.channel数据类型用于标准输入和标准输出:.stdErr数据类型用于标准错误。在TCP转发通道中,.channel数据类型是唯一使用的类型,它表示转发的数据。

会话通道代表命令的调用。在许多入站用户事件中传达了通道的确切运行方式。 SwiftNIO SSH支持范围广泛,涵盖了最重要的用例,包括直接执行命令,请求外壳程序,请求伪终端,设置环境变量等等。

用户身份验证是SSH的重要组成部分。 SwiftNIO SSH通过一系列委托协议管理用户身份验证。这些协议是完全异步的,支持用例可能需要从磁盘读取以执行用户身份验证。

直接端口转发是从客户端到服务器的端口转发。传统上,此模式下,客户端将在本地端口上侦听,并将入站连接转发到服务器。它将要求服务器将这些连接作为出站连接转发到特定的主机和端口。

远程端口转发是一种不太常见的情况,客户端要求服务器侦听特定的地址和端口,并将所有入站连接转发给客户端。当客户端需要请求此行为时,它使用“全局请求”来执行此操作,这是一种SSH功能,可启用在连接范围内运行的请求功能。

全局请求是使用NIOSSHHandler.sendGlobalRequest发起的,并通过GlobalRequestDelegate进行接收和处理。今天支持两个全局请求:

可以使用GlobalRequestDelegate通知服务器并响应这些请求。每当接收到全局请求时,都会调用该委托。一旦建立了侦听器,然后使用.forwardedTCPIP通道类型将入站连接从服务器发送到客户端。

该项目当前处于预发布状态。虽然它被认为是功能完善的,但在标记1.0版本之前,我们希望给它更多的时间来引起公众的注意。但是,我们预计从现在到该版本之间不会有API损坏。

如果您对SwiftNIO SSH感兴趣,请参与! SwiftNIO SSH是在GitHub上开发的完全开源项目。任何时候都欢迎来自开源社区的贡献。我们鼓励在Swift论坛上进行讨论。对于错误报告,功能请求和提取请求,请使用GitHub存储库。

我们很高兴看到您使用SwiftNIO SSH所做的惊人的事情!