Index
Le 24 ventôse an CCXXX

Rebonds SSH

J'utilise régulièrement ssh et aussi bien au travail que sur mon réseau personnel, je me connecte à une ribambelle d'hôtes, certains directement accessibles, d'autres accessibles uniquement à partir de certains réseaux, etc. J'ai régulièrement besoin d'une nouvelle combinaison de sauts pour atteindre une machine, sans forcément avoir envie de la configurer dans mon .ssh/config parce que je n'en aurai peut-être plus jamais besoin à nouveau.

Dans le passé, j'ai d'abord utilisé ce genre de configuration :

Host destination-passerelle
HostName destination
ProxyCommand ssh passerelle nc %h %p 2> /dev/null

Mais cela nécessite l'installation de nc sur la passerelle. Ça n'a pas toujours été le cas, mais aujourd'hui on peut faire la même chose directement avec ssh -W :

Host destination-passerelle
HostName destination
ProxyCommand ssh passerelle -W %h:%p

Une autre option encore plus récente a été ajoutée qui simplifie largement la chose :

Host destination-passerelle
HostName destination
ProxyJump passerelle

Mais pour une chaîne de passerelles ad-hoc, j'ai longtemps utilisé ceci :

Host */*
ProxyCommand ssh %r@$(dirname %h) -W $(basename %h):%p

C'est un peu sioux, mais ça transforme l'argument donné à ssh pour utiliser, récursivement, tout ce qui est devant le dernier "/" comme passerelle. Du coup, on peut faire un ssh passerelle/passerelle2/destination. ssh utilisera d'abord ssh passerelle1/passerelle2 comme passerelle pour se connecter à destination, et donc passerelle pour se connecter à passerelle2.

C'est bien pratique, mais cette syntaxe a le défaut de ne pas être compatible avec scp et rsync, à cause du / qui fait ressembler le nom d'hôte à un chemin. Du coup, j'ai réfléchi un peu aujourd'hui et je suis arrivé à ceci :

Host *+* 
ProxyCommand ssh %r@$(echo %h | rev | cut -d+ -f2- | rev) -W $(echo %h | rev | cut -d+ -f1 | rev):%p

Ça fonctionne pareil mais avec des + plutôt que des /, la difficulté étant principalement de séparer le dernier nom des premiers. cut ne permet que de séparer le premier des suivants, mais des rev bien placés permettent d'arriver à ce que je veux.

La principale limitation est sur l'utilisateur, on peut le spécifier mais il doit être identique pour toutes les passerelles.

@contact