Mettez de la couleur dans votre terminal

Quand on débugge, parfois, on préfère utiliser des printf un peu partout que des vrais outils comme gdb. Simplement parce que parfois, gdb est inutile, ou insuffisant. Mais, à force de mettre des traces partout, la sortie devient vite illisible. Une solution pour éviter ça est d’utiliser de la couleur.[0]

Pour ça, on peut utiliser les caractères d’échappement d’xterm, c’est très facile et ça marche à peu près partout (en tout cas, là où c’est utile). Voici un petit exemple qui compile :

#include <stdio.h> int main() {    int i;    for (i = 30; i <= 37; i++)       printf("\e[%dmforeground %d\n", i, i);    printf("\e[m"); /* Raz */    for (i = 40; i <= 47; i++)       printf("\e[%dmbackground %d\n", i, i);    printf("\e[1;4;34;41mTexte bleu sur fond rouge en gras souligné\n");    printf("\e[0;39;49m\n"); /* Raz */    return 0; } 

Pour avoir la liste complète, c’est sur cette page. Attention, ça se lit comme une grammaire, c’est pas forcément évident au début.

[0] Il y a des gens qui, pour débugger, utilisent le son. C’est assez pratique pour repérer des patrons dans le comportement des programmes, l’oreille est très douée pour ça. Désolé, je ne trouve plus la référence… Si qqun connait…

Update : sur le meme sujet, un article de Linux Journal.

Rebondir avec SSH

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 ?