Retour aux mises à jour
New releaseJul 29, 2026

swift-nio-ssh v0.15.0

SwiftNIO SSH est une implémentation programmatique de SSH utilisant SwiftNIO.

Partager

SwiftNIO SSH

Ce projet contient le support SSH utilisant SwiftNIO.

Qu'est-ce que SwiftNIO SSH ?

SwiftNIO SSH est une implémentation programmatique de SSH : c'est-à-dire un ensemble d'API permettant aux programmeurs d'implémenter des points de terminaison parlant SSH. Point crucial, cela signifie qu'il ressemble davantage à libssh2 qu'à openssh. SwiftNIO SSH ne fournit pas de clients et serveurs SSH prêts pour la production, mais fournit plutôt les briques de base pour construire ce type de client et de serveur.

Plusieurs raisons justifient de fournir une implémentation programmatique de SSH. L'une d'elles est que SSH entretient une relation unique avec l'interactivité avec l'utilisateur. Les utilisateurs techniques sont très habitués à interagir avec SSH de manière interactive, que ce soit pour exécuter des commandes sur des machines distantes ou pour ouvrir des shells interactifs. Pouvoir répondre programmatiquement à ces requêtes permet d'envisager des modes d'interaction alternatifs intéressants. Comme exemples précédents, on peut citer Manhole de Twisted, qui utilise une implémentation programmatique de SSH appelée conch pour fournir un interpréteur Python interactif au sein d'un serveur Python en cours d'exécution, ou ssh-chat, un serveur SSH qui propose un salon de discussion au lieu des fonctionnalités habituelles de shell SSH. Des usages innovants peuvent également être imaginés pour la redirection TCP.

Une autre bonne raison de fournir un SSH programmatique est qu'il n'est pas rare que des services aient besoin d'interagir avec d'autres services d'une manière qui implique l'exécution de commandes. Bien que Process résolve ce problème pour le cas local, il arrive parfois que les commandes à invoquer soient distantes. Bien que Process puisse lancer un client ssh comme sous-processus pour effectuer cette invocation, il peut être nettement plus simple d'invoquer directement SSH. C'est le cas d'usage cible de libssh2. SwiftNIO SSH fournit l'équivalent de la couche réseau et cryptographique de libssh2, permettant aux utilisateurs motivés de piloter des sessions SSH directement depuis des services Swift.

Les versions les plus récentes de SwiftNIO SSH prennent en charge Swift 5.9 et versions ultérieures. Les versions minimales de Swift prises en charge par les versions de SwiftNIO SSH sont détaillées ci-dessous :

SwiftNIO SSHVersion Swift minimale
0.0.0 ..< 0.3.05.1
0.3.0 ..< 0.4.05.2
0.4.0 ..< 0.5.05.4
0.5.0 ..< 0.6.25.5.2
0.6.2 ..< 0.9.05.6
0.9.0 ..< 0.9.25.8
0.9.2 ..< 0.10.05.9
0.10.0 ... 0.12.05.10
0.12.0 ..< 0.13.06.0
0.13.0 ..<6.1

Que prend en charge SwiftNIO SSH ?

SwiftNIO SSH prend en charge SSHv2 avec l'ensemble de fonctionnalités suivant :

  • Toutes les fonctionnalités des canaux de session, y compris les requêtes de canal shell et exec
  • Redirection de ports TCP directe et inverse
  • Primitives cryptographiques modernes uniquement : Ed25519 et ECDSA sur les principales courbes NIST (P256, P384, P521) pour la cryptographie asymétrique, AES-GCM pour la cryptographie symétrique, x25519 pour l'échange de clés
  • Authentification utilisateur par mot de passe et par clé publique
  • Prend en charge toutes les plateformes prises en charge par SwiftNIO et Swift Crypto

Comment utiliser SwiftNIO SSH ?

SwiftNIO SSH fournit un ChannelHandler SwiftNIO, NIOSSHHandler. Ce handler implémente directement l'essentiel du protocole SSH. Les utilisateurs ne sont pas censés générer directement les messages SSH : ils interagissent plutôt avec NIOSSHHandler par l'intermédiaire de canaux enfants et de délégués.

SSH est un protocole multiplexé : chaque connexion SSH est subdivisée en plusieurs canaux de communication bidirectionnels appelés, comme il se doit, canaux. SwiftNIO SSH reflète cette construction en utilisant une abstraction de « canal enfant ». Lorsqu'un pair crée un nouveau canal SSH, SwiftNIO SSH crée un nouveau Channel NIO qui sert à représenter tout le trafic sur ce canal SSH. Dans ce Channel enfant, tous les événements sont strictement ordonnés les uns par rapport aux autres : cependant, les événements de différents Channel peuvent être entrelacés librement par l'implémentation.

Une connexion SSH active ressemble donc à ceci :

┌ ─ NIO Channel ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│     ┌────────────────────────────────┐    │
      │                                │
│     │                                │    │
      │                                │
│     │                                │    │
      │         NIOSSHHandler          │───────────────────────┐
│     │                                │    │                  │
      │                                │                       │
│     │                                │    │                  │
      │                                │                       │
│     └────────────────────────────────┘    │                  │
                                                               │
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘                  │
                                                               │
                                                               │
                                                               │
                                                               │
                                                               ▼
                     ┌── SSH Child Channel ─────────────────────────────────────────────────────────────┐
                     │                                                                                  │
                     │   ┌────────────────────────────────┐      ┌────────────────────────────────┐     ├───┐
                     │   │                                │      │                                │     │   │
                     │   │                                │      │                                │     │   ├───┐
                     │   │                                │      │                                │     │   │   │
                     │   │                                │      │                                │     │   │   │
                     │   │          User Handler          │      │          User Handler          │     │   │   │
                     │   │                                │      │                                │     │   │   │
                     │   │                                │      │                                │     │   │   │
                     │   │                                │      │                                │     │   │   │
                     │   │                                │      │                                │     │   │   │
                     │   └────────────────────────────────┘      └────────────────────────────────┘     │   │   │
                     │                                                                                  │   │   │
                     └───┬──────────────────────────────────────────────────────────────────────────────┘   │   │
                         │                                                                                  │   │
                         └───┬──────────────────────────────────────────────────────────────────────────────┘   │
                             │                                                                                  │
                             └──────────────────────────────────────────────────────────────────────────────────┘

Catégories