Retrouver les ports forwardés lors d'une connexion SSH

Introduction

openssh-client permet de définir dans le fichier de configuration la façon de se connecter à une machine. Par exemple :

Host work-dev
   HostName monhostname
   Port 7899
   User myuser

En effectuant un ssh work-dev, openssh-client va se connecter sur la machine monhostname sur le port 7899 avec l’utilisateur myuser.

De plus, il est possible de définir les ports qui seront forwardés de la manière suivante :

Host work-dev-with-ports
   HostName monhostname
   Port 7899
   User myuser
   LocalForward 8086 localhost:8080

Par exemple, quand je suis en télétravail, j’effectue la commande ssh work-dev-with-ports qui me permet d’accéder depuis le port 8086 de ma machine locale au port 8080 de ma machine distance. Celui-ci étant en http, j’y accède via mon navigateur sur http://localhost:8086.

Problématique

Comment rappeller que le service est accessible via le port 8086 en local lors de la connexion ? Il serait utile d’afficher, lors de connexion, la liste des ports forwardés.

Solution

Pour faire cela, nous allons utiliser l’option LocalCommand de SSH.

Celle-ci nous permet d’exécuter une commande sur la machine locale une fois que la connexion a été effectuée. Des caractères de substitutions seront disponibles pour créer notre commande, dont le nom de l’hôte utilisé pour se connecter dans la liste de commande.

Voici un extrait du man de ssh_config :

  LocalCommand
     Specifies a command to execute on the local machine after successfully connecting to the server.  The command string extends to the end of the line, and is executed with the user's shell.  The following escape character substitutions will be performed: ‘%d’ (local user's home directory), ‘%h’ (remote host name), ‘%l’ (local host name), ‘%n’ (host name as provided on the command line), ‘%p’ (remote port), ‘%r’ (remote user name) or ‘%u’ (local user name).

     The command is run synchronously and does not have access to the session of the ssh(1) that spawned it.  It should not be used for interactive commands.

     This directive is ignored unless PermitLocalCommand has been enabled.

Pour afficher la configuration lors de la connexion, il nous suffit donc d’exécuter la commande sed, qui va conserver seulement le texte contenu entre le nom d’hôte et la directive LocalCommand (qui sera à placer à la fin des commandes que nous voudrions voir apparaître la configuration lors de la connexion).

Voici un exemple de configuration permettant d’afficher la configuration lors de la connexion :

Host work-dev-with-ports
   HostName monhostname
   Port 7899
   User myuser
   # monservice, accessible via http://localhost:8086/path
   LocalForward 8086 localhost:8080
   LocalCommand sed -e '/%n/,/LocalCommand .*/!d' ~/.ssh/config | sed  '$ d'

Le premier sed ne va conserver que les lignes depuis le nom de la configuration jusqu’à la configuration LocalCommand. Le second va supprimer la dernière ligne (contenant LocalCommand).

Lors de la connexion, SSH va afficher toute la configuration pour le Host sur lequel on vient de se connecter. Lors de la connexion, la sortie ressemblera à cela :

user@machineLocale > ssh work-dev-with-ports
Host work-dev-with-ports
   HostName monhostname
   Port 7899
   User myuser
   # monservice, accessible via http://localhost:8086/path
   LocalForward 8086 localhost:8080
user@machineDistante >

Il sera donc possible d’y ajouter des commentaires, qui seront visibles lors de la connection. De plus, cette modification n’est pas seulement utile pour afficher les ports forwardés, mais par exemple, pour afficher un message lors de la connexion sans devoir modifier la configuration de la machine distante.