Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Archive for 2010

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é : "Perl moderne"

La vie des huîtres selon saint Larry (soûlant ...).

Aujourd'hui il est sujet d'un livre. Un livre dont le titre est "Perl moderne", tout simplement. Je ne vais pas vous le cacher, si je vous en parle c'est que je connais un des auteurs. Remarquez que c'est peut-être l'occasion de commencer une section recommandations de bouquins.

L'acheter ou pas ?

Alors pourquoi acheter ce livre ? Pour les arguments commerciaux, je vous laisse aller voir le site de l'éditeur. Pour les vraies raisons ...

  • parce qu'il fait 450 pages et que c'est beaucoup
  • parce qu'il est assez petit pour tenir dans la poche (enfin avec un bon treillis)
  • parce que comme moi vous avez appris Perl en lisant du code Perl
  • parce que vous ne savez pas qu'il est possible d'écrire du Perl orienté objet

Mais pourquoi je vous déconseillerais d'acheter ce livre ?

  • parce que vous aimez Python et que vous voulez considérer les espaces de fin de ligne comme des erreurs de code
  • parce que pour vous le seul code lisible c'est du code C façon K&R
  • parce que vous êtes Larry Wall et que vous n'allez rien apprendre

Le contenu du livre

La première partie ravira les débutants en Perl qui apprendront que contrairement à la croyance populaire "$^£¨%*" n'est pas un code Perl valide. Remarquez que même moi, qui sais que "Perl '-sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj'" est une ligne de commande valide en Perl, j'y ai appris des choses.

Hé oui, le Perl a bien évolué depuis la première version 5. La partie 2 m'a d'ailleurs appris qu'il y avait une nouvelle façon d'écrire de l'objet en Perl. Moi bêtement je pensais que Perl avait fait les choses super bien en n'ajoutant qu'un mot clé "bless" pour devenir orienté objet. Mais en fait non, il paraît qu'il en faut un peu plus pour entrer proprement dans le paradigme objet. Qu'a cela ne tienne, on utilisera Moose, l'héritage, des setter, des getter et du typage.

Ça vous parait compliqué ? Mais pas du tout le livre contient des exemples simple pour chaque mot clé présenté.

Pour résumer cette partie, ce que j'ai découvert de plus utile ce sont les trigger sur propriétés d'un objets et les méthodes pour intercepter d'autres méthodes.

La troisième partie assez classique avec ce qu'on peut trouver dans les bibliothèque Perl pour traiter les données. Elle parle entre autre de l'infernal problème des dates ...

Passons à un chapitre bien plus passionnant pour qui s'y connaît déjà un peu en Perl, POE. Intuitivement j'aurais dit quelque chose comme "Perl orienté évènement", perdu, il s'agit de "Perl Object Environment". En fait c'est un système puissant de gestion d'évènements et d'états. Le but étant de passer à une programmation événementielle. C'est très pratique lorsque vous codez un serveur, d'autant qu'il existe déjà un grand nombre de méthodes existantes qui vous éviteront de réinventer la roue (la POE::Wheel pour ceux qui connaissent).

Enfin la dernière partie traite d'une chose qui sera bien plus utile à ceux qui ne connaissent pas encore bien Perl, le framework web de Perl. Il permet de parser du HTML, de lire des formulaires, de jouer des séquence complètes de requêtes pour vous faire passer pour un navigateur auprès de votre serveur préféré (pensez-y vous qui devez remplir toutes les semaines le même formulaire dans votre boite ...).

Pour conclure, je dirais que c'est un bon bouquin. Dommage qu'il n'y ait pas un petit site depuis lequel on puisse faire copier/coller des exemples du livre. Heureusement, ils sont assez courts en général. Il y a maintenant un site dédié à ce livre et les exemple y sont disponibles au téléchargement

Allez, soyez gentil, achetez-le, si vous en prenez 2000, je vous promet de faire un article par jour !

Niveau :      
Résumé : setcap ; getcap ; getpcaps

Sous linux la gestion des droits des processus est héritée de posix et donc extrêmement simple.

Si on exclut les modules de sécurité comme SELinux, il n'y a que deux systèmes. Seul le premier est véritablement connu.

Les droits unix

Un processus porte en lui-même 2 informations associées à ses droits : un utilisateur et un groupe. Ceux-ci permettent de déterminer ses actions possibles sur les fichiers (donc partout puisque tout est fichier) avec les attributs correspondants.

Malheureusement tout n'est pas fichier, pour le reste il existe une distinction entre les processus d'uid 0 (root) et les autres. Cette distinction donne des droits supplémentaires au processus root lors de ses appels système, par exemple l'écoute sur un port inférieur à 1024 ou la possibilité de redémarrer une machine.

Ces droits sont hérités d'un processus à un autre sauf dans 2 cas :

  • un fichier exécuté a le bit suid alors on change l'uid du processus (augmentation des droits en général vers root)
  • le processus a l'uid root et demande à en changer (réduction des droits, par exemple pour login)

Les capabilities

C'est ici que ça devient intéressant. Sous linux, un processus dispose aussi d'un ensemble de droits spécifiques que peu de gens connaissent.

En supposant que votre noyau soit compilé pour (c'est en général le cas), il associera à chaque processus (pour être précis, chaque thread) un champ de bits lui listant ses droits (dont celui de garder le silence). Ce champ est hérité d'un processus à un autre et, miracle, il peut être associé à un fichier exécutable comme le bit suid.


continue reading...

Niveau :      
Résumé : iptables -m hashlimit

Aujourd'hui un ami me dit "hey j'ai un truc pour toi" et il me file sa configuration iptables pour limiter les barbares qui viennent lui détruire son serveur et sa connectivité à coup de robots farceurs.

De coup je me suis penché sur son script et je vous le livre avec son accord (toujours accorder un complément d'objet webesque comme dirait la métraisse).

Le script

Il est court mais bref :

IPT=/sbin/iptables
WEBMAXPERMIN="260"
WEBBURST="40"

$IPT -N throttle

# hashlimit-htable-expire en millisecondes 
$IPT -A throttle -m hashlimit \
 --hashlimit-name webthrottle \
 --hashlimit-upto $WEBMAXPERMIN/minute \
 --hashlimit-mode srcip \
 --hashlimit-burst $WEBBURST \
 --hashlimit-htable-expire 300000 \
-j ACCEPT
$IPT -A throttle -j LOG --log-prefix "FREIN " --log-level 1
$IPT -A throttle -j REJECT

#puis dans  le INPUT
$IPT -A INPUT -d $ETH00 -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -j throttle


continue reading...

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

Niveau :      
Résumé :

Quoi ?

Vous connaissez le standard ISO 216 ? C'est celui qui définit la taille des pages A4, A3, ... Ces pages ont un ratio hauteur/largeur de racine de 2. Caractéristique intéressante qui permet de coller 2 pages côte à côte pour passer au format du dessus.

Je digresse, mais disons que la plupart des papiers écrits ont a peu près ce ratio, en format paysage (revues, livres de poche, document imprimés, ...) Quand je dis a peu près c'est très approximatif, 1.4, 1.3, 1.6 c'est a peu près pareil.

L'important étant que les écrans respectent en général l'inverse de ce format (mode paysage quoi). Pourtant si les papiers utilisent ce genre de ratio ce n'est pas vraiment pour le côté standard, mais pour le coté lisibilité. Les journaux mettent même plusieurs colonnes sur une même page pour augmenter cette lisibilité.

C'est pourquoi je vous propose de retourner votre écran. Si vous avez la chance d'avoir un écran que le pied vous permet de pivoter vous pouvez le mettre en format portrait assez facilement.

Comment ?

Sous linux xrandr permet de faire ce genre de chose assez facilement :

$ xrandr -o left

Pour ceux qui ont un dual boot, notez que les raccourcis ctrl-alt-fleche permettent aussi de tourner virtuellement l'écran de windows.

Pourquoi ?

Une fois cette modification effectuée, vous constaterez que beaucoup de choses n'apparaissent plus de la même façon.

  • Un manuel d'une page fait ... une page, plus besoin de scroller.
  • Un document à éditer a le même format que le papier sur lequel il sera imprimé, pratique pour ce qu'on appelle le WYSIWYG
  • Les PDF sont rendu sur une page similaire à ce qu'ils seraient s'ils étaient imprimés (pas besoin d'acheter ipad, bande de ...)
  • Les sites webs restent lisible (les exceptions sont tellement rare que je n'ai jamais eu besoin de retourner mon écran pour en lire un) voire deviennent plus lisibles pour certains.
  • Vous pouvez maintenant mettre votre barre des taches en bas de l'écran sans que cela vous grille votre précieux espace de lecture.

continue reading...