[ précédent ] [ Table des matières ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ suivant ]


Guide de référence pour Debian
Chapitre 8 - Astuces Debian


8.1 Démarrer le système

Consultez le BootPrompt-HOWTO du LDP pour des informations détaillées sur l'invite de démarrage.


8.1.1 « J'ai oublié le mot de passe de root ! » (1)

On peux démarrer dans le compte administrateur (root) sans connaître le mot de passe de root si on a un accès au clavier de la console. (Cela suppose qu'il n'y a pas de mot de passe requis pour le BIOS ni pour le chargeur de démarrage comme lilo qui empêche de lancer le système).

Cette procédure ne nécessite ni disquette de démarrage externe ni changement dans les réglages du BIOS. Ici, "Linux" est le nom du noyau Linux par défaut qui lance le système Debian.

A l'écran d'invite de lilo, dès que boot: apparaît (il faut appuyer sur la touche MAJ sur certains systèmes pour éviter le démarrage automatique et lorsque lilo utilise le framebuffer il faut appuyer sur TAB pour voir les options que vous tapez), entrez :

     boot: Linux init=/bin/sh

Le système lance alors le noyau et exécute /bin/sh au lieu du processus init standard. Vous avez maintenant les droits et le shell de l'administrateur root. Puisque / est monté en lecture seule et que beaucoup de partitions ne sont pas encore montées, vous devez faire ce qui suit pour obtenir un système à peu près fonctionnel.

     init-2.03# mount -n -o remount,rw /
     init-2.03# mount -avt nonfs,noproc,nosmbfs
     init-2.03# cd /etc
     init-2.03# vi passwd
     init-2.03# vi shadow

(Si la seconde colonne de /etc/passwd est « x » pour tous les utilisateurs, votre système utilise les "shadow passwords" (NdT : mots de passes cachés), et il faut éditer /etc/shadow.) Une entrée vide dans la seconde colonne de l'un de ces fichiers désactive le mot de passe. Maintenant le système peut être lancé sans le mot de passe de root. Debian (au moins après Potato) nécessite d'entrer un mot de passe si le système est lancé au niveau d'exécution (runlevel) 1, ce que d'anciennes distributions ne faisait pas.

C'est une bonne idée d'avoir un éditeur minimum dans /bin au cas où /usr ne serait pas accessible (voir Editeurs de sauvetage, Section 11.2).

Vous pouvez aussi installer le paquet sash. Si le système ne démarre plus, lancez :

     boot: Linux init=/bin/sash

sash sert de substitution intéractive à sh même lorsque /bin/sh est inutilisable. Il est lié statiquement, et inclut beaucoup d'utilitaires standard (tapez « help » à l'invite pour une liste).


8.1.2 « J'ai oublié le mot de passe de root ! » (2)

Démarrez depuis n'importe quel ensemble de disquettes de boot/root. Si /dev/hda3 est la partition racine originale, la suite vous laissera éditer le fichier de mots de passe aussi facilement que précédemment.

     # mkdir fixit
     # mount /dev/hda3 fixit
     # cd fixit/etc
     # vi shadow
     # vi passwd

L'avantage de cette méthode sur la précédente est qu'on n'est pas obligé de connaître le mot de passe de lilo, mais on doit pouvoir régler le BIOS pour que le système se lance depuis la disquette ou le CD.


8.1.3 Je ne peux pas lancer le système

Pas de problème, personne ne prend la peine de faire une disquette de démarrage lors de l'installation. Si lilo est cassé, récupérez la disquette de démarrage de l'installation de Debian (rescue). Démarrez depuis cette disquette. A l'invite de démarrage, en supposant que la partition racine de Linux est /dev/hda12 et que vous voulez le niveau d'exécution (runlevel) 3, entrez :

     boot: rescue root=/dev/hda12 3

Vous avez maintenant lancé un système presque totalement fonctionnel depuis le noyau présent sur la disquette. (Il peut y avoir quelques problèmes et messages d'erreur mineurs à cause d'un manque dans les options du noyau ou d'un module absent.)

Voyez aussi Installer un paquet sur un système qui ne démarre plus, Section 6.3.6 si votre système est planté.

Si vous avez besoin d'une disquette de démarrage personnalisée, suivez les instructions de readme.txt sur la disquette de secours.


8.1.4 « Je veux désactiver X au démarrage ! »

Suivre unstable/sid est sympa, mais un bogue de xdm, gdm, kdm, ou wdm lancé pendant le processus de démarrage peut faire mal.

D'abord, obtenez un shell avec root en tapant ce qui suit à l'invite de démarrage :

     boot: Linux vga=normal s

Là, Linux est le nom de l'image du noyau que vous démarrez, « vga=normal » s'assure que lilo s'exécute en mode VGA, et « s » (ou « S ») est le paramètre passé à init pour lancer le mode mono-utilisateur. Entrez le mot de passe de root à l'invite.

Il existe quelques moyens de désactiver tous les démons X qui démarrent :

Ici, rc2.d doit correspondre au niveau de fonctionnement spécifié dans /etc/inittab. De plus, ?dm signifie tous les fichiers parmi xdm, gdm, kdm, et wdm.

Seul le premier est le « véritable moyen unique » de Debian. Le dernier est facile mais marche seulement sur Debian et nécessite que vous reconfiguriez le gestionnaire d'affichage par la suite avec dpkg-reconfigure. Les autres sont des méthodes génériques pour désactiver des démons.

Vous pouvez toujours lancer X avec la commande startx depuis une console.


8.1.5 Autres astuces avec l'invite de démarrage

Le système peut être lancé à un niveau d'exécution particulier et avec des options de configurations en utilisant l'invite de démarrage de lilo. Les détails sont données dans le BootPrompt-HOWTO (LDP).

Si vous voulez lancer le système au niveau d'exécution 4, entrez la ligne suivante à l'invite de lilo.

     boot: Linux 4

Si vous voulez lancer le système en mode de fonctionnement mono-utilisateur normal, et que vous connaissez le mot de passe de root, un des exemples suivants à l'invite de lilo fonctionnera.

     boot: Linux S
     boot: Linux 1
     boot: Linux -s

Si vous voulez lancer le système en utilisant moins de mémoire vive que le système n'en a en réalité (par exemple 48Mo sur un ordinateur qui a 64Mo), utilisez la commande suivante à l'invite de démarrage de lilo :

     boot: Linux mem=48M

Assurez-vous de ne pas spécifier plus de mémoire que le système n'en a en réalité, sinon le noyau va planter. Si vous avez plus de 64Mo de mémoire vive, 128Mo par exemple, à moins de spécifier mem=128M à l'invite de lilo ou d'inclure une ligne "append" similaire dans /etc/lilo.conf, les vieux noyaux et/ou les cates mères avec un vieux BIOS n'utiliseront pas la mémoire au-delà des 64Mo.


8.1.6 Comment configurer les paramètres de démarrage de GRUB

GRUB est un nouveau gestionnaire de démarrage issu du projet Hurd et est beaucoup plus flexible que Lilo mais a une manière différente de gérer les paramètres de démarrage.

     grub> find /vmlinuz
     grub> root (hd0,0)
     grub> kernel /vmlinuz root=/dev/hda1
     grub> initrd /initrd
     grub> boot

Là, vous devez connaître les noms de périphériques de Hurd :

     the Hurd/GRUB           Linux               MSDOS/Windows
      (fd0)               /dev/fd0            A:
      (hd0,0)             /dev/hda1           C: (habituellement)
      (hd0,3)             /dev/hda4           F: (habituellement)
      (hd1,3)             /dev/hdb4           ?

Voir /usr/share/doc/grub/README.Debian.gz et /usr/share/doc/grub-doc/html/ pour les détails.


8.2 Enregistrer les activités


8.2.1 Enregistrer les activités du shell

L'administration système est une série d'activités beaucoup plus élaborées dans un environnement Unix que dans un environnement de PC ordinaire. Soyez sûr de connaître les méthodes de configuration de base si vous avez besoin de réparer les problèmes d'un système. Les interfaces graphiques des outils de configuration peuvent avoir l'air agréable et commode, mais sont parfois limitées surtout dans de telles situations.

Dans ce contexte, enregistrer les activités du shell est une bonne habitude, surtout si l'on est root.

Sous Emacs : utilisez M-x shell pour démarrer l'enregistrement dans le buffer, et utilisez C-x C-w pour écrire le contenu du buffer dans un fichier.

Sous le shell : utilisez la commande screen avec « ^A H » comme décrit à la section Changement de console avec screen, Section 8.6.28 ou la commande script.

     $ script
     Script started, file is typescript
      .... faites ce que vous voulez ...
      Ctrl-D
     $ col -bx <typescript >savefile
     $ vi savefile

La méthode suivante peut être utilisée à la place de script.

     $ bash -i 2>&1 | tee typescript

8.2.2 Enregistrer les activités sous X

Si vous avez besoin d'enregistrer l'image d'une application sous X, y compris une fenêtre de xterm, utilisez gimp. Il peut capturer une fenêtre isolée ou l'écran entier. Des alternatives existent comme xwd (paquet xbase-clients), import (imagemagick), ou scrot (scrot).


8.3 Copier et archiver un sous-répertoire entier


8.3.1 Commandes de base pour copier un sous-répertoire entier

En cas de réarrangement de la structure de fichiers, déplacez le contenu des dossiers y compris les liens par les commandes :

     Méthode classique :
     # cp -a /source/directory /dest/directory # version GNU de cp
     # (cd /source/directory && tar cf - . ) | \
             (cd /dest/directory && tar xvfp - )
     S'il y a des liens durs, la méthode suivante est nécessaire :
     # cd /path/to/old/directory
     # find . -depth -print0 | afio -p -xv -0a /mount/point/of/new/directory
     Si le système de fichier est distant :
     # (cd /source/directory && tar cf - . ) | \
             ssh user@host.dom (cd /dest/directory && tar xvfp - )
     S'il n'y a pas de fichiers liés :
     # scp -pr user1@host1.dom:/source/directory \
               user2@host2.dom:/dest/directory

Ici, scp <==> rcp et ssh <==> rsh.

La méthode de copie d'un sous-répertoire entier est basée sur l'information fournie par Manoj Srivastava srivasta@debian.org sur la liste de diffusion debian-user@lists.debian.org.


8.3.2 cp

Traditionnellement, cp n'était pas réellement utilisable puisqu'il ne déréférence pas les liens symboliques, ni ne préserve les liens durs. Une autre chose à considérer était les fichiers à faible densité (avec des trous).

La version GNU de cp a dépassé ces limitations ; cependant, sur un système non GNU, cp peut toujours avoir ces problèmes. De plus, on ne peut pas générer de petites archives portables avec cp.

     % cp -a . newdir

8.3.3 tar

tar a éliminé certains des problèmes que cp avait avec les liens symboliques. Cependant, bien que cpio gère les fichiers spéciaux, le tar traditionnel ne les gère pas.

tar gère de multiples liens durs en plaçant une copie du lien sur la bande, mais le nom de cette copie est le seul que vous pouvez utiliser pour récupérer le fichier ; cpio met une copie pour chaque lien, et vous pouvez le récupérer en utilisant n'importe lequel des noms.

La commande tar a changé l'option pour les fichiers .bz2 entre Potato et Woody, donc utilisez --bzip2 dans des scripts au lieu de -I (Potato) ou -j (Woody).


8.3.4 pax

C'est le nouvel utilitaire d'archivage portable, compatible POSIX (IEEE Std 1003.2-1992, pages 380-388 (section 4.48) et pages 936-940 (section E.4.48)), "qui chante et danse". pax lit, écrit, et liste les fichiers d'une archive, et copie des hiérarchies de répertoires. pax travaille indépendament du format de l'archive et supporte un grand nombre de formats d'archives.

Les implémentations de pax sont récentes et encore chaudes.

     # apt-get install pax
     $ pax -rw -p e . newdir
      ou
     $ find . -depth  | pax -rw -p e  newdir

8.3.5 cpio

cpio stocke ou extrait les fichiers dans ou à partir d'une archive cpio ou tar. L'archive peut être un autre fichier sur le disque, une bande magnétique ou un tube.

     $ find . -depth -print0 | cpio --null --sparse -pvd new-dir

8.3.6 afio

afio permet de mieux gérer les archives au format cpio. Il est généralement plus rapide que cpio, fournit plus d'options pour les bandes magnétiques, gère mieux les erreurs de données en entrée et supporte des archives multi-volume en utilisation intéractive. afio peut créer des archives compressées qui sont plus sûres que les archives compressées de tar ou cpio. afio est utilisé au mieux en tant que machine à archiver dans un script de sauvegarde.

     $ find . -depth -print0 | afio -px -0a new-dir

Toutes mes sauvegardes sur bande sont faites avec afio.


8.4 Sauvegarde différentielle et synchronisation de données

La sauvegarde différentielle et la synchronisation de données peuvent être implémentés par plusieurs méthodes :

La combinaison d'une des méthodes décrites dans la section Copier et archiver un sous-répertoire entier, Section 8.3 et le processus régulier automatisé décrit dans la section Programmer des activités (cron, at), Section 8.6.27 permet de faire un bon système de sauvegarde.

Je vais décrire trois outils faciles à utiliser.


8.4.1 Sauvegarde différentielle avec rdiff

rdiff-backup offre une sauvegarde bonne et simple avec historique différentiel pour n'importe quel type de fichiers y compris des liens symboliques. Pour sauvegarder la plus grande partie de ~/ vers /mnt/backup :

     $ rdiff-backup --include ~/tmp/keep --exclude ~/tmp  ~/ /mnt/backup

Pour restaurer les données d'il y a trois jours de cette archive vers ~/old :

     $ rdiff-backup -r 3D /mnt/backup ~/old

Voir rdiff-backup(1).


8.4.2 Sauvegarde quotidienne avec pdumpfs

pdumpfs est un système simple de sauvegarde quotidienne similaire à dumpfs du système Plan9, et qui garde chaque image quotidienne. Vous pouvez accéder aux images antérieures n'importe quand pour récupérer un fichier d'un certain jour. Sauvegardons votre répertoire personnel avec pdumpfs et cron !

pdumpfs construit une image AAAA/MM/JJ dans le répertoire destination. Tous les fichiers source sont copiés vers le répertoire de l'image la première fois que pdumpfs est exécuté. A partir de la deuxième fois, pdumpfs copie seulement les ficheirs modifiés ou créés et stocke les fichiers inchangés avec des liens durs vers les fichiers du jour précédent, pour économiser de l'espace disque.

     $ pdumpfs src-dir dest-dir [dest-basename]

Voir pdumpfs(8).


8.4.3 Sauvegarde différentielle régulière avec RCS

changetrack enregistre les changements des fichiers texte de configuration dans des archives RCS régulièrement. Voir changetrack(1).

     # apt-get install changetrack
     # vi changetrack.conf

8.5 Récupération d'un système bloqué


8.5.1 Tuer un processus

Exécutez top pour voir quel processus agit bizarrement. Appuyez sur « P » pour trier par temps CPU utilisé, « M » pour trier par mémoire utilisée, et « k » pour tuer un processus. Autrement, ps aux | less (style BSD) ou ps -efH | less (style System V) peut être utilisé. La syntaxe System V affiche le numéro de processus parent PPID qui peut être utilisé pour tuer des processus zombie (defunct).

Utilisez kill pour tuer (ou envoyer un signal à) un processus à partir de son numéro de processus, ou killall pour faire la même chose à partir du nom de la commande du processus. Signaux fréquemment utilisés :

      1 : HUP,  redémarre un démon
     15 : TERM, termine un process normalement
      9 : KILL, tue un process

8.5.2 Alt-SysRq

L'option de compilation du noyau "Magic SysRq key" donne une assurance contre un mauvais fonctionnement du système. Appuyer sur Alt-SysRq sur un i386, suivi par une des touches r 0 k e i s u b, agit magiquement.

Un`R'aw récupère le clavier en cas de plantage de logiciels comme X. Mettre le niveau de log de la console à `0' réduit le nombre de messages d'erreur. sa`K' (touche d'attention système, NdT : system attention key en Anglais) tue tous les processus de la console vituelle courante. t`E'rminate tue tous les processus du terminal courant excepté init. k`I'll tue tous les processus excepté init.

`S'ync, `U'mount, et re`B'oot permettent de se sortir de très mauvaises situations.

Les noyaux de l'installation par défaut de Debian ne sont pas compilés avec cette option au moment où ce document est écrit. Recompilez le noyau pour activer cette fonction. Des informations détaillées se trouvent dans /usr/share/doc/kernel-doc-version/Documentation/sysrq.txt.gz ou /usr/src/kernel-version/Documentation/sysrq.txt.gz.


8.6 Petites commandes utiles à se rappeler


8.6.1 Pager

less est le pager (visualisateur de contenu des fichiers). Appuyez sur `h' pour de l'aide. Il peut faire beaucoup plus que more. less peut être amélioré en exécutant eval $(lesspipe) ou eval $(lessfile) dans les scripts de démarrage du shell. Plus d'information dans /usr/share/doc/lessf/LESSOPEN. L'option -R permet l'affichage de caractères bruts et active les séquences d'échappement couleur ANSI. Voir less(1).

w3m peut être une bonne solution de rechange pour les systèmes de code (EUC).


8.6.2 Mémoire libre

free et top donnent de bonnes informations sur les ressources mémoire. Ne vous inquiétez pas de la taille de "used" sur la ligne "Mem:", lisez plutôt la ligne en-dessous (38792 dans l'exemple ci-dessous).

     $ free -k # for 256MB machine
                  total       used       free     shared    buffers cached
     Mem:        257136     230456      26680      45736     116136 75528
     -/+ buffers/cache:      38792     218344
     Swap:       264996          0     264996

La quantité exacte de mémoire physique peut être confirmée par grep '^Memory' /var/log/dmesg, qui dans notre cas d'exemple donne « Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init) ».

     Total         = 262144k = 256M (1k=1024, 1M=1024k)
     Free to dmesg = 256984k = Total - kernel - reserved - data - init
     Free to shell = 257136k = Total - kernel - reserved - data

Environ 5Mo ne sont pas utilisables par le système parce que le noyau les utilise.


8.6.3 Régler l'heure (BIOS)

     # date MMJJhhmmAAAA
     # hwclock --utc --systohc
     # hwclock --show

Cela va régler l'heure du système et du matériel à JJ/MM hh:mm, AAAA. L'heure est affichée selon le fuseau horaire local, mais le matériel utilise UTC.

Si l'heure matérielle (BIOS) est réglée en GMT, changez le réglage pour UTC=yes dans le fichier /etc/default/rcS.


8.6.4 Régler l'heure (NTP)

Référence : Managing Accurate Date and Time HOWTO.


8.6.4.1 Régler l'heure avec une connexion Internet permanente

Régler l'horloge système automatiquement via un serveur distant :

     # ntpdate server

Il est bon d'avoir cette commande dans /etc/cron.daily si votre système possède une connexion permanente à Internet.


8.6.4.2 Régler l'heure avec une connexion Internet intermitente

Utilisez le paquet chrony.


8.6.5 Comment contrôler des possibilités de la console comme l'écran de veille

Pour désactiver l'écran de veille, utilisez les commandes suivantes.

En mode console :

     # setterm -powersave off

Démarrez la console kon2 (kanji) avec :

     # kon -SaveTime 0

Sous X :

     # xset s off
      ou
     # xset -dpms
      ou
     # xscreensaver-command -prefs

Lisez les pages de manuel correspondantes pour contrôler d'autres possibilités de la console. Voir aussi stty(1) pour changer et afficher la configuration du terminal.


8.6.6 Chercher dans la base de données administrative

La Glibc offre getent(1) pour chercher dans les entrées des bases de données administratives, càd., passwd, group, hosts, services, protocols, ou networks.

     getent database [key ...]

8.6.7 Désactiver le son (beep)

On peut toujours débrancher le haut-parleur PC ;-) Pour le shell Bash :

     echo "set bell-style none">> ~/.inputrc

8.6.8 Messages d'erreur sur l'écran de la console

Afin de ne pas avoir de messages d'erreur sur l'écran, le premier endroit à regarder est /etc/init.d/klogd. Réglez KLOGD="-c 3" dans ce script et lancez /etc/init.d/klogd restart. Une autre méthode est de lancer dmesg -n3.

Voici la signification des niveaux d'erreur :

Si un message d'erreur particuler vous embête, pensez à faire une rustine facile pour le noyau comme shutup-abit-bp6 (disponible dans le sous-répertoire des exemples).

Un autre endroit à regarder peut être le fichier /etc/syslog.conf ; vérifiez si les messages d'erreurs ne sont pas envoyés vers une console.


8.6.9 Régler la console

Les consoles sur les systèmes Unix sont habituellement accédées par des fonctions de la bibliothèque (n)curses. Cela donne à l'utilisateur une méthode indépendante du terminal pour mettre à jour les caractères sur l'écran avec une optimisation raisonnable. Voir ncurses(3X) et terminfo(5).

Sur un système Debian, il existe beaucoup d'entrées prédéfinies :

     $ toe | less                  # toutes les entrées
     $ toe /etc/terminfo/ | less   # entrées reconfigurables

Exportez votre sélection dans une variable d'environnement TERM.

Si l'entrée terminfo pour xterm ne marche pas avec un xterm non Debian, changez le type de terminal de « xterm » à l'une des versions limitée en options comme « xterm-r6 » lorsque vous vous connectez à un système Debian à distance. Voir /usr/share/doc/libncurses5/FAQ pour plus d'information. « dumb » est le plus petit dénominateur commun pour terminfo.


8.6.10 Remettre la console dans un état sain

Lorsque l'écran devient illisible après $ cat fichierbinaire (il se peut que vous ne voyiez pas la commande en tapant) :

     $ reset

8.6.11 Convertir des fichiers texte DOS vers Unix

Pour convertir un fichier texte DOS (fin de ligne ^M^J) en fichier texte Unix (^J) :

     # apt-get install sysutils
     $ dos2unix dosfile

8.6.12 Convertir un fichier texte avec recode

Ce qui suit convertit les fichiers entre les caractères de fin de ligne DOS, Mac et Unix :

     $ recode /cl../cr <dos.txt >mac.txt
     $ recode /cr.. <mac.txt >unix.txt
     $ recode ../cl <unix.txt >dos.txt

recode convertir aussi les fichiers entre les différents jeux de caractères et surfaces :

     $ recode charset1/surface1..charset2/surface2 \
      <input.txt >output.txt

Les jeux de caractères les plus courants sont (voir aussi Introduction aux locales, Section 9.7.3) [28]  :

Les surfaces les plus courantes sont [29]  :

Pour plus de détails, voir la description de info recode.

Il existe aussi des outils de conversion plus spécialisés :


8.6.13 Substitutions à l'aide des expressions rationnelles

Pour remplacer toutes les occurences de FROM_REGEX par TO_REGEX dans tous les fichiers FILES ... :

     $ perl -i -p -e 's/FROM_REGEX/TO_REGEX/g;' FILES ...

-i est pour « édition sur place », -p est pour « boucle implicite sur FILES ... ». Si la substitution est complexe, vous pouvez faciliter le retour sur des erreurs en utilisant le paramètre -i.bak au lieu de -i ; cela permet de garder les fichiers originaux en leur ajoutant le suffixe .bak.


8.6.14 Editer un fichier avec un script

Le script suivant supprime les lignes 5 à 10 et 16 à 20.

     #!/bin/bash
     ed $1 <<EOF
     16,20d
     5,10d
     w
     q
     EOF

Les commandes de ed sont les mêmes que celles de vi en mode commande. L'édition de fichiers de cette façon rend facile la création de scripts.


8.6.15 Extraire des différences et introduire des mises à jour dans un fichier source

Suivez l'une de ces procédures pour extraire les différences par rapport au fichier source et créer des fichiers diff unifiés file.patch0 ou file.patch1 selon l'emplacement du fichier :

     $ diff -u file.old file.new1 > file.patch0
     $ diff -u old/file new1/file > file.patch1

Le fichier diff (aussi appelé rustine ou patch) est utilisé pour envoyer des mises à jour du programme. Celui qui le reçoit peut appliquer cette mise à jour à un autre fichier file avec :

     $ patch -p0 file < file.patch0
     $ patch -p1 file < file.patch1

Si vous avez trois versions d'un code source, vous pouvez les mélanger plus efficacement avec diff3 :

     $ diff3 -m file.mine file.old file.yours > file

8.6.16 Convertir un gros fichier en plusieurs petits

     $ split -b 650m file   # sépare file en morceaux de 650Mo
     $ cat x* >largefile    # assemble les fichiers en 1 gros fichier

8.6.17 Extraire des données d'un tableau contenu dans un fichier texte

Considérons un fichier texte DPL dans lequel tous les responsables précédents du projet Debian (DPL, Debian Project Leader) et leur date d'investiture sont listés séparés par des espaces dans un tableau.

     Ian     Murdock   August  1993
     Bruce   Perens    April   1996
     Ian     Jackson   January 1998
     Wichert Akkerman  January 1999
     Ben     Collins   April   2001
     Bdale   Garbee    April   2002
     Martin  Michlmayr March   2003

AWK est fréquemment utilisé pour extraire des données à partir de ce type de tableaux.

     $ awk '{ print $3 }' <DPL                   # mois d'investiture
     August
     April
     January
     January
     April
     April
     March
     $ awk '($1=="Ian") { print }' <DPL          # DPL appelé Ian
     Ian     Murdock   August  1993
     Ian     Jackson   January 1998
     $ awk '($2=="Perens") { print $3,$4 }' <DPL # quand Perens a été investi
     April 1996

Des shells comme Bash peuvent aussi être utilisés pour ce genre de fichiers :

     $ while read first last month year; do
         echo $month
       done <DPL
     ... même sortie que le premier exemple Awk

Ici, la commande de Bash read utilise les caractères de $IFS (internal field separators, séparateurs de champs internes) pour séparer les lignes en mots.

Si vous changez $IFS à ":", vous pouvez traiter le fichier /etc/passwd avec le shell :

     $ oldIFS="$IFS"   # garde l'ancienne valeur
     $ IFS=":"
     $ while read user password uid gid rest_of_line; do
         if [ "$user" = "osamu" ]; then
           echo "$user's ID is $uid"
         fi
       done < /etc/passwd
     osamu's ID is 1001
     $ IFS="$oldIFS"   # remet l'ancienne valeur

(Si Awk est utilisé pour faire cela, utilisez FS=":" pour régler le séparateur de champs.)

IFS est aussi utilisé par le shell pour séparer les résultats de l'expansion de paramètres, de la substitution de commande, et l'expansion arithmétique. Celles-ci ne sont pas effectuées à l'intérieur de guillemets simples ou doubles. La valeur par défaut de IFS est <space>, <tab> et <newline>.

Faites attention en utilisant IFS. Des choses étranges peuvent survenir, lorsque le shell interprète certaines parties du script comme entrée.

     $ IFS=":,"                        # utilise ":" et "," come IFS
     $ echo IFS=$IFS,   IFS="$IFS"     # echo est une commande Bash
     IFS=  , IFS=:,
     $ date -R                         # une simple sortie de commande
     Sat, 23 Aug 2003 08:30:15 +0200
     $ echo $(date -R)                 # sous-shell --> entrée vers
                                         le shell principal
     Sat  23 Aug 2003 08 30 36 +0200
     $ unset IFS                       # restaure la valeur par défaut
     $ echo $(date -R)
     Sat, 23 Aug 2003 08:30:50 +0200

8.6.18 Bouts de scripts pour les tubes

Les scripts suivants font des choses sympa avec les tubes.

     find /usr | egrep -v "/usr/var|/usr/tmp|/usr/local"
                          # trouve tous les fichiers de /usr sauf certains
     xargs -n 1 command   # exécute command avec tous les arguments de stdin
     xargs -n 1 echo |    # place chaque argument séparé par des espaces
                            sur une ligne
     xargs echo      |    # fusionne toutes les lignes en une seule
     grep -e pattern|     # extrait les lignes contenant pattern
     cut -d: -f3 -|
             # extrait le 3e champ séparé par : (fichier passwd, etc.)
     awk '{ print $3 }' | # extrait le 3e champ séparé par des espaces
     awk -F'\t' '{ print $3 }' |
             # extrait le 3e champ séparé par des tabulations
     col -bx |            # supprime les retour-arrières et transforme
                            les tabulations en espaces
     expand -|            # transforme les tabulations
     sort -u|             # trie et supprime les doublons
     
     tr '\n' ' '|         # concatène les lignes en une seule
     tr '\r' ''|          # supprime CR
     tr 'A-Z' 'a-z'|      # convertit les majuscules en minuscules
     sed 's/^/# /'|       # change chaque ligne en commentaire
     sed 's/\.ext//g'|    # supprime .ext
     sed  -n -e 2p|       # affiche la 2e ligne
     head -n 2 -|         # affiche les 2 premières lignes
     tail -n 2 -|         # affiche les 2 dernières lignes

8.6.19 Bouts de scripts pour boucler sur chaque fichier

Les façons suivantes de boucler sur chaque fichier correspondant à *.ext assure une gestion correcte des noms de fichiers atypiques comme ceux ayant des espaces et effectuent la même chose :


8.6.20 Série de courts scripts en Perl

Tous les scripts Awk peuvent être réécrits avec Perl. Par exemple :

     awk '($2=="1957") { print $3 }'|

peut être remplacé par l'une des lignes suivantes au choix :

     perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
     perl -lane 'print $F[2] if $F[1] eq "1957"' |

On peut enlever tous les espaces dans les arguments de perl dans la ligne précédente et prendre avantage de la conversion automatique entre les nombres et les chaînes de caractères en Perl :

     perl -lane 'print$F[2]if$F[1]eq+1957' |

Voir perlrun(1) pour les options de la ligne de commande. Pour des scripts Perl plus fous, le site http://perlgolf.sourceforge.net peut être intéressant.


8.6.21 Récupérer du texte ou une archive de liste de diffusion à partir d'une page web

Les commandes suivantes récupèrent une page web dans un fichier texte. Très utile pour copier des configurations depuis le Web.

     $ lynx -dump http://www.remote-site.com/help-info.html >textf
     ile

links et w3m peuvent aussi être utilisés, avec de légères différences dans le rendu.

S'il s'agit d'une archive de liste de diffusion, utilisez munpack pour obtenir les contenus MIME à partir du texte.


8.6.22 Imprimer joliment une page web

Les commandes suivantes vont lire une page web et l'imprimer sur une imprimante/dans un fichier PostScript.

     $ apt-get install html2ps
     $ html2ps URL | lpr

Voir lpr/lpd, Section 3.6.1. Regardez aussi a2ps et mpage pour créer des fichiers PostScript.


8.6.23 Imprimer joliment une page de manuel

Les commandes suivantes impriment une page de manuel sur une imprimante/un fichier PostScript.

     $ man -Tps some-man-page | lpr
     $ man -Tps some-man-page | mpage -2 | lpr

8.6.24 Joindre deux fichiers PostScript ou PDF

Vous pouvez joindre deux fichiers PostScript ou PDF.

     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \
       -sOutputFile=bla.ps -f foo1.ps foo2.ps
     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
       -sOutputFile=bla.pdf -f foo1.pdf foo2.pdf

8.6.25 Mesurer la durée d'une commande

Affiche le temps pris par un processus.

     # time commande >/dev/null
     real    0m0.035s       # durée sur l'horloge (temps réel écoulé)
     user    0m0.000s       # durée en mode utilisateur
     sys     0m0.020s       # durée en mode noyau

8.6.26 Commande nice

Utilisez nice (du paquet GNU shellutils) pour régler la « gentillesse » (valeur nice) d'une commande lors de son exécution. renice (paquet bsdutils) ou top peuvent changer la valeur nice d'un processus. Le processus le plus lent (priorité la plus basse) aura une valeur de 19 ; les valeurs négatives sont not-nice (NdT : litt. pas gentilles), une valeur de -20 étant donnée au processus le plus rapide (priorité la plus haute). Seul le superutilisateur peut donner des valeurs nice négatives.

     # nice  -19 top                                         # très gentil
     # nice --20 cdrecord -v -eject speed=2 dev=0,0 disk.img # très rapide

Parfois, une valeur extrême de nice fait plus de mal que de bien au système. Utilisez cette commande en faisant attention.


8.6.27 Programmer des activités (cron, at)

Utilisez cron et at pour programmer des tâches sous Linux. Consultez at(1), crontab(5), crontab(8).

Exécutez la commande crontab -e pour créer ou éditer un fichier crontab pour programmer des événements régulièrement. Exemple de fichier crontab :

     # utilise /bin/sh pour exécuter les commandes, quoi que dise /etc/passwd
     SHELL=/bin/sh
     # envoie un courrier électronique à Paul contenant tous les résultats,
     # quelle que soit la personne à qui appartienne la crontab
     MAILTO=paul
     # Minute Heure JourDuMois Mois JourDeLaSemaine commande
     # est exécuté à 00:05 chaque jour
     5  0  *  * *   $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
     # est exécuté à 14:15 le 1e de chaque mois -- le résultat est envoyé à Paul
     # par courrier électronique
     15 14 1  * *   $HOME/bin/monthly
     # est exécuté à 22:00 chaque jour de la semaine(1-5), ennuie Joe.
     # % pour une nouvelle ligne, dernier % pour cc:
     0 22 *   * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%%
     23 */2 1 2 *   echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1"
     5  4 *   * sun echo "run at 04:05 every sunday"
     # est exécuté à 03:40 le premier lundi de chaque mois
     40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && command -args

Exécutez la commande at pour programmer une tâche unique :

     $ echo 'command -args'| at 3:40 monday

8.6.28 Changement de console avec screen

Le programme screen permet d'exécuter plusieurs terminaux virtuels avec un shell intéractif sur chacun, sur un unique terminal physique ou émulateur de terminal. Même si vous utilisez les consoles virtuelles de Linux ou plusieurs fenêtres xterm, explorer screen vaut le coup, de par son nombre de possibilités, qui incluent


8.6.28.1 Scénario d'accès distant

Si vous vous connectez fréquemment sur une machine Linux depuis un terminal distant ou en utilisant un terminal VT100, screen vous facilitera la vie avec la possibilité de détacher une session.

  • Supposez que vous êtes connectés via une connexion téléphonique, et que vous exécutez une session screen complexe avec des éditeurs et des programmes ouverts dans plusieurs fenêtres.

  • Vous avez alors besoin de quitter votre terminal, mais vous ne voulez pas perdre votre travail en raccrochant.

  • Tapez simplement ^A d pour détacher la session, puis déconnectez-vous. (Ou encore plus rapide, tapez ^A DD pour que screen détache la session et déconnecte lui-même.)

  • Quand vous vous connectez de nouveau, entrez la commande screen -R, et screen va automatiquement réattacher toutes les fenêtres que vous aviez ouvertes.


  • 8.6.28.2 Commandes typiques de screen

    Une fois que screen est démarré, toutes les entrées au clavier sont envoyées à la fenêtre excepté la combinaison de touches de commande, par défaut ^A. Toutes les commandes screen sont entrées en tapant ^A et une touche unique [ainsi que des paramètres]. Commandes utiles :

         ^A ?     affiche un écran d'aide (affiche les combinaisons de touches)
         ^A c     crée une nouvelle fenêtre et l'affiche
         ^A n     va à la fenêtre suivante
         ^A p     va à la fenêtre précédente
         ^A 0     va à la fenêtre numéro 0
         ^A w     affiche la liste des fenêtres
         ^A a     envoie Ctrl-A à la fenêtre courante
         ^A h     enregistre une copie de la fenêtre courante dans un fichier
         ^A H     commence/termine l'enregistrement de la fenêtre courante dans
                  un fichier
         ^A ^X    verrouille le terminal (protection par mot de passe)
         ^A d     détache la session screen du terminal
         ^A DD    détache la session screen du terminal et déconnecte
    

    Ceci est seulement un petit aperçu des possibilités de screen. S'il y a quelquechose que vous souhaiteriez que screen fasse pour vous, il y a des chances qu'il puisse ! Consultez screen(1) pour plus de détails.


    8.6.28.3 Backspace et/ou Ctrl-H dans une session screen

    Si la touche backspace et/ou Ctrl-H ne marchent plus correctement lorsque vous exécutez screen, éditez /etc/screenrc, trouvez la ligne

         bindkey -k kb stuff "\177"
    

    et commentez-la (càd, ajoutez « # » devant).


    8.6.28.4 Programme équivalent de screen pour X

    Consultez xmove. Voir xmove(1).


    8.6.29 Bases pour tester un réseau

    Installez les paquets netkit-ping, traceroute, dnsutils, ipchains (noyau 2.2) iptables (noyau 2.4), et net-tools, puis :

         $ ping yahoo.com            # teste la connexion Internet
         $ traceroute yahoo.com      # trace les paquets IP
         $ ifconfig                  # affiche la configuration de la machine
         $ route -n                  # affiche la configuration de routage
         $ dig [@dns-server.com] host.dom [{a|mx|any}] |less
               # affiche les enregistrements DNS de host.dom
               # sur dns-server.com pour un enregistrement {a|mx|any}
         $ ichains  -L -n |less      # affiche le filtre de paquets (noyau 2.2)
         $ iptables -L -n |less      # affiche le filtre de paquets (noyau 2.4)
         $ netstat -a                # recherche tous les ports ouverts
         $ netstat -l --inet         # recherche tous les ports en écoute
         $ netstat -ln --tcp         # recherche tous les ports tcp en écoute
                                       (affichage numérique)
    

    8.6.30 Vider les courriers électroniques de la file locale

    Pour vider la file locale des courriers électroniques présents :

         # exim -q    # vide les courriers électroniques en attente
         # exim -qf   # vide tous les courriers électroniques
         # exim -qff  # vide même les courriers électroniques gelés
    

    -qff est peut-être une meilleure option pour le script /etc/ppp/ip-up.d/exim. Pour Sarge, remplacez exim par exim4.


    8.6.31 Supprimer les courriers électroniques gelés de la file locale

    Pour supprimer les courriers électroniques gelés de la file locale en renvoyant un message d'erreur :

         # exim -Mg `mailq | grep frozen | awk '{ print $3 }'`
    

    Pour Sarge, remplacez exim par exim4.


    8.6.32 Redélivrer le contenu de mbox

    Vous devez redélivrer manuellement les courriels dans vos boîtes triées de votre répertoire personnel depuis le fichier /var/mail/username si votre répertoire personnel est devenu plein ou si procmail a planté. Après avoir fait de l'espace dans le répertoire personnel, lancez :

         # /etc/init.d/exim stop
         # formail -s procmail </var/mail/username
         # /etc/init.d/exim start
    

    Pour Sarge, remplacez exim par exim4.


    8.6.33 Supprimer le contenu d'un fichier

    Pour supprimer le contenu d'un fichier, par exemple un fichier de journal, n'utilisez pas rm pour effacer le fichier et créer ensuite un fichier vide, parce que le fichier peut toujours être accédé entre les commandes. Ce qui suit est une façon sûre de supprimer le contenu d'un fichier.

         $ :>file-to-be-cleared
    

    8.6.34 Fichiers fantômes

    Les commandes suivantes créent des fichiers fantômes ou vides.

         $ dd if=/dev/zero    of=filename bs=1k count=5 # 5Ko sans contenu
         $ dd if=/dev/urandom of=filename bs=1M count=7 # 7Mo de contenu aléatoire
         $ touch filename # crée un fichier de taille 0
                            (si le fichier existe, met à jour mtime)
    

    Par exemple, les commandes suivantes exécutées depuis le shell de la disquette de dméarrage Debian efface tout le contenu du disque dur /dev/hda.

         # dd if=/dev/urandom of=/dev/hda ; dd if=/dev/zero of=/dev/hda
    

    8.6.35 chroot

    Le programme chroot, chroot(8), nous permet de lancer plusieurs environnements GNU/Linux simultanément sur un seul système sans redémarrer.

    On peut aussi lancer un programme demandant des ressources comme apt-get ou dselect dans le chroot d'une machine rapide. On monte alors par NFS le système de fichiers d'une machine auxiliaire lente sur la machine rapide, en lecture/écriture, le point de montage étant le répertoire chroot.


    8.6.35.1 Exécuter plusieurs versions de Debian avec chroot

    Un environnment chroot Debian peut aisément être créé par la commande debootstrap de Woody. Par exemple, pour créer un chroot Sid sur /sid-root avec une connexion Internet rapide :

         main # cd / ; mkdir /sid-root
         main # debootstrap sid /sid-root http://ftp.debian.org/debian/
         ... regardez le système se télécharger
         main # echo "proc-sid /sid-root/proc proc none 0 0" >> /etc/fstab
         main # mount proc-sid /sid-root/proc -t proc
         main # cp /etc/hosts /sid-root/etc/hosts
         main # chroot /sid-root /bin/bash
         chroot # cd /dev; /sbin/MAKEDEV generic ; cd -
         chroot # apt-setup # set-up /etc/apt/sources.list
         chroot # vi /etc/apt/sources.list # mettre la source sur unstable
         chroot # dselect  # ou aptitude, installez mc et vim :-)
    

    A ce point, vous devriez avoir un système Debian complètement fonctionnel, avec lequel vous pouvez jouer sans avoir peur de toucher votre installation Debian principale.

    Cette astuce avec debootstrap peut aussi être utilisée pour installer Debian sur un système dans utiliser le disque d'installation Debian mais celui d'une autre distribution GNU/Linux. Voir http://www.debian.org/releases/stable/i386/apcs04.


    8.6.35.2 Configurer login pour chroot

    Taper chroot /sid-root /bin/bash est facile, mais cela garde toutes les variables d'environnement, ce que vous pouvez ne pas vouloir, et apporte d'autres problèmes. Une meilleure approche est d'exécuter un autre processus login sur un terminal virtuel différent où vous pouvez vous connecter au chroot directement.

    Puisque, sur les systèmes Debian par défaut, les consoles Linux sont de tty1 à tty6 et X Window System sur tty7, configurons une console chroot sur tty8. Après avoir créé un système chroot comme décrit dans Exécuter plusieurs versions de Debian avec chroot, Section 8.6.35.1, exécutez ce qui suit en root sur le système principal :

         main # echo "8:23:respawn:/usr/sbin/chroot /sid-root "\
                "/sbin/getty 38400 tty8"  >> /etc/inittab
         main # init q    # reload init
    

    8.6.35.3 Configurer X pour chroot

    Vous voulez exécuter les dernières version de X et GNOME en toute sécurité dans votre chroot ? C'est possible ! L'exemple suivant permet d'exécuter GDM sur le terminal virtuel vt9.

    D'abord, installez un système chroot comme décrit dans Exécuter plusieurs versions de Debian avec chroot, Section 8.6.35.1. Avec le root du système principal, copiez les fichiers de configration importants vers le système chroot.

         main # cp /etc/X11/XF86Config-4 /sid-root/etc/X11/XF86Config-4
         main # chroot /sid-root # ou utilisez la console chroot
         chroot # cd /dev; /sbin/MAKEDEV generic ; cd -
         chroot # apt-get install gdm gnome x-window-system
         chroot # vi /etc/gdm/gdm.conf # faites s/vt7/vt9 dans la section [servers]
         chroot # /etc/init.d/gdm start
    

    Ici, /etc/gdm/gdm.conf a été édité pour que la console virtuelle de lancement soit vt9 au lieu de vt7.

    Maintenant vous pouvez facilement passer de l'environnement X du chroot à celui du système principal simplement en changeant de terminal virtuel, par exemple en utilisant Ctrl-Alt-F7 et Ctrl-Alt-F9. Amusez-vous bien !

    [FIXME] Ajouter un commentaire et un lien vers le script gdm du chroot.


    8.6.35.4 Exécuter d'autres distributions avec chroot

    Un environnement chroot avec une autre distribution peut facilement être créé. Vous installez un système sur une partition séparée en utilisant son installateur. Si sa partition racine est /dev/hda9 :

         main # cd / ; mkdir /other-dist
         main # mount -t ext3 /dev/hda9 /other-dist
         main # chroot /other-dist /bin/bash
    

    La suite est similaire à Exécuter plusieurs versions de Debian avec chroot, Section 8.6.35.1, Configurer login pour chroot, Section 8.6.35.2, et Configurer X pour chroot, Section 8.6.35.3.


    8.6.35.5 Compiler un paquet avec chroot

    Il existe un paquet chroot plus spécialisé, pbuilder, qui construit un système chroot et compile un paquet dans le chroot. C'est un système idéal pour vérifier que les dépendances de compilation d'un paquet sont correctes, et pour être sûr que des dépendances non nécessaires ou fausses n'existent dans le paquet résultant.


    8.6.36 Comment vérifier les liens durs

    Vous pouvez vérifier si deux fichiers sont le même avec deux liens durs avec :

         $ ls -li file1 file2
    

    8.6.37 Monter une image de disque dur

    Si file.img contient l'image d'un disque dur et que le disque dur original avait une configuration xxxx = (octets/secteur) * (secteurs/cylindres), les commandes suivantes vont le monter sur /mnt :

         # mount -o loop,offset=xxxx file.img /mnt
    

    Notez que la plupart des disques durs ont 512 octets/secteur.


    8.6.38 Samba

    Bases pour récupérer des fichiers depuis Windows :

         # mount -t smbfs -o username=myname,uid=my_uid,gid=my_gid \
                 //server/share /mnt/smb  # monte un répertoire Windows sous Linux
         # smbmount //server/share /mnt/smb \
                 -o "username=myname,uid=my_uid,gid=my_gid"
         # smbclient -L 192.168.1.2 # list the shares on a computer
    

    Les voisins de Samba peuvent être trouvés depuis Linux :

         # smbclient -N -L ip_address_of_your_PC | less
         # nmblookup -T "*"
    

    8.6.39 Utilitaires pour les systèmes de fichiers étrangers

    Un grand nombre de systèmes de fichiers est supporté par le noyau Linux, et peuvent être utilisés simplement en montant les périphériques les contenant. Pour certains systèmes de fichiers, il existe aussi des outils spécifiques permettant de les utiliser sans les monter. Ces opérations sont accomplies par des programmes en espace utilisateur, et donc le support du système de fichiers par le noyau n'est pas nécessaire.

    Pour créer et vérifier un système de fichiers FAT MSDOS, le paquet dosfstools est utile.


    8.7 Fautes courantes à éviter

    Voici quelques exemples d'actions dangereuses. Les aspects négatifs seront amplifiés si vous utilisez le compte root.


    8.7.1 rm -rf .*

    Dans rm -rf .*, ".*" est remplacé et contient "." and "..", ce qui, si vous en avez les privilèges, supprime aussi tous les répertoires à côté du répertoire courant.


    8.7.2 rm /etc/passwd

    La perte de fichiers importants comme /etc/passwd par stupidité est dur. Le système Debian en effectue des sauvegardes régulières dans /var/backups/. Lorsque vous restaurez ces fichiers, vous devez manuellement configurer les permissions.

         # cp /var/backups/passwd /etc/passwd
         # chmod 644 /etc/passwd
    

    Voir aussi Récupérer les données de sélection des paquets, Section 6.3.4.


    [ précédent ] [ Table des matières ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ suivant ]


    Guide de référence pour Debian

    CVS, jeu 18 jan 2007 11:52:23 UTC

    Osamu Aoki osamu#at#debian.org
    Traduction en Français : Guillaume Erbs gerbs#at#free.fr
    Auteurs, Section A.1