SSH sans attendre : passez au multiplexing
C’est un cas un peu particulier, mais on veut parfois ouvrir plusieurs connexions SSH vers un même serveur ; et parfois, ouvrir ces connexions (ou les garder ouvertes) a un coût.
Par exemple, je suis en train d’écrire un script tout pourri qui envoie des fichiers via rsync, puis se connecte via SSH pour lancer quelques commandes. Chaque ouverture de connexion prend ~3 secondes, et je lance ce script plusieurs fois d’affilée — donc à chaque fois, j’attends 6 secondes pour pas grand chose.
SSH permet de multiplexer plusieurs connexions à travers un seul socket, soit manuellement, soit automatiquement via quelques options de configuration. Dans mon cas, ça me permet d’attendre une fois 3 secondes, puis toutes les connexions suivantes passent par la même connexion, donc plus d’attente.
Manuellement
- On ouvre le socket via ces options :
-fmet la connexion en background-Nn’exécute rien sur le serveur distant (pas de shell, pas de commande, rien)-Mmet la connexion en mode “Master”-Sspécifie le chemin du socket utilisé pour partager la connexion
ssh -N -f -M -S ~/.ssh/cm-socket debian@example.com
Puis, dans un autre terminal, on peut ouvrir une nouvelle connexion via le socket (avec l’option -S à nouveau) :
ssh -S ~/.ssh/cm-socket debian@example.com
En bonus, on peut aussi l’utiliser avec rsync en ajoutant cette option :
rsync -e "ssh -o ControlPath=~/.ssh/cm-socket" ...
Une fois fini, on peut fermer le socket avec :
ssh -S ~/.ssh/cm-socket -O exit debian@example.com
Automatiquement via ~/.ssh/config
On déclare un host avec ces options :
Host example.com
HostName example.com
User debian
ControlMaster auto
ControlPath ~/.ssh/cm-%r@%h:%p
ControlPersist 10m
Et puis SSH s’occupe de tout.