
SwiftNIO SSH es una implementación programática de SSH utilizando SwiftNIO
Este proyecto contiene soporte SSH utilizando SwiftNIO.
SwiftNIO SSH es una implementación programática de SSH: es decir, es una colección de APIs que permiten a los programadores implementar extremos que hablan SSH. Críticamente, esto significa que se parece más a libssh2 que a openssh. SwiftNIO SSH no incluye clientes y servidores SSH listos para producción, sino que proporciona los componentes básicos para construir este tipo de cliente y servidor.
Hay varias razones para proporcionar una implementación programática de SSH. Una es que SSH tiene una relación única con la interactividad del usuario. Los usuarios técnicos están muy acostumbrados a interactuar con SSH de forma interactiva, ya sea para ejecutar comandos en máquinas remotas o para ejecutar shells interactivos. Tener la capacidad de responder programáticamente a estas solicitudes permite modos alternativos de interacción interesantes. Como ejemplos anteriores, podemos señalar el Manhole de Twisted, que utiliza una implementación programática de SSH llamada conch para proporcionar un intérprete interactivo de Python dentro de un servidor Python en ejecución, o ssh-chat, un servidor SSH que proporciona una sala de chat en lugar de la funcionalidad normal de shell SSH. También se pueden imaginar usos innovadores para el reenvío TCP.
Otra buena razón para proporcionar SSH programático es que no es raro que los servicios necesiten interactuar con otros servicios de una manera que implique ejecutar comandos. Mientras que Process resuelve esto para el caso local, a veces los comandos que deben invocarse son remotos. Si bien Process podría lanzar un cliente ssh como subproceso para ejecutar esta invocación, puede ser sustancialmente más directo simplemente invocar SSH directamente. Este es el caso de uso objetivo de libssh2. SwiftNIO SSH proporciona el equivalente de la capa de red y criptográfica de libssh2, permitiendo a los usuarios motivados manejar sesiones SSH directamente desde servicios Swift.
Las versiones más recientes de SwiftNIO SSH admiten Swift 5.9 y posteriores. Las versiones mínimas de Swift compatibles con las versiones de SwiftNIO SSH se detallan a continuación:
| SwiftNIO SSH | Versión mínima de Swift |
|---|---|
0.0.0 ..< 0.3.0 | 5.1 |
0.3.0 ..< 0.4.0 | 5.2 |
0.4.0 ..< 0.5.0 | 5.4 |
0.5.0 ..< 0.6.2 | 5.5.2 |
0.6.2 ..< 0.9.0 | 5.6 |
0.9.0 ..< 0.9.2 | 5.8 |
0.9.2 ..< 0.10.0 | 5.9 |
0.10.0 ... 0.12.0 | 5.10 |
0.12.0 ..< 0.13.0 | 6.0 |
0.13.0 ..< | 6.1 |
SwiftNIO SSH soporta SSHv2 con el siguiente conjunto de características:
SwiftNIO SSH proporciona un ChannelHandler de SwiftNIO, NIOSSHHandler. Este manejador implementa la mayor parte del protocolo SSH directamente. No se espera que los usuarios generen mensajes SSH directamente: en su lugar, interactúan con el NIOSSHHandler a través de canales hijos y delegados.
SSH es un protocolo multiplexado: cada conexión SSH se subdivide en múltiples canales de comunicación bidireccionales llamados, adecuadamente, canales. SwiftNIO SSH refleja esta construcción utilizando una abstracción de "canal hijo". Cuando un par crea un nuevo canal SSH, SwiftNIO SSH creará un nuevo Channel de NIO que se utiliza para representar todo el tráfico en ese canal SSH. Dentro de este Channel hijo, todos los eventos están estrictamente ordenados entre sí: sin embargo, los eventos en diferentes Channels pueden intercalarse libremente por la implementación.
Una conexión SSH activa, por lo tanto, se ve así:
┌ ─ NIO Channel ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
│ ┌────────────────────────────────┐ │
│ │
│ │ │ │
│ │
│ │ │ │
│ NIOSSHHandler │───────────────────────┐
│ │ │ │ │
│ │ │
│ │ │ │ │
│ │ │
│ └────────────────────────────────┘ │ │
│
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ │
│
│
│
▼
┌── SSH Child Channel ─────────────────────────────────────────────────────────────┐
│ │
│ ┌────────────────────────────────┐ ┌────────────────────────────────┐ ├───┐
│ │ │ │ │ │ │
│ │ │ │ │ │ ├───┐
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ User Handler │ │ User Handler │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ └────────────────────────────────┘ └────────────────────────────────┘ │ │ │
│ │ │ │
└───┬──────────────────────────────────────────────────────────────────────────────┘ │ │
│ │ │
└───┬──────────────────────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────────┘
Un canal SSH se invoca con un tipo de canal. NIOSSH soporta tres: session, directTCPIP y forwardedTCPIP. El tipo de canal más común es session: session se utiliza para representar la invocación de un programa, ya sea un programa específico con nombre o un shell. Los otros dos tipos de canal están relacionados con el reenvío de puertos TCP, y se discutirán más adelante.