Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Archive for October, 2007

Niveau :      
Résumé : m4

m4 est un langage de macro bien utile. Le jour ou vous avez un fichier texte (ou plusieurs) un peu long et répétitif et que vous en avez marre d'éditer 50 lignes à chaque modification, alors m4 est la solution à votre problème.

Tout d'abord m4 est un langage de macro, c'est-à-dire qu'il ne sert qu'à prendre du texte pour générer du texte, et il s'écrit inline. Donc votre fichier de configuration apache est déjà un fichier m4 qui se génère lui-même à l'identique :

$ m4 /etc/apache2/apache2.conf

C'est cool non ! Pas besoin de partir de zéro, vous faites avec ce que vous avez.

Maintenant écrivons un petit fichier m4 pour apprendre :

dnl ###############
dnl # commentaire #
dnl ###############
dnl

Premier test
`Deuxième test'
# `troisième test'

=>

Premier test
Deuxième test
# `troisième test'

continue reading...

Niveau :      
Résumé : ssh root@<tab>

Rappelons le contexte, on veut pouvoir faire de la complétion automatique sur les noms de machine. La plupart des distributions ont déjà défini un fichier /etc/bash_completion qui fait ceci. Pour le faire, il lit le fichier ~/.ssh/known_hosts. On veut donc récupérer un fichier known_hosts complet pour permettre la complétion automatique. Et ô magie, il existe un outil presque tout fait pour faire ca : ssh-keyscan. C'est un outil qui va récupérer pour vous toutes les clés publiques des serveurs ssh que vous lui demandez. Mieux, il les met au format known_hosts, mieux il sait le faire en parallèle. Donc reprenons notre script d'hier et adaptons :

#!/bin/sh

# fichier hosts
FILE=~/.hosts

# domaines à scanner
DOMAINS="toto.net mamachine.net"

# machines à ajouter à la main (plus d'ip du tout)
cat > $FILE << EOF
mamachine.youpi.fr
tamachine.youpi.fr
EOF

for domaine in $DOMAINS
do
    dig $domaine axfr | egrep "IN[[:space:]]+A" | awk '{print  $1}' >> $FILE
done

# grep pour quelques petits bugs
grep -v "[#_*]" $FILE | ssh-keyscan -t rsa,dsa -f - > ~/.ssh/known_hosts

Petit inconvénient, ssh-keyscan s'arrête dès qu'il y a une erreur de résolution de nom. Pas cool, vous devez le relancer en filtrant mieux lorsque vous tombez sur une erreur.

Et voilà !

Enfin presque, car vous avez bien récupéré les clés, c'est pratique pour votre utilisation de ssh, mais qu'en est-il des nouvelles machines auxquelles vous accédez ? Elles sont naturellement ajoutées au fichier known_hosts, mais il existe deux méthodes pour stocker les noms de machine dans le known_hosts, soit en clair, soit hashé.

Et pour que la complétion fonctionne, il faut nécessairement que ce soit en clair. Donc option "HashKnownHosts no " dans .ssh/config. Mais attention, l'option a été inventée pour qu'en cas de compromission de votre machine l'attaquant ne sache pas quelles sont les machines que vous administrez régulièrement (pour tenter de s'y attaquer).

Vous abandonnerez donc une protection (somme toute légère), et en contrepartie vous avez une complétion avancée sous bash. Mieux, si votre agent tourne et que vous avez poussé vos clés sur les machines en question, la complétion fonctionnera aussi sur les noms de fichiers distants, exemple :

$ scp toto@machine:/<tab><tab> # root c'est mâaal !

Victoire !

Niveau :      
Résumé : ssh root@<tab>

Je suis sûr qu'il vous arrive souvent de taper ssh toto@mamachine.monreseau.net. Tellement souvent que vous avez fini par modifier votre ~/.ssh/config pour y mettre des alias. Pour ceux qui ont oublié comment faire voici la ligne à mettre :

Host machine
    Hostname mamachine.monreseau.net

Au passage vous pouvez ajouter le port et le login par défaut dans cette configuration.

Host machine
    Hostname mamachine.monreseau.net
    Port 1022
    User toto

Bien, passons maintenant quelque chose de tout aussi sympathique. Il est possible de demander à bash de compléter ces noms de machine, plutôt que de les entrer tout seul comme un grand. En effet, bash dispose de la complétion sur les noms de machine. Le simple fait de préfixer un nom par @ permet à bash de supposer que c'est un nom de machine. Mais alors comment fait-il pour les connaître tous ? Il lit la variable $HOSTFILE qui doit contenir le nom d'un fichier au format /etc/hosts. Si elle est vide il lit le fichier /etc/hosts.

Donc : ssh root@l</tab><tab> complète toujours au moins par localhost (ou presque).

Bien, mais nous n'allons pas remplir le fichier /etc/hosts à la main tout de même !

Non, nous allons faire mieux. Hop un script shell :


continue reading...

Niveau :      
Résumé : mplayer -speed 1.5 -af ladspa=tap_pitch:tap_pitch:0:-33:-90:0 foo.avi

Aujourd'hui nous allons voir comment regarder deux films en moins de 2h. Plusieurs possibilités : soit vous trouvez 2 films d'une heure et là tout va bien sauf le choix des films. Soit vous passez les 2 côte sur deux écrans, et là il vous faut un cerveau multitâches efficace. Une dernière possibilité est de les passer en accéléré, et là il vous faut juste un cerveau plus rapide (quoique, ça dépend du film).

Étudions cette dernière possibilité, l'inconvénient est qu'avec un lecteur normal vous aurez du mal à comprendre les dialogues à cause de la voix déformée des acteurs. Heureusement, une solution existe.

Mplayer vient avec un système de plugins sonores nommé ladspa. Tom, un gentil libriste a fait quelques plugins ladspa dont un permettant de corriger le pitch d'une bande son (ce plugin est disponible dans le paquet tap-plugins chez debian).

Vous pouvez donc lancer mplayer avec ce plugin et obtenir un son normal.

$ mplayer -speed 1.5 -af ladspa=tap_pitch:tap_pitch:0:-33:-90:0 toto.avi

Pour les paramètres du plugin ils sont expliqué sur le site :

  • Le 0 veut dire que l'unité est le pourcentage.
  • Le -33 se calcule par la formule suivante : (1 - 1.5) / 1.5 * 100 : 1.5 étant le multiplicateur de vitesse précédent
  • Le -90 veut dire qu'on supprime le son original
  • Le 0 veut dire qu'on garde le son calculé

Le problème de cette technique est que la correction du pitch ne peut pas se faire en live. Dommage, si quelqu'un veut s'amuser à coder un patch mplayer pour que ça marche, ça serait gentil.

Sinon pour les détails, le billet original se trouve ici : http://markplusplus.wordpress.com/2006/10/01/pitch-correct-play-speed-with-mplayer/. Il contient un certain nombre de commentaires intéressants, lisez-les.

Niveau :      
Résumé : export PAGER=most ; export LESS_TERMCAP

Les pages de manuel sont bien tristes en noir et blanc. Heureusement nous allons y mettre de la couleur.

Voici une première méthode plutôt simple :

$ apt-get install most
$ export PAGER=most
$ man man

Bravo ! Mais bon il faut aimer most, ses raccourcis et sa présentation. Et cela nécessite de l'installer, ce qui est difficile si vous n'êtes pas root.

Je vous ai donc trouvé mieux sur http://nion.modprobe.de/blog/archives/572-less-colors-for-man-pages.html Ajoutez tout simplement ceci dans votre .bashrc :

export LESS_TERMCAP_mb=$'\E[01;31m'    # debut de blink !
export LESS_TERMCAP_md=$'\E[01;31m'    # debut de gras
export LESS_TERMCAP_me=$'\E[0m'        # fin
export LESS_TERMCAP_so=$'\E[01;44;33m' # début de la ligne d'état
export LESS_TERMCAP_se=$'\E[0m'        # fin
export LESS_TERMCAP_us=$'\E[01;32m'    # début de souligné
export LESS_TERMCAP_ue=$'\E[0m'        # fin

Hop un petit exemple :

$ man man

En plus cela fonctionnera non seulement pour man, mais pour toutes les commandes à base de less.

Pour comprendre et personnaliser ces commandes, vous devrez comprendre les variables : man 5 termcap, (lire les capabilities). Et vous devrez aussi connaître les codes ANSI pour les numéros de couleur : http://pueblo.sourceforge.net/doc/manual/ansi_color_codes.html (notez que le ';' sépare plusieurs codes couleurs qui vont ensemble).

Notez que vous pourrez aussi étendre un peu la chose grâce à d'autres variables. Et maintenant que vous avez tout compris, sachez que les variables TERMCAP existent pour la plupart des softs. Vous allez donc tous les personnaliser bien sûr !

Niveau :      
Résumé : dd ; vcstime ; fold ; for

Vous avez un fichier à faire grossir de 10M à 100M :

$ dd if=/dev/zero of=file bs=1M count=1 seek=99

Afficher l'heure dans tous les terminaux linux (dans celui en cours en fait), à laner en root :

# du paquet console-tools
$ vcstime &

Formater un texte à 80 colonnes :

$ fold -w 80 < texte

Conversion de base 12 en base 10 rapide en shell :

$ echo $((12#123))

Faire des boucles énumérées en bash (sisi c'est possible) :

$ for ((i=0;i<=10;i++)); do echo $i; done

Pour passer d'une page à la suivante, faites un clic/déplacer/clic. Ça ressemble à un double clic avec un déplacement au milieu. Si votre déplacement est vers la gauche, vous revenez d'une page en arrière, s'il est vers la droite, vous avancez d'une page.

Niveau :      
Résumé : co -l ; ci -u ; rlog ; rscdiff

Avant subversion existait cvs, avant cvs existait rcs. CVS est en fait une version de RCS en réseau avec un dépôt centralisé.

Étudions donc cet outil, qui bien que préhistorique a encore un peu d'utilité dans notre monde. En effet, il est très simple d'utilisation, local et ne nécessite aucune configuration préalable.

Prenons un exemple simple. Vous avez un fichier de configuration, et il vous arrive de le modifier. Logiquement vous voulez garder les traces de ce que vous faites. Appelons ce fichier /etc/mysql/my.cnf. Notes que ci = CheckIn (commit) et co = CheckOut :

$ cd /etc/mysql
# à partir de maintenant on garde les traces
$ ci -i my.cnf
# mais on ne veut pas qu'il disparaisse
$ co my.cnf
# le fichier est maintenant en lecture seule

Vous aurez remarqué que toutes les modifications (ainsi que l'initialisation) nécessitent un commentaire. Pensez à le terminer par un point sur une seule ligne ou par un ctrl-d.

Maintenant faisons une modification :

# on récupère la bonne version, et on autorise l'écriture
$ co -l my.cnf
# on fait nos petites affaires
$ vi my.cnf
# et on valide (en mettant le fichier en lecture seule)
$ ci -u my.cnf

continue reading...