Rebondir avec SSH

May 3rd, 2005 by lucas

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 ?

4 Responses to “Rebondir avec SSH”

  1. A. wrote on 05/4/05 at 10:05 pm :

    > 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?

  2. Lunar wrote on 05/7/05 at 5:09 pm :

    « 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. »

  3. mat-c wrote on 05/9/05 at 1:12 pm :

    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.

  4. michoux wrote on 09/2/05 at 3:32 pm :

    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