Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Tag: Commande

Niveau :      
Résumé : arecord && aplay ; ctrl-x ctrl-e ; vim :sudo save ; mount ; table ASCII

Lire en local le son enregistré sur un micro distant avec alsa (merci buntu35) :

$ ssh USER@REMOTESYSTEM arecord - | aplay -

Sous bash, éditer une longue ligne de commande en cours (avec $EDITOR) :

ctrl-x ctrl-e

Sous vim, faire un "sudo save" :

:w !sudo tee %

Enfin afficher proprement le résultat de mount (faites en carrément un alias) :

$ mount | column -t

Si comme moi il vous arrive de chercher la table ascii sur google, ne cherchez plus :

$ man ascii

Niveau :      
Résumé : ditaa

Aujourd'hui je voudrais partager avec vous un petit soft que je viens de découvrir : ditaa.

Qu'est-ce que ça fait ?

C'est un outil très simple qui vous permet de faire des diagrammes en ascii art. Non pas de les dessiner comme le ferait emacs artist-mode mais de les transformer en un vrai png propre et beau.

Exemple : Je dessine ceci (par exemple avec asciio)

    +--------+   +-------+    +-------+
    |        | --+ ditaa +--> |       |
    |  Text  |   +-------+    |diagram|
    |Document|   |!magic!|    |       |
    |cRED {d}|   |cBLU   |    |cRED   |
    +---+----+   +-------+    +-------+
        :                         ^
        |       Lots of work      |
        +-------------------------+

Cela devient automatiquement ceci :

Intégration

C'est tellement magique que je n'ai pas hésité et je l'ai intégré à mon site directement. En effet avant à chaque fois que je devais faire un diagramme il fallait que je sorte inkscape, que fasse attention à caler correctement les cases et les flèches et que je pense à sauvegarder l'image et l'uploader sur le serveur.

Maintenant j'intègre tout simplement le code dans le texte de mon article et ca marche !

Je n'ai pas trouvé de code qui faisait cela, je l'ai donc fait moi-même. Un peu rapidement il est vrai, il n'y a pas de gestion des différents cas d'erreur. Mais je vous laisse le code au cas où vous voudriez faire de même chez vous.

    function __macroDITAA($s)
    {
        $base=$_SERVER['DOCUMENT_ROOT']."/public/ditaa";
        $tmp="/tmp/ditaa";

        # first line of code is for ditaa parameters
        $p = strpos($s, "\n");
        $args = substr($s, 0, $p-2);
        $data = substr($s, $p+1 );

        # md5sum to generate a unique id
        $id = md5($data);

        # file test
        if(!file_exists("$base/$id.png")) {
            # create tmp
            $f = fopen("$tmp", "w");
            fwrite($f, $data);
            fclose($f);

            # call ditaa (beware of safe mode)
            system("ditaa $args $tmp > /dev/null");

            # move file
            rename("$tmp.png", "$base/$id.png");
        }

        return "<img src='/public/ditaa/$id.png'>";
    }

Puisque ditaa est malgré tout un peu lourd, on crée un identifiant d'image avec le md5 de la ligne de commande et le contenu. Et on ne fait l'appel qu'une fois (attention je n'ai pas de safe_mode ici), lorsque le fichier n'existe pas encore. Ensuite le serveur web l'utilise le fichier directement comme n'importe quel autre.

Sur mon site, j'ai une syntaxe dotclear2, j'ai donc dû enregistrer un nouveau mot clé pour la syntaxe ditaaa "///ditaa" :

# dans class.wiki2xhtml.php / class wiki2xhtml / function __construct()
$this->registerFunction('macro:ditaa','__macroDITAA');

A vous de faire de même pour la syntaxe wordpress !

Niveau :      
Résumé : Bonne année

Plutôt que de vous souhaiter une bonne année comme tout le monde avec des vœux et du bonheur je vais plutôt vous écrire un article utile.

J'en profite pour ne pas vous demander vos résolutions, de toute façon une résolution est faite pour ne pas être tenue, sinon ça serait déjà fait ! La mienne sera comme tous les ans 1024x1280.

Faire un grep d'un mot (et non pas d'une suite de caractère) :

$ grep -w lemot "lemotte lemot"

Faire un xargs mais résistant aux entrées vides :

$ xargs -r rm < list

Faire un append en fin de fichier :

$ echo toto >> fichier

Faire un insert en début de fichier :

$ sed -i -e '1i\toto/' fichier

Lister les dernières erreurs de connexion :

$ faillog

Niveau :      
Résumé : molly-guard

Je suis sûr qu'un certain nombre d'entre vous ont plusieurs machines en production. Et je suis certain que vous les gérez toutes à distance (merci ssh).

Le risque est grand lorsqu'on a des machines distantes de confondre un terminal avec un autre. Vous pouvez bien sûr personnaliser un prompt différent pour chaque machine, mais je vous propose aujourd'hui une autre solution.

$ apt-get install molly-guard

Et voilà !

Maintenant les commandes shutdown, halt et reboot vous demanderont de taper le nom de la machine que vous voulez vraiment éteindre avant de le faire. Ouf, le serveur mail/dns/web de l'entreprise ne sera pas éteint par erreur à la place de votre serveur de base de données de test.

Cerise sur le gateau, ceci n'arrive pas si vous êtes sur un terminal local sur la machine, puisque vous êtes sensés savoir où vous êtes.

Exercice pratique, faites de même pour les quelques (elles doivent rester rares) commandes critiques sur vos machines.

Niveau :      
Résumé : tmpreaper ; find

Tout le monde a de vieux fichiers qui trainent. Mais rare sont ceux qui savent lesquels supprimer.

Je vous propose une solution simple : tmpreaper, du package éponyme.

Comme son nom l'indique cette commande a été inventée pour vider /tmp régulièrement. C'est assez pratique sur un serveur qui n'est quasiment jamais rebooté ou une machine dont le /tmp est persistent.

Son principe de base est de lister les fichier n'ayant pas été accédés depuis longtemps. Attention, son installation le met directement en place sur /tmp sous forme de cron.

Pouvez-vous dire mieux ?

Mieux !

Vous pouvez l'utiliser pour votre home pour savoir ce qui ne sert à rien et nettoyer un peu ce bazar qui commence à dater. En effet, par défaut ce qui est testé c'est la date d'accès, pas la date du fichier lui-même. Un fichier peut être très vieux et très utilisé. Par contre les fichiers qui n'ont jamais été ouvert sont probablement inutiles.

Pour avoir la liste des vieux fichiers :

$ /usr/sbin/tmpreaper --test 365d ~

Puis enlevez le --test pour vraiment supprimer.

Mais pourquoi utiliser tmpreaper ? On a déjà find, c'est juste un peu moins rigolo :

$ find ~ -atime +365

Et pour supprimer :

$ find ~ -atime +365 -exec rm {} \;

Niveau :      
Résumé :

Vous avez des VM linux ? Si le système de vm dispose d'un outil de compactage de disque (vmware en a un), vous pouvez l'aider depuis votre VM :

# avec un accès au device non monté :
$ apt-get install zerofree
$ zerofree /dev/sda1

Vous avez perdu votre clé publique ssh mais vous avez encore votre clé privée en backup ? Pas de panique :

$ ssh-keygen -y -f .ssh/id_rsa

Si vous avez debian et qu'un paquet met un fichier quelque part alors que vous voudriez le voir ailleurs (pour le remplacer par exemple) :

$ dpkg-divert --add --rename --divert /checmin/fichier.xxx /chemin/fichier

Debian ou ubuntu ? amusez-vous :

$ aptitude moo; a="v"; for i in {1..6}; do aptitude -$a moo; a="v$a"; done

PS : Pour ceux qui me suivent depuis un planet, n'oubliez pas que certains post n'y sont pas publiés car pas dans la ligne éditoriale d'un planet, par exemple le dernier http://linux-attitude.fr/post/perle....

PPS : Et pour ceux qui ont oublié, je publie ce genre d'astuces rapides sur twitter tous les matins @peckpeck

Niveau :      
Résumé : test d'expression régulière

Vous essayez de développer une expression régulière mais vous ne savez pas pourquoi ça ne marche pas ?

Tester une expression

Je vous propose le petit programme suivant qui vous aidera dans la compréhension du fonctionnement de votre regex. Son usage est simple :

./regtest.pl <regex> <chaine>

Exemple :

./regtest.pl "(\d+7)\.1\." "127.127.1.12"
127.127.1.12 : \d+
127.127.1.12 : \d+7
127.127.1.12 : (\d+7)
127.127.1.12 : (\d+7)\.1\.
    127      : $1

Le programme découpe l'expression en éléments syntaxiquement corrects et les applique à la chaine pour voir ce qui matche et le met en évidence. A la fin la liste des groupes qui ont matchés est affiché.

Il est aussi possible de remplacer une des paramètres (la chaine ou la regex) par un '-'. Le programme boucle alors sur l'entrée et vous permet d'entrer une ligne à chaque fois. Vous pouvez donc faire un test en continu. L'avantage et surtout pour les regexp, cela permet de s'affranchir des caractères spéciaux qui pourraient être interprétés par le shell.

Notez que vous aurez besoin de Regexp::Parser qui n'est pas installé par défaut.


continue reading...