Après GCC et les trampolines, voici les rebonds avec SSH. Ou alors, la super-astuce du jour.
Supposez que vous ayez une machine (passerelle, frontal de grappe, etc), avec des machines derrière. Plusieurs fois par jour, vous faites :
ssh frontal ssh node38-01
Un peu plus tard :
ssh frontal ssh node38-02
Pas pratique, hein ?
Heureusement, Nicolas C. m’a donné la solution qui tue.
Acte 1 : l’option ProxyCommand de SSH
ProxyCommand Specifies the command to use to connect to the server. The com- mand string extends to the end of the line, and is executed with /bin/sh. In the command string, '%h' will be substituted by the host name to connect and '%p' by the port. The command can be basically anything, and should read from its standard input and write to its standard output. It should eventually connect an sshd(8) server running on some machine, or execute sshd -i some- where. Host key management will be done using the HostName of the host being connected (defaulting to the name typed by the user). Setting the command to ``none'' disables this option entirely. Note that CheckHostIP is not available for connects with a proxy command.
Vous l’aviez compris, vous pouvez faire qqchose comme ça dans votre .ssh/config :
Host node01 ProxyCommand ssh login@frontal "nc node38-01 22"
Un ssh node01 fait ce à quoi vous vous attendiez.
C’est pas mal, mais ça passe pas très bien à l’échelle. Car derrière frontal, forcément, vous avez tout plein de noeuds ! Ca serait mieux d’avoir un truc plus …générique.
Acte 2 : là où vous direz “ouahhh”
Je vous donne la solution directement :
Host *.frontal ProxyCommand ssh login@frontal "nc \$(basename %h .frontal) %p"
Comme vous l’aviez deviné, suffit de faire un ssh node38-01.frontal pour se connecter à node38-01 en rebondissant sur le frontal. Ou un ssh node38-02.frontal pour se connecter à node38-02. Etc.
Je précise que ce n’est pas moi qui l’ai trouvé. Vous connaissiez ?
Précision pour les gens comme A. L. : Mettre un masque qui veut dire qqchose (par exemple *.imag.fr), c’est une mauvaise idée. Regardez par exemple :
Host *.imag.fr ProxyCommand ssh login@passerelle.imag.fr "nc \$(basename %h .imag.fr) %p"
Pourquoi est-ce que ça ne marche pas comme on s’y attend ? Quel sera l’effet vu du client ? Vu du serveur ?
> Pourquoi est-ce que ça ne marche pas comme
> on s’y attend ? Quel sera l’effet vu du
> client ? Vu du serveur ?
En fait je n’ai pas trouvé la réponse… tu peux nous la donner?
« passerelle.imag.fr » utilisera lui aussi la ligne de configuration de « *.imag.fr »
Une « fork bomb, » quoi…
Par contre, ce doit être contournable en rajoutant une configuration spéciale pour « passerelle.imag.fr. »
moi je fessait avec un `ssh -t frontal ssh node38-0x’, m’enfin ca a l’air de revenir au meme si j’ai bien compris.
Génial ce truc… je ne m’en passe plus ;)
J’utilise aussi la proxycommand pour passer over-proxy http:
Host seb
UserKnownHostsFile ~/.ssh/known_seb
User xxx
ProxyCommand ~/bin/ptl -g proxy -G 8080 -d mamachine -D 443
A noter une autre astuce interessante pour restreindre les droits des uilisateur ssh:
command="ls" ssh-rsa cléclécléclé tag
Et la, les utilisateurs de la clé cléclécléclé ne peuvent que ls