Aller au contenu

Linux Attitude

Le libre est un état d'esprit

Archive

Tag : Commande

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


continuer la lecture...

Niveau :      
Résumé : grub-reboot; grep . *; ssh-keygen -R; ${FUNCNAME[*]}; man -LC

Rebooter une seule fois sure une entrée donnée avec grub2 (le reboot suivant, s'il y a lieu, se fera sur l'ancienne entrée).

# attention, grub doit avoir default="${saved_entry}" dans /boot/grub/grub.cfg
# GRUB_DEFAULT=saved dans /etc/default/grub sous debian
$ grub-reboot 1
$ reboot

Afficher les paramètres de /proc/sys/net/ipv4 (ou tout autre répertoire similaire avec des fichiers d'une ou 2 lignes) :

$ cd /proc/sys/net/ipv4
$ grep . *

Supprimer un host de ~/.ssh/known_hosts (pratique surtout s'il est hashé) :

# le hostname à utiliser est indiqué par le client ssh en cas d'erreur
$ ssh-keygen -R hostname

Imprimer une stack trace en bash :

# peut s'améliorer avec une boucle while et les variables $BASH_LINENO et $BASH_SOURCE
$ echo ${FUNCNAME[*]}

Toujours avoir les man en VO (up to date et pas d'erreurs subtiles) :

$ alias man='man -LC'

Niveau :      
Résumé : script, scriptreplay

Vous voulez préparer un cours ou une présentation à base de ligne de commande, espionner quelqu'un ... ?

Ça vous ennuie de taper les commandes en direct ?

J'ai la solution : script.

Script

Script est une commande qui crée un faux terminal virtuel et duplique tout ce qui s'y passe dans un fichier typescript.

Exemple :

$ script
# on est ici dans un terminal
$ echo coucou
> coucou
$ exit
# on est sorti du terminal
$ cat typescript
> $ echo coucou
> coucou
> $ exit

Dit comme ça, ça ne semble pas très utiles mais 2 choses vont tout changer. La première c'est que script fait un vrai terminal virtuel et pas seulement une redirection, ce qui veut dire que contrairement aux pipe (|) et autres redirections (>), il est capable d'enregistrer ce qui va sur le terminal (Il est important de savoir faire la différence entre le terminal et stdout).

Exemple : la commande time. Cette commande écrit le temps d'exécution directement sur le terminal et pas dans la sortie standard, on ne peut donc pas la récupérer facilement, script le peut.


continuer la lecture...