Très pratique quand pour accéder à un host on doit rebondir sur un autre.
La solution naïve est bien sûr ssh host1 -t 'ssh host2'
, mais il y a plusieurs problèmes :
ssh unalias
-t
pour un shell interactifLa solution via ProxyCommand est beaucoup mieux, puisque ça donne un proxy au SSH local lui-même, donc pas besoin de -t
explicite, et pas besoin de forwarder l'agent (ça se passe normalement à travers le tunnel ainsi créé).
<edit> De plus, comme c'est une configuration au niveau de SSH, tout ce qui l'utilise en profite : scp, rsync, etc. </edit>
<edit2> Ajout de la version avec ssh -W
à la place de nc
</edit2>
J'en arrive personnellement à ça (avec les hosts renommés)
# jump to server2 through server1
Host server2
ProxyCommand ssh -W %h:%p %r@server1
# ou alternativement avec `nc` si ssh est trop vieux pour connaître -W
#ProxyCommand ssh %r@server1 nc %h %p
Bien sûr ça se combine avec un alias local facilement :
# jump to server2 through server1
Host localalias
Hostname server2
ProxyCommand ssh -W %h:%p %r@server1
À noter que le lookup de server2 a lieu sur le proxy, donc un nom local au proxy marchera -- mais pas l'inverse, un alias local sur le client ne résoudra pas.
Aussi, puisque la commande proxy est un SSH, on peut lui passer toute option SSH (dans mon cas, -4
par ce que le lien IPv6 entre moi et l'host a une forte latence que le lien IPv4 n'a pas).