Skip to content

Scripter un tunnel SSH

Auteur : Philippe Le Van - @plv@framapiaf.org

Date : 11 février 2024

Introduction

Parfois, on aimerait bien ouvrir un tunnel SSH dans un script bash pour automatiser des tâches. Mais on se retrouve confronté pas mal de problèmes :

  • comment reprendre la main après avoir ouvert la connexion SSH sur la machine hôte ?
  • comment vérifier que la connexion SSH est bien ouverte ?
  • comment refermer la connexion SSH proprement ?

Solution

L'idée est d'utiliser un "control socket" pour parler avec un process SSH déjà ouvert.

Quelques options SSH utilisées dans les commandes suivantes

  • -M : spécifie que l'on veut utiliser un "control socket" (master)
  • -S : spécifie le nom du "control socket"
  • -O : permet de contrôler le process SSH
  • -f : demande à SSH de passer en arrière-plan
  • -N : ne pas exécuter de commande distante
  • -T : désactive l'allocation de pseudo-tty
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# ouvrir un tunnel SSH avec un "control socket" appelé ma-socket
ssh -M -S ma-socket -fNT -L 3308:localhost:3306 toto@monserveur.exemple.com

# vérifier que le tunnel est bien ouvert et que le process SSH est bien en cours
ssh -S ma-socket -O check toto@monserveur.exemple.com
# => Master running (pid=15184) 

# fermer le tunnel SSH
ssh -S ma-socket -O exit toto@monserveur.exemple.com
# => Exit request sent. 

Référence

Solution trouvée sur Stack Overflow et un peu développée à partir de la man page de SSH.