Chapitre 1. Didacticiels GNU/Linux

Table des matières

1.1. Bases pour la console
1.1.1. L’invite de l’interpréteur de commandes
1.1.2. The shell prompt under GUI
1.1.3. Compte de l’administrateur (root)
1.1.4. Invite de l’interpréteur de commandes pour l’administrateur
1.1.5. Outils graphiques d’administration du système
1.1.6. Consoles virtuelles
1.1.7. Comment quitter l’invite de l’interpréteur de commandes
1.1.8. Comment arrêter le système
1.1.9. Récupérer une console propre
1.1.10. Suggestions de paquets supplémentaires pour le débutant
1.1.11. Compte pour un utilisateur supplémentaire
1.1.12. Configuration de sudo
1.1.13. À vous de jouer
1.2. Système de fichiers de type UNIX
1.2.1. Bases concernant les fichiers UNIX
1.2.2. Fonctionnement interne du système de fichiers
1.2.3. Permissions du système de fichiers
1.2.4. Contrôle des permissions pour les fichiers nouvellement créés : umask
1.2.5. Permissions pour les groupes d’utilisateurs (group)
1.2.6. Horodatage
1.2.7. Liens
1.2.8. Tubes nommés (FIFO)
1.2.9. Sockets
1.2.10. Fichiers de périphériques
1.2.11. Fichiers spéciaux de périphériques
1.2.12. procfs et sysfs
1.2.13. tmpfs
1.3. Midnight Commander (MC)
1.3.1. Personnalisation de MC
1.3.2. Démarrer MC
1.3.3. Gestionnaire de fichiers de MC
1.3.4. Astuces de la ligne de commandes dans MC
1.3.5. Éditeur interne de MC
1.3.6. Visualisateur interne de MC
1.3.7. Possibilités de démarrage automatique de MC
1.3.8. Virtual filesystem of MC
1.4. L’environnement élémentaire de travail de type UNIX
1.4.1. L’interpréteur de commandes de connexion
1.4.2. Personnaliser bash
1.4.3. Combinaisons particulières de touches
1.4.4. Mouse operations
1.4.5. Le visualisateur de fichiers
1.4.6. L’éditeur de texte
1.4.7. Définir un éditeur de texte par défaut
1.4.8. Using vim
1.4.9. Enregistrer les actions de l’interpréteur de commandes
1.4.10. Commandes UNIX de base
1.5. La commande simple de l’interpréteur de commandes
1.5.1. Exécution d’une commande et variables d’environnement
1.5.2. La variable « $LANG »
1.5.3. La variable « $PATH »
1.5.4. La variable « $HOME »
1.5.5. Options de la ligne de commandes
1.5.6. Motifs génériques (« glob ») de l’interpréteur de commandes
1.5.7. Valeur de retour d’une commande
1.5.8. Séquences de commandes typiques et redirection de l’interpréteur de commandes
1.5.9. Alias de commande
1.6. Traitement des données textuelles à la UNIX
1.6.1. Outils de traitement de texte d’UNIX
1.6.2. Expressions rationnelles
1.6.3. Expressions de remplacement
1.6.4. Substitution globale avec des expressions rationnelles
1.6.5. Extraire des données d’un tableau contenu dans un fichier texte
1.6.6. Bouts de scripts pour les tubes

Je pense qu’apprendre un système d’exploitation est comme apprendre une nouvelle langue étrangère. Bien que les livres de didacticiels et de documentation soient utiles, vous devrez pratiquer vous-même. Pour vous aider à vous lancer en douceur, je vais développer quelques points fondamentaux.

La puissance de la conception de Debian GNU/Linux vient du système d’exploitation UNIX, c’est-à-dire un système d’exploitation multi-utilisateurs, multi-tâches. Vous devrez apprendre à tirer parti de la puissance de ces fonctionnalités et des similitudes entre UNIX et GNU/Linux.

N’écartez pas des textes orientés UNIX en ne vous reposant que sur les textes GNU/Linux, cela vous priverait de beaucoup d’informations utiles.

[Note] Note

Si vous avez utilisé pendant un certain temps des systèmes ressemblant à UNIX avec des outils en ligne de commande, vous connaissez sans doute tout ce que j’explique ici. Vous pourrez utiliser ce document pour actualiser vos connaissances.

Upon starting the system, you are presented with the character based login screen if you did not install any GUI environment such as GNOME or KDE desktop system. Suppose your hostname is foo, the login prompt looks as follows.

If you installed a GUI environment, then you can still get to the character based login prompt by Ctrl-Alt-F3, and you can return to the GUI environment via Ctrl-Alt-F2 (see Section 1.1.6, « Consoles virtuelles » below for more).

foo login:

À l’invite d’identification, entrez votre nom d’utilisateur, par exemple pingouin, et pressez la touche Entrée, entrez ensuite votre mot de passe et pressez de nouveau la touche Entrée.

[Note] Note

Conformément à la tradition UNIX, l’identifiant de l’utilisateur et le mot de passe sur un système Debian sont sensibles à la casse. L’identifiant de l’utilisateur est habituellement choisi uniquement en minuscules. Le premier compte d’utilisateur est normalement créé lors de l’installation. Des comptes d’utilisateurs supplémentaires peuvent être créés avec la commande adduser(8) par l’administrateur (root).

Le système démarre avec le message de bienvenue qui se trouve dans « /etc/motd » (Message du jour : « Message Of The Day ») et présente une invite de commande comme :

Debian GNU/Linux 11 foo tty1

foo login: penguin
Password:
Linux foo 5.10.0-6-amd64 #1 SMP Debian 5.10.28-1 (2021-04-09) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu May 13 08:47:13 JST 2021 on tty1
foo:~$

Vous êtes maintenant sous l’interpréteur de commandes (« shell »). Le shell interprète vos commandes.

If you installed a GUI environment during the installation, you are presented with the graphical login screen upon starting your system. You type your username and your password to login to the non-privileged user account. Use tab to navigate between username and password, or use the primary click of the mouse.

You can gain the shell prompt under GUI environment by starting a x-terminal-emulator program such as gnome-terminal(1), rxvt(1) or xterm(1). Under the GNOME Desktop environment, press SUPER-key (Windows-key) and typing in "terminal" to the search prompt does the trick.

Sous d’autres environnements de bureau (comme fluxbox), il peut ne pas y avoir de point d’accès évident au menu. Si cela se produit, essayez simplement de faire un clic-droit sur le fond d’écran de l’environnement de bureau en espérant voir apparaître un menu.

Le compte de l’administrateur (root) est encore appelé superutilisateur ou utilisateur privilégié. Depuis ce compte, vous pouvez effectuer les opérations d’administration du système suivantes :

  • lire, écrire et effacer n’importe quel fichier du système quelles que soient ses permissions ;

  • Défini l'appartenance et les permissions de n’importe quel fichier du système

  • définir le mot de passe de n’importe quel utilisateur non-privilégié du système ;

  • vous connecter à n’importe quel compte sans mot de passe.

La puissance illimitée du compte de l’administrateur fait que vous devez être attentif et responsable lorsque vous l’utilisez.

[Avertissement] Avertissement

Ne donnez jamais le mot de passe de l’administrateur à d’autres personnes.

[Note] Note

Les permissions d’un fichier (y compris les fichiers de périphériques tels que les CD-ROM ou autres, qui ne sont que des fichiers parmi d’autres pour le système Debian) peuvent le rendre inutilisable ou inaccessible à des utilisateurs autres que l’administrateur. Bien que l’utilisation du compte de l’administrateur soit un moyen rapide de test dans une telle situation, sa résolution devra être effectuée en définissant correctement les droits de fichiers et les membres des groupes d’utilisateurs (consultez Section 1.2.3, « Permissions du système de fichiers »).

When your desktop menu does not start GUI system administration tools automatically with the appropriate privilege, you can start them from the root shell prompt of the terminal emulator, such as gnome-terminal(1), rxvt(1), or xterm(1). See Section 1.1.4, « Invite de l’interpréteur de commandes pour l’administrateur » and Section 7.8, « X server connection ».

[Avertissement] Avertissement

Never start the GUI display/session manager under the root account by typing in root to the prompt of the display manager such as gdm3(1).

Ne jamais faire tourner de programme distant non sûrs avec une interface graphique sous X Window lorsque des informations critiques sont affichées parce que votre écran X peut être espionné.

Il y a, dans le système Debian par défaut, six consoles commutables en mode caractères de type VT100 disponibles pour lancer directement l’interpréteur de commandes sur la machine Linux. À moins que vous ne disposiez d’un environnement graphique, vous pouvez basculer entre les consoles virtuelles en pressant la touche Alt de gauche et, simultanément, l’une des touches F1 à F6. Chaque console en mode caractères permet de se connecter de manière indépendante à un compte et offre un environnement multi-utilisateurs. Cet environnement multi-utilisateurs est une fonctionnalité intéressante d’UNIX, très vite, on ne peut plus s’en passer.

If you are in the GUI environment, you gain access to the character console 3 by pressing Ctrl-Alt-F3 key, i.e., the left-Ctrl-key, the left-Alt-key, and the F3-key are pressed together. You can get back to the GUI environment, normally running on the virtual console 2, by pressing Alt-F2.

You can alternatively change to another virtual console, e.g. to the console 3, from the commandline.

# chvt 3

Comme tout autre système d’exploitation moderne où les opérations sur les fichiers mettent en œuvre un cache de données en mémoire afin d’améliorer les performances, le système Debian demande que l’on exécute une procédure d’arrêt adaptée avant que le système ne puisse être mis hors tension. Cela permet de maintenir l’intégrité des fichiers, en forçant l’écriture sur disque de toutes les informations conservées en mémoire. Si un logiciel de contrôle de l’alimentation est disponible, la procédure d’arrêt coupera automatiquement l’alimentation du système. (Sinon, vous devrez presser le bouton d’alimentation pendant quelques secondes une fois la procédure d’arrêt terminée).

Dans le mode normal multi-utilisateurs, vous pouvez arrêter le système depuis la ligne de commandes :

# shutdown -h now

Dans le mode normal mono-utilisateur, vous pouvez arrêter le système depuis la ligne de commandes :

# poweroff -i -f

Consultez Section 6.3.8, « Comment arrêter le système distant par SSH ».

Bien que même une installation minimale du système Debian sans aucune tâche d’environnement de bureau fournisse les fonctionnalités UNIX de base, c’est une bonne idée pour les débutants d’installer pour commencer quelques paquets de ligne de commandes ou de terminal en mode caractères basé sur « curses » comme mc et vim avec apt-get(8) en utilisant les commandes suivantes :

# apt-get update
 ...
# apt-get install mc vim sudo aptitude
 ...

Si vous avez déjà installé ces paquets, aucun nouveau paquet ne sera installé.


Ce peut être une bonne idée de lire quelques documentations.


Vous pouvez installer quelques-uns de ces paquets en passant les commandes suivantes :

# apt-get install package_name

Pour une station de travail typique avec un seul utilisateur tel que le système de bureau Debian sur un PC de bureau, il est habituel de mettre en œuvre une configuration simple de sudo(8) comme suit afin que l’utilisateur non privilégié, par exemple pingouin, puisse obtenir les privilèges d’administration avec simplement son mot de passe personnel et non avec le mot de passe de l’administrateur :

# echo "penguin  ALL=(ALL) ALL" >> /etc/sudoers

Il est aussi habituel, en remplacement, de faire comme suit afin que l’utilisateur non privilégié, par exemple pingouin, puisse obtenir les privilèges d’administration sans aucun mot de passe personnel.

# echo "penguin  ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

Cette astuce ne doit être utilisée qu’avec une station de travail mono-utilisateur que vous administrez et dont vous êtes le seul utilisateur.

[Avertissement] Avertissement

Ne configurez pas de cette manière les utilisateurs normaux d’une station de travail multi-utilisateurs parce que cela serait très grave pour la sécurité du système.

[Attention] Attention

Le mot de passe et le compte du pingouin de l’exemple précédent doivent bénéficier de la même protection que le mot de passe et le compte de l’administrateur.

Le privilège d’administration, dans ce contexte, appartient à quelqu’un autorisé à effectuer les tâches d’administration du système sur la station de travail. Ne jamais donner un tel privilège à un responsable du département administratif de votre entreprise ni à votre patron, à moins qu’ils n’y soient autorisés et en soient capables.

[Note] Note

Pour donner un accès privilégié à certains périphériques et certains fichiers, vous devriez envisager l’utilisation d’un groupe donnant un accès limité plutôt que d’utiliser le privilège de root par l’intermédiaire de sudo(8).

Avec une configuration plus approfondie et prudente, sudo(8) peut permettre à d’autres utilisateurs d’obtenir des privilèges limités d’administration sur un système partagé sans partager le mot de passe de l’administrateur. Cela peut améliorer la confiance sur les machines ayant plusieurs administrateurs de manière à ce que vous puissiez dire qui a fait quoi. D’un autre côté, vous ne devriez pas confier de tels privilèges à quelqu’un d’autre.

Avec GNU/Linux et d’autres systèmes d’exploitation semblables à UNIX, les fichiers sont organisés en répertoires. Tous les fichiers et les répertoires sont disposés sous forme d’une grosse arborescence ancrée sur « / ». On l’appelle un arbre parce que si vous dessinez le système de fichiers, il ressemble à un arbre qui se trouverait disposé la tête en bas.

Ces fichiers et répertoires peuvent être répartis sur plusieurs périphériques. La commande mount(8) sert à attacher les systèmes de fichiers se trouvant sur certains périphériques à la grosse arborescence des fichiers. À l’opposé, la commande umount(8) les détachera de nouveau. Avec les noyaux Linux récents, mount(8) avec certaines options peut lier une partie d’une arborescence de fichiers à un autre emplacement ou peut monter un système de fichiers de manière partagée, privée, esclave ou « non-liable ». Vous trouverez les options de montage prises en compte par chaque système de fichiers dans « /usr/share/doc/linux-doc-*/Documentation/filesystems/ ».

Les répertoires d’un système UNIX sont appelés dossiers sur d’autres systèmes. Vous remarquez aussi qu’il n’y a, sur aucun système UNIX, de concept de lecteur tel que « A: ». Il y a un système de fichiers qui comprend tout. C’est un gros avantage comparé à Windows.

Voici les bases des fichiers UNIX :

[Note] Note

Bien que vous puissiez utiliser la plupart des lettres ou symboles dans un nom de fichier, c’est en pratique un mauvaise idée de le faire. Il est préférable d’éviter tous les caractères qui ont une signification particulière sur la ligne de commandes, comme les espaces, tabulations, sauts de ligne, et autres caractères spéciaux : { } ( ) [ ] ' ` " \ / > < | ; ! # & ^ * % @ $. Si vous voulez séparer des mots dans un nom, de bons choix sont le point, le tiret et le tiret souligné. Vous pouvez aussi mettre une majuscule en tête de chaque mot « CommeCeci ». Les utilisateurs Linux expérimentés on tendance à aussi à éviter les espaces dans les noms de fichiers.

[Note] Note

Le mot « root » signifie soit « utilisateur root », soit « répertoire root » Le contexte de son utilisation devrait permettre de les distinguer.

[Note] Note

Le mot chemin (« path ») n’est pas utilisé que pour les noms de fichiers entièrement qualifiés comme ci-dessus mais aussi pour le chemin de recherche des commandes. La signification voulue est habituellement claire selon le contexte.

Les meilleures façons de faire en ce qui concerne la hiérarchie des fichiers sont détaillées dans la « norme de hiérarchie du système de fichiers » (« Filesystem Hierarchy Standard ») (« /usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz » et hier(7)). Vous devriez, pour commencer, mémoriser les éléments suivants :


En suivant la tradition UNIX, le système Debian GNU/Linux fournit un système de fichiers où les données physiques se trouvent sur des disques durs et d’autres périphériques de stockage et où les interaction avec les périphériques physiques tels que les écrans de console et les consoles distantes connectées en séries sont représentées de manière unifiée dans « /dev/ ».

Chaque fichier, répertoire, tube nommé (une manière pour les programmes de partager des données) ou périphérique physique sur un système Debian GNU/Linux possède une structure de données appelée inœud (« inode ») qui décrit les attributs qui lui sont associés comme l’utilisateur qui le possède (propriétaire), le groupe auquel il appartient, l’heure de dernier accès, etc. L’idée de pouvoir presque tout représenter dans le système de fichiers était une innovation d’UNIX, et les noyaux modernes de Linux ont encore développé plus loin cette idée. À l’heure actuelle, même les informations concernant les processus qui tournent sur le système se trouvent sur le système de fichiers.

Cette représentation abstraite et unifiée des entités physiques et des processus internes est très puissante puisque cela nous permet d’utiliser la même commande pour le même type d’opération sur des périphériques complètement différents. Il est même possible de changer la manière dont fonctionne le noyau en écrivant des données dans des fichiers spéciaux liés aux processus en cours d’exécution.

[Astuce] Astuce

Si vous avez besoin de connaître la correspondance entre une arborescence de fichiers et un périphérique physique, lancez la commande mount(8) sans paramètre.

Les permissions du système de fichiers d’un système basé sur UNIX sont définies pour trois catégories d’utilisateurs :

  • l’utilisateur qui possède le fichier (u) ;

  • les autres utilisateurs du groupe à qui appartient le fichier (g) ;

  • tous les autres utilisateurs (o) dont on parle aussi en tant que « monde entier » ou « tout le monde ».

Pour les fichiers, chaque permission correspondante permet les actions suivantes :

  • la permission en lecture (r) permet à son propriétaire de voir le contenu du fichier ;

  • la permission en écriture (w) permet à son propriétaire de modifier le fichier ;

  • la permission d’exécution (x) permet à son propriétaire de lancer le fichier comme une commande.

Pour les répertoires, chaque permission correspondante permet les actions suivantes :

  • la permission en lecture (r) permet à son propriétaire d’afficher le contenu du répertoire ;

  • la permission en écriture (w) permet à son propriétaire d’ajouter ou supprimer des fichiers de ce répertoires ;

  • la permission d’exécution (x) permet à son propriétaire d’accéder aux fichiers du répertoire.

Ici, la permission en exécution sur un répertoire ne signifie pas uniquement l’autorisation de lire des fichiers dans ce répertoire mais aussi l’autorisation de voir leurs attributs, tels que leur taille et l’heure de modification.

ls(1) est utilisé pour afficher les informations de permissions (et davantage) des fichiers et répertoires. Lorsque cette commande est passée avec l’option « -l », elle affiche les informations suivantes dans l’ordre donné :

  • type de fichier (premier caractère) ;

  • autorisation d’accès au fichier (neuf caractères, constitués de trois caractères pour l’utilisateur, le groupe et « les autres », dans cet ordre) ;

  • nombre de liens physiques vers le fichier ;

  • nom de l’utilisateur propriétaire du fichier ;

  • nom du groupe à qui appartient le fichier ;

  • taille du fichier en caractères (octets) ;

  • date et heure du fichier (mtime) ;

  • nom du fichier.


chown(1) est utilisé depuis le compte de l’administrateur pour modifier le propriétaire d’un fichier. chgrp(1) est utilisé depuis le compte du propriétaire du fichier ou de l’administrateur pour changer le groupe du fichier. chmod(1) est utilisé depuis le compte du propriétaire du fichier ou de l’administrateur pour changer les droits d’accès à un fichier ou un répertoire. La syntaxe de base pour manipuler le fichier toto est la suivante :

# chown newowner foo
# chgrp newgroup foo
# chmod  [ugoa][+-=][rwxXst][,...] foo

Vous pouvez, par exemple, faire qu’une arborescence de répertoires soit la propriété de l’utilisateur toto et partagée par le groupe titi en faisant ce qui suit :

# cd /some/location/
# chown -R foo:bar .
# chmod -R ug+rwX,o=rX .

Il existe trois bits qui donnent des permissions particulières :

  • le bit set user ID (s ou S situé à la place du x) de l’utilisateur ;

  • le bit set group ID (s ou S situé à la place du x) du groupe ;

  • le bit collant « sticky bit » (t ou T situé à la place du x) des « autres ».

Ici la sortie de « ls -l » avec ces bits est en majuscules si les bits d’exécution cachés par ces sorties ne sont pas positionnés.

Définir set user ID sur un fichier exécutable permet à un utilisateur d’exécuter les fichiers avec l’identifiant du propriétaire du fichier (par exemple root). De la même manière, définir set group ID sur un fichier exécutable permet d’exécuter le fichier avec l’identifiant de groupe du fichier (par exemple root). Parce que ces positionnements de bits peuvent créer des risques de sécurité, il ne faut les activer qu’avec des précautions extrêmes.

Définir set group ID sur un répertoire permet la création de fichiers à la BSD où tous les fichiers créés dans un répertoire appartiennent au groupe du répertoire.

Positionner le sticky bit d’un répertoire empêche un fichier de ce répertoire d’être supprimé par un utilisateur qui n’est pas le propriétaire du fichier. Pour sécuriser le contenu d’un fichier dans des répertoires pouvant être écrits par tout le monde tels que « /tmp » ou dans des répertoires pouvant être écrits par le groupe, il ne faut pas uniquement supprimer la permission du fichier en écriture mais aussi positionner le sticky bit sur le répertoire. Sinon, le fichier pourra être supprimé et un nouveau fichier créé avec le même nom par un utilisateur quelconque ayant accès en écriture au répertoire.

Voici quelques exemples intéressants de permissions de fichiers.

$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4
crw------T 1 root root   108, 0 Oct 16 20:57 /dev/ppp
-rw-r--r-- 1 root root     2761 Aug 30 10:38 /etc/passwd
-rw-r----- 1 root shadow   1695 Aug 30 10:38 /etc/shadow
-rwsr-xr-x 1 root root   973824 Sep 23 20:04 /usr/sbin/exim4
$ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
drwxrwxrwt 14 root root  20480 Oct 16 21:25 /tmp
drwxrwsr-x 10 root staff  4096 Sep 29 22:50 /usr/local
drwxr-xr-x 10 root root   4096 Oct 11 00:28 /usr/src
drwxrwsr-x  2 root mail   4096 Oct 15 21:40 /var/mail
drwxrwxrwt  3 root root   4096 Oct 16 21:20 /var/tmp

Il existe aussi un mode numérique pour décrire les permissions des fichiers avec chmod(1). Ce mode numérique utilise des nombres en base 8 (radix=8) codés sur 3 ou 4 chiffres.


Cela peut sembler compliqué mais c’est en fait assez simple. Si vous regardez les quelques premières colonnes (2-10) de la sortie de la commande « ls -l » et que vous lisez en représentation binaire (base 2) les permissions des fichiers (le « - » représentant « 0 » et « rwx » représentant « 1 »), les trois derniers chiffres de la valeur numérique du mode devraient vous donner la représentation des permissions du fichier en octal (base 8).

Essayez, par exemple, ce qui suit :

$ touch foo bar
$ chmod u=rw,go=r foo
$ chmod 644 bar
$ ls -l foo bar
-rw-r--r-- 1 penguin penguin 0 Oct 16 21:39 bar
-rw-r--r-- 1 penguin penguin 0 Oct 16 21:35 foo
[Astuce] Astuce

Si vous avez besoin d’accéder aux informations affichées par « ls -l » depuis un script de l’interpréteur de commandes, vous devrez utiliser des commandes pertinentes telles que test(1), stat(1) et readlink(1). Vous pouvez aussi utiliser les commandes internes du shell, telles que « [ » ou « test ».

Afin que des permissions attribuées à un groupe soient appliquées à un utilisateur particulier, il faut que cet utilisateur soit déclaré membre du groupe à l’aide de « sudo vigr » pour /etc/group ou « sudo vigr -s » pour /etc/gshadow. La nouvelle configuration du groupe n’est effective qu’après une [re]connexion de l’utilisateur (ou l’exécution de « exec newgrp »).

[Note] Note

Vous pouvez aussi ajouter dynamiquement des utilisateurs aux groupes durant le processus d’authentification en ajoutant la ligne « auth optional pam_group.so » au fichier « /etc/pam.d/common-auth » et en définissant « /etc/security/group.conf » (consultez Chapitre 4, Authentication and access controls).

Sous le système Debian, les périphériques ne sont qu’un autre type de fichier. Si vous avez des problèmes pour accéder à des périphériques tel qu’un CD-ROM ou une clé USB depuis le compte d’un utilisateur, il faudra rendre cet utilisateur membre du groupe concerné.

Certains groupes importants fournis par le système permettent à leurs membres l’accès à des fichiers et des périphériques particuliers sans avoir les privilèges de l’administrateur.


[Astuce] Astuce

Vous devez être membre du groupe dialout pour pouvoir reconfigurer un modem, numéroter vers n’importe où, etc. Mais si l’administrateur crée dans « /etc/ppp/peers/ » des fichiers de configuration pour des pairs de confiance, vous ne devrez appartenir qu’au groupe dip pour créer une connexion commutée (« Dialup IP ») vers ces pairs de confiance avec commandes pppd(8), pon(1) et poff(1).

Certains groupes faisant partie du système, permettent à leurs membres d’exécuter des commandes particulières sans les privilèges de l’administrateur (root).


Pour une liste complète des groupes et des utilisateurs fournis par le système, veuillez consulter une version récente du document « Utilisateurs et groupes » (« Users and Groups » se trouvant dans  /usr/share/doc/base-passwd/users-and-groups.html » qui est fourni par le paquet base-passwd.

Consultez passwd(5), group(5), shadow(5), newgrp(1), vipw(8), vigr(8) et pam_group(8) pour les commande de gestion des utilisateurs et des groupes du système.

Il existe trois types d’horodatage pour un fichier GNU/Linux.


[Note] Note

ctime n’est pas la date de création du fichier.

[Note] Note

La valeur d'atime sur GNU/Linux peut être en fait différente de celle donnée par la définition Unix historique.

  • Écraser un fichier va modifier tous les attributs mtime, ctime et atime du fichier.

  • Modifier le propriétaire ou les droits d’un fichier va changer les attributs ctime et atime du fichier.

  • La lecture d’un fichier va modifier l’attribut atime du fichier sur le système Unix d'historique.

  • La lecture d’un fichier va modifier l’attribut atime du fichier que un système GNU/Linux si son système de fichier est monté avec "strictatime".

  • Lire un fichier pour la première fois ou après un jour modifie son attribut atime sur un système GNU/Linux avec un système de fichiers monté en « relatime » (par défaut depuis Linux 2.6.30).

  • Lire un fichier ne modifie pas son attribut atime sous GNU/Linux si le système de fichiers est monté avec « noatime ».

[Note] Note

The "noatime" and "relatime" mount options are introduced to improve the filesystem read performance under the normal use cases. Simple file read operation under the "strictatime" option accompanies the time-consuming write operation to update the atime attribute. But the atime attribute is rarely used except for the mbox(5) file. See mount(8).

Utilisez la commande touch(1) pour modifier l’horodatage des fichiers existants.

For timestamps, the ls command outputs localized strings under non-English locale ("fr_FR.UTF-8").

$ LANG=C  ls -l foo
-rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
$ LANG=en_US.UTF-8  ls -l foo
-rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
$ LANG=fr_FR.UTF-8  ls -l foo
-rw-rw-r-- 1 penguin penguin 0 oct. 16 21:35 foo
[Astuce] Astuce

Consultez Section 9.3.4, « Affichage personnalisé de la date et de l’heure » pour personnaliser la sortie de « ls -l ».

Il existe deux méthodes pour associer le fichier « toto » avec un nom de fichier différent « titi » :

Consultez l’exemple suivant pour des modifications du nombre de liens et les subtiles différences dans le résultat de la commande rm.

$ umask 002
$ echo "Original Content" > foo
$ ls -li foo
1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 foo
$ ln foo bar     # hard link
$ ln -s foo baz  # symlink
$ ls -li foo bar baz
1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 bar
1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 foo
$ rm foo
$ echo "New Content" > foo
$ ls -li foo bar baz
1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 bar
1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
1450183 -rw-rw-r-- 1 penguin penguin 12 Oct 16 21:48 foo
$ cat bar
Original Content
$ cat baz
New Content

The hardlink can be made within the same filesystem and shares the same inode number which the "-i" option with ls(1) reveals.

Le lien symbolique a les permissions d’accès nominales au fichier de « rwxrwxrwx » comme il apparaît dans l’exemple ci-dessus, alors que les permissions d’accès effectives sont celles du fichier vers lequel il pointe.

[Attention] Attention

En règle générale — à moins d’avoir une très bonne raison pour cela — il faudrait s’abstenir de créer des liens physiques ou des liens symboliques compliqués. Cela peut provoquer des cauchemars lorsque la combinaison logique des liens symboliques crée une boucle dans le système de fichiers.

[Note] Note

Il est généralement préférable d’utiliser des liens symboliques plutôt que des liens physiques à moins que vous n’ayez une bonne raison d’utiliser un lien physique.

Le répertoire « . » est lié au répertoire dans lequel il apparaît, le nombre de liens de n’importe quel nouveau répertoire commence donc à 2. Le répertoire « .. » est lié au répertoire parent, le nombre de liens du répertoire augmente donc lors de l’ajout de nouveaux sous-répertoires.

Si vous venez de passer à Linux depuis Windows, la bonne conception d’un système de fichiers UNIX comparé à l’équivalent le plus proche que sont les « raccourcis Windows » deviendra vite claire. Parce qu’il est implémenté dans le système de fichiers, les applications ne voient pas de différence entre un fichier lié et son original. Dans le cas de liens physiques, il n’y a vraiment aucune différence.

Un tube nommé est un fichier qui se comporte comme un tuyau. Vous mettez quelque chose dans le tuyau et il ressort à l’autre bout. C’est donc appelé une FIFO, ou « premier entré-premier sorti » (First-In-First-Out) : la première chose que vous mettez dans le tuyau est la première chose qui ressortira à l’autre bout.

Si vous écrivez vers un tube nommé, le processus qui écrit dans le tube ne se termine pas avant que l’information ne soit lue depuis le tube. Si vous effectuez une lecture depuis un tube nommé, le processus de lecture attendra jusqu’à ce qu’il n’y ait plus rien à lire avant de se terminer. La taille d’un tube est toujours nulle — il ne stocke pas de données, ce n’est qu’un lien entre deux processus, comparable à la fonction fournie par l’opérateur « | » dans l’interpréteur de commandes. Cependant, comme ce tube a un nom, il n’est pas nécessaire que les deux processus se trouvent sur la même ligne de commandes ni même qu’ils soient lancés par le même utilisateur. Les tubes sont une innovation déterminante d’UNIX.

Essayez, par exemple, ce qui suit :

$ cd; mkfifo mypipe
$ echo "hello" >mypipe & # put into background
[1] 8022
$ ls -l mypipe
prw-rw-r-- 1 penguin penguin 0 Oct 16 21:49 mypipe
$ cat mypipe
hello
[1]+  Done                    echo "hello" >mypipe
$ ls mypipe
mypipe
$ rm mypipe

Fichiers de périphériques fait référence aux périphériques virtuels ou physiques de votre système, tels que vos disques durs, carte vidéo, écran ou clavier. Un exemple de périphérique virtuel est la console, représentée par « /dev/console »

Il y a 2 types de fichiers de périphériques :

  • périphérique en mode caractère (« character device ») :

    • permettent l’accès à un caractère à la fois

    • 1 caractère = 1 octet

    • par exemple, les claviers, les ports série, …

  • Périphériques en mode bloc (« block device ») :

    • accèdent aux données par éléments plus importants appelés blocs

    • 1 bloc > 1 octet

    • par exemple, les disques durs, …

Vous pouvez lire et écrire sur les fichiers de périphériques, cependant, le fichier peut fort bien contenir des données binaires qui peuvent être du charabia incompréhensible pour les êtres humains. Écrire des données directement dans ces fichiers est parfois utile pour déboguer des connexions matérielles. Vous pouvez, par exemple, vider un fichier texte vers le périphérique d’impression « /dev/lp0 » ou envoyer des commandes de modem vers le port série approprié « /dev/ttyS0 ». Mais, à moins que ce ne soit fait avec précautions, cela peut provoquer un désastre majeur. Soyez donc prudent.

[Note] Note

Pour l’accès normal à une imprimante, utilisez lp(1).

On affiche le numéro de nœud du périphérique en utilisant la commande ls(1) comme suit :

$ ls -l /dev/sda /dev/sr0 /dev/ttyS0 /dev/zero
brw-rw---T  1 root disk     8,  0 Oct 16 20:57 /dev/sda
brw-rw---T+ 1 root cdrom   11,  0 Oct 16 21:53 /dev/sr0
crw-rw---T  1 root dialout  4, 64 Oct 16 20:57 /dev/ttyS0
crw-rw-rw-  1 root root     1,  5 Oct 16 20:57 /dev/zero
  • « /dev/sda » a le numéro majeur de périphérique 8 et le numéro mineur de périphérique 0. Il est accessible en lecture et écriture aux utilisateurs qui appartiennent au groupe disk.

  • « /dev/sr0 » a le numéro majeur de périphérique 11 et le numéro mineur de périphérique 0. Il est accessible en lecture et écriture aux utilisateurs qui appartiennent au groupe cdrom.

  • « /dev/ttyS0 » a le numéro majeur de périphérique 4 et le numéro mineur de périphérique 64. Il est accessible en lecture et écriture aux utilisateurs qui appartiennent au groupe dialout.

  • « /dev/zero » a le numéro majeur de périphérique 1 et le numéro mineur de périphérique 5. Il est accessible en lecture et écriture à tout le monde.

Sur les systèmes Linux modernes, le système de fichiers sous « /dev/ » est automatiquement rempli par udev(7).

procfs et sysfs montés sur « /proc » et « /sys sont des pseudo-systèmes de fichiers, ils présentent dans l’espace utilisateur des structures de données internes du noyau. En d’autres termes, ces entrées sont virtuelles, ce qui signifie qu’elles présentent une fenêtre sur le fonctionnement du système d’exploitation.

Le répertoire « /proc » contient (entre autres choses), pour chacun des processus tournant sur le système, un sous-répertoire dont le nom est l’identifiant du processus (PID). Les utilitaires du système qui accèdent aux information des processus, tels que ps(1), obtiennent leurs informations depuis cette structure de répertoires.

Les répertoires qui se trouvent sous « /proc/sys/ » contiennent des interfaces permettant de modifier certains paramètres du système alors qu’il est en fonctionnement. (Vous pouvez faire la même chose au travers de la commande spécialisée sysctl(8) ou de son fichier de configuration « /etc/sysctl.conf ).

Certaines personnes paniquent lorsqu’elles remarquent un fichier particulier - « /proc/kcore » — qui est particulièrement énorme. C’est (plus ou moins) le contenu de la mémoire de votre ordinateur. Il est utilisé pour déboguer le noyau. C’est un fichier virtuel qui pointe vers la mémoire de l’ordinateur, ne vous inquiétez donc pas de sa taille.

Les répertoires sous « /sys » contiennent des structures de données exportées depuis le noyau, leurs attributs et les liens entre elles. Ils contiennent aussi des interfaces pour modifier certains paramètres du noyau pendant son fonctionnement.

Consultez « proc.txt(.gz) », « sysfs.txt(.gz) » et d’autres documents en rapport dans la documentation du noyau de Linux (« /usr/share/doc/linux-doc-*/Documentation/filesystems/* ») fournie par le paquet linux-doc-*.

Le tmpfs est un système de fichiers temporaire qui garde tous les fichiers en mémoire virtuelle. Les données du tmpfs dans le page cache en mémoire peuvent être déplacées dans l’espace d’échange sur disque en cas de besoin.

Le répertoire « /run » est monté en tmpfs au tout début du processus de démarrage. Cela permet d’écrire dessus même quand le répertoire racine « / » est monté en lecture seule. C’est le nouvel emplacement pour le stockage de fichiers en état transitoire qui remplace plusieurs emplacements décrits dans la norme de hiérarchie du système de fichiers (« Filesystem Hierarchy Standard ») version 2.3 :

  • « /var/run » → « /run »

  • « /var/lock » → « /run/lock »

  • « /dev/shm » → « /run/shm »

Consultez « tmpfs.txt(.gz) » dans la documentation du noyau de Linux (« /usr/share/doc/linux-doc-*/Documentation/filesystems/* ») fournie par le paquet linux-doc-*.

Midnight Commander (MC) est un « couteau Suisse » GNU pour la console Linux et d’autres environnements de terminaux. Il permet au débutant d’acquérir une expérience de la console pilotée par des menus, ce qui est bien plus facile à apprendre que les commandes UNIX standard.

Il vous faudra peut-être installer le paquet Midnight Commander dont le nom est « mc » en effectuant ce qui suit :

$ sudo apt-get install mc

Utilisez la commande mc(1) pour parcourir le système Debian. C’est la meilleure manière d’apprendre. Vous pouvez explorer certains emplacements intéressants en utilisant simplement les touches de curseur et la touche Entrée :

  • « /etc » et ses sous-répertoires

  • « /var/log » et ses sous-répertoires

  • « /usr/share/doc » et ses sous-répertoires

  • « /sbin » et « /bin »

L’éditeur interne possède une manière intéressante d’effectuer un copier-coller. Presser F3 marque le début de la sélection, F3 pressé une seconde fois marque la fin de la sélection et la met en surbrillance. Vous pouvez ensuite déplacer votre curseur. Si vous appuyez sur F6, la zone sélectionnée sera déplacée jusqu’à l’emplacement du curseur. Si vous pressez sur F5, la zone sélectionnée sera copiée et insérée à l’emplacement du curseur. F2 enregistrera le fichier. F10 vous permettra de quitter l’éditeur. La plupart des touches de déplacement du curseur fonctionnent de manière intuitive.

Cet éditeur peut être directement lancé avec un fichier en utilisant l’une des commandes suivantes :

$ mc -e filename_to_edit
$ mcedit filename_to_edit

Il ne s’agit pas d’un éditeur multi-fenêtres mais on peut faire usage de plusieurs consoles Linux pour obtenir le même effet. Pour copier d’une fenêtre sur l’autre, utilisez les touches Alt-Fn pour basculer d’une console virtuelle à l’autre et utilisez « File→Insert file » ou «File→Copy to file» pour déplacer une portion de fichier dans un autre fichier.

Cet éditeur interne peut être remplacé par n’importe quel autre éditeur externe de votre choix.

De nombreux programmes utilisent aussi les variables d’environnement « $EDITOR » ou « $VISUAL » afin de décider quel éditeur utiliser. Si, au départ, vous n’êtes à l’aise ni avec vim(1) ni avec nano(1), vous pouvez définir ces variable à « mcedit » en ajoutant les lignes suivantes au fichier « ~/.bashrc » :

export EDITOR=mcedit
export VISUAL=mcedit

Je recommande de les définir à « vim » si possible.

Si vous n’êtes pas à l’aise avec vim(1), vous pouvez continuer à utiliser mcedit(1) pour la plupart des tâches de maintenance du système.

Bien que MC vous permette de faire à peu près n’importe quoi, il est très important que vous appreniez à utiliser les outils en ligne de commande appelés depuis l’invite de l’interpréteur de commandes, et que vous vous familiarisiez avec un environnement de travail de type UNIX.

Since the login shell may be used by some system initialization programs, it is prudent to keep it as bash(1) and avoid switching the login shell with chsh(1).

If you want to use a different interactive shell prompt, set it from GUI terminal emulator configuration or start it from ~/.bashrc, e.g., by placing "exec /usr/bin/zsh -i -l" or "exec /usr/bin/fish -i -l" in it.


[Astuce] Astuce

Les interpréteurs de commandes POSIX partagent une syntaxe commune, mais leur comportement peut diverger, même pour des choses aussi élémentaires que les variables de l’interpréteur ou les expansions de motifs. Veuillez consulter leur documentation pour une description détaillée.

Dans ce chapitre du didacticiel, l’interpréteur interactif sera toujours bash.

Dans un environnement « de type UNIX », certaines séquences de touches ont une signification particulière. Vous remarquerez que sur une console Linux normale en mode caractères, seules les touches Ctrl et Alt situées à gauche fonctionnent de la manière voulue. Voici quelques séquences de touches dont il est intéressant de se souvenir :


[Astuce] Astuce

La fonctionnalité Ctrl-S du terminal peut être désactivée en utilisant stty(1).

Il faudrait que vous soyez compétant avec l’une des variantes des programmes Vim ou Emacs qui sont très populaires sur les systèmes semblables à UNIX.

Je pense que s’habituer aux commandes de Vim est une bonne chose, car l’éditeur Vi est toujours présent dans le monde Linux et UNIX. (En pratique, le vi d’origine ou le nouveau nvi sont des programmes que vous trouvez partout. Pour les débutants, j’ai plutôt choisi Vim parce qu’il propose de l’aide par l’intermédiaire de la touche F1 tout en restant assez semblable et plus puissant).

Si vous choisissez plutôt Emacs ou XEmacs comme éditeur, c’est aussi un bon choix évidemment, particulièrement pour la programmation. Emacs possède une pléthore d’autres fonctionnalités, y compris un lecteur de nouvelles, un éditeur de répertoires, un programme de courriel, etc. Lorsqu’il est utilisé pour programmer ou éditer des scripts en shell, il reconnaît de manière intelligente le format de ce sur quoi vous être en train de travailler et il essaie de vous aider. Certaines personnes affirment que le seul programme dont ils ont besoin sous Linux est Emacs. Dix minutes d’apprentissage d’Emacs maintenant vous économiseront des heures plus tard. Il est grandement recommandé d’avoir le manuel de GNU Emacs comme référence lors de son apprentissage.

Tous ces programmes sont habituellement accompagnés d’un programme d’apprentissage pour vous aider à les utiliser par la pratique. Lancez Vim en entrant « vim » et en pressant la touche F1. Vous devriez au moins en lire les 35 premières lignes. Suivez ensuite le cours en ligne en déplaçant le curseur sur « |tutor| » et en pressant Ctrl-].

[Note] Note

Good editors, such as Vim and Emacs, can handle UTF-8 and other exotic encoding texts correctly. It is a good idea to use the GUI environment in the UTF-8 locale and to install required programs and fonts to it. Editors have options to set the file encoding independent of the GUI environment. Please refer to their documentation on multibyte text.

The recent vim(1) starts itself in the sane "nocompatible" option and enters into the NORMAL mode.[1]


Please use the "vimtutor" program to learn vim through an interactive tutorial course.

The vim program changes its behavior to typed key strokes based on mode. Typing in key strokes to the buffer is mostly done in INSERT-mode and REPLACE-mode. Moving cursor is mostly done in NORMAL-mode. Interactive selection is done in VISUAL-mode. Typing ":" in NORMAL-mode changes its mode to Ex-mode. Ex-mode accepts commands.

[Astuce] Astuce

The Vim comes with the Netrw package. Netrw supports reading files, writing files, browsing directories over a network, and local browsing! Try Netrw with "vim ." (a period as the argument) and read its manual at ":help netrw".

For the advanced configuration of vim, see Section 9.2, « Personnaliser vim ».

Apprenons les commandes UNIX de base. J’utilise ici « UNIX » dans son sens générique. Tous les clones d’UNIX proposent habituellement des commandes équivalentes. Le système Debian ne fait pas exception. Ne vous inquiétez pas si certaines commandes ne fonctionnent pas comme vous le voudriez maintenant. Si un alias est utilisé dans le shell, la sortie correspondante sera différente. Ces exemples ne sont pas destinés à être exécutés dans cet ordre.

Essayez toutes les commandes qui suivent en utilisant un compte non privilégié :

Tableau 1.17. Liste des commandes UNIX de base

commande description
pwd afficher le nom du répertoire actuel ou de travail
whoami afficher le nom de l’utilisateur actuel.
id afficher l’identité de l’utilisateur actuel (nom, uid, gid, et groupes associés)
file toto afficher le type de fichier du fichier « toto »
type -p nom-de-commande afficher l’emplacement du fichier de la commande « nom-de-commande  »
which nom-de-commande , ,
type nom-de-commande afficher des informations sur la commande « nom-de-commande »
apropos mot-clé rechercher les commandes ayant un rapport avec « mot-clé »
man -k mot-clé , ,
whatis nom-de-commande afficher une ligne d’explication sur la commande « nom-de-commande »
man -a nom-de-commande afficher une explication sur la commande « nom-de-commande » (style UNIX)
info nom-de-commande afficher une explication assez longue de la commande « nom-de-commande » (style GNU)
ls afficher le contenu du répertoire (tous les fichiers et répertoires non cachés)
ls -a afficher le contenu du répertoire (tous les fichiers et répertoires)
ls -A afficher le contenu du répertoire (presque tous les fichiers et répertoires, par exemple sauter « .. » et « . »)
ls -la afficher tout le contenu du répertoire de façon détaillée
ls -lai afficher tout le contenu du répertoire avec les numéros d’inœuds et les informations détaillées
ls -d afficher tous les sous-répertoires du répertoire actuel
tree afficher le contenu de l’arborescence des fichiers
lsof toto afficher l’état d’ouverture du fichier « toto »
lsof -p pid afficher les fichiers ouverts par le processus de numéro : « pid »
mkdir toto créer le nouveau répertoire « toto » dans le répertoire en cours
rmdir toto supprimer le répertoire « toto » du répertoire actuel
cd toto allez au répertoire « toto » se trouvant dans le répertoire actuel ou dans le répertoire figurant dans la variable « $CDPATH »
cd / aller au répertoire racine
cd aller au répertoire personnel de l’utilisateur actuel
cd /toto aller au répertoire de chemin absolu « /toto »
cd .. aller au répertoire parent
cd ~toto aller au répertoire « foo » se trouvant dans le répertoire personnel de l’utilisateur
cd - aller au répertoire précédent
</etc/motd visualisateur afficher le contenu de « /etc/motd » en utilisant le visualisateur (« pager ») par défaut
touch fichier-poubelle créer un fichier vide « fichier-poubelle »
cp toto titi copier le fichier « toto » existant dans le nouveau fichier « titi »
rm fichier-poubelle supprimer le fichier « fichier-poubelle »
mv toto titi renommer le fichier existant « toto » avec le nouveau nom « titi » (« titi » ne doit pas exister)
mv toto titi déplacer le fichier existant « toto » vers le nouvel emplacement « titi/toto » (le répertoire « titi » doit exister)
mv toto titi/tutu déplacer le fichier existant « toto » vers un nouvel emplacement avec le nouveau nom « titi/tutu » (le répertoire « titi » doit exister mais le répertoire « titi/tutu » ne doit pas exister)
chmod 600 toto rendre le fichier « toto » non lisible et non modifiable par les autres personnes (non exécutable pour tous)
chmod 644 toto rendre un fichier existant « toto » accessible en lecture mais non modifiable par les autres personnes (non exécutable pour tous)
chmod 755 toto rendre un fichier existant « toto » accessible en lecture mais non modifiable par les autres utilisateurs (exécutable pour tous)
find . -name motif rechercher les noms de fichier contenant le « motif » de l’interpréteur de commandes (plus lent).
locate -d . motif rechercher les noms de fichiers contenant en utilisant un « motif » de l’interpréteur de commandes (plus rapide si on utilise une base de données régulièrement générée)
grep -e "motif" *.html rechercher un « motif » dans tous les fichiers se terminant par « .html » dans le répertoire actuel et tous les afficher
top afficher en plein écran les informations sur les processus, pressez « q » pour quitter
ps aux | visualisateur afficher les informations concernant tous les processus actifs en utilisant un affichage de type BSD
ps -ef | visualisateur afficher les informations concernant tous les processus actifs en utilisant un affichage de type UNIX System-V
ps aux | grep -e "[e]xim4*" afficher tous les processus faisant appel à « exim » et « exim4 »
ps axf | visualisateur afficher les informations concernant tous les processus en cours en utilisant une sortie ASCII pseudo-graphique
kill 1234 tuer le processus identifié par l’identifiant de processus : « 1234 »
gzip toto compresser « toto » afin de créer «  toto.gz » en utilisant le codage Lempel-Ziv (LZ77)
gunzip toto.gz décompresser « toto.gz » afin de créer « toto ».
bzip2 toto compresser « toto » pour créer «  toto.bz2 » en utilisant l’algorithme de compression de tri de texte Burrows-Wheeler et le codage de Huffman (meilleure compression que gzip)
bunzip2 toto.bz2 décompresser « toto.bz2 » afin de créer « toto »
xz toto compresser « toto » pour créer «  toto.xz » en utilisant l’algorithme de compression de Lempel-Ziv-Markov chain (meilleure compression que bzip2)
unxz toto.xz décompresser « toto.xz » afin de créer « toto ».
tar -xvf toto.tar extraire les fichiers de l’archive « toto.tar »
tar -xvzf toto.tar.gz extraire les fichiers d’une archive « gzippée » « toto.tar.gz »
tar -xvjf toto.tar.bz2 extraire les fichiers de l’archive « toto.tar.bz2 »
tar -xvJf toto.tar.xz extraire les fichiers de l’archive « toto.tar.xz »
tar -cvf toto.tar titi/ archiver le contenu du répertoire « titi/ » dans l’archive « toto.tar »
tar -cvzf toto.tar.gz titi/ archiver le contenu du répertoire « titi/ » dans l’archive compressée « toto.tar.gz »
tar -cvjf toto.tar.bz2 titi/ archiver le contenu du répertoire « titi/ » sans l’archive « toto.tar.bz2 »
tar -cvJf toto.tar.xz titi/ archiver le contenu du répertoire « titi/ » sans l’archive « toto.tar.xz »
zcat README.gz | visualisateur afficher le contenu du fichier compressé « README.gz » en utilisant le visualisateur (« pager ») par défaut
zcat README.gz > toto créer le fichier « toto » avec le contenu décompressé de « README.gz »
zcat README.gz >> toto ajouter le contenu décompressé de « README.gz » à la fin du fichier. (S’il n’existe pas, créez-le d’abord).

[Note] Note

UNIX a pour tradition de cacher les fichiers dont le nom commence par un « . ». Ce sont traditionnellement des fichiers qui contiennent des informations de configuration et des préférences de l’utilisateur.

Pour la commande cd, consultez builtins(7).

Le visualisateur (« pager ») par défaut d’un système Debian non personnalisé est more(1) qui ne permet pas le défilement vers l’arrière. En installant le paquet less à l’aide de la ligne de commandes « apt-get install less », less(1) deviendra le visualisateur par défaut et vous pourrez faire défiler le texte vers l’arrière à l’aide des touches de curseur.

« [ » et « ] » dans l’expression rationnelle de la commande « ps aux | grep -e "[e]xim4*"" » ci-dessus permet d’éviter une correspondance de grep avec lui-même. Le « 4* » de l’expression rationnelle signifie 0 ou plusieurs instances du caractère « 4 » et permet donc à grep de trouver la correspondance à la fois avec « exim » et « exim4 ». Bien que « * » soit utilisé dans le motif générique (« glob ») des noms de fichiers de l’interpréteur de commandes et dans l’expression rationnelle, leurs significations sont différentes. Vous pourrez apprendre les expressions rationnelles dans grep(1).

À titre d’exercice, parcourez les répertoires et jetez un coup d’œil au système en vous servant des commandes ci-dessus. Si vous avez des questions sur ces commandes de la console, veuillez consulter la page de manuel.

Essayez, par exemple, ce qui suit :

$ man man
$ man bash
$ man builtins
$ man grep
$ man ls

Il peut être un peu difficile de s’habituer au style des pages de manuel parce qu’elles sont plutôt succinctes, particulièrement les plus anciennes, celles qui sont vraiment traditionnelles. Mais une fois que vous y serez familiarisé, vous apprécierez leur concision.

Remarquez que beaucoup de commandes UNIX, y compris celles de GNU et BSD, affichent une information d’aide courte si vous les exécutez de l’une des façons suivantes (ou parfois sans paramètre) :

$ commandname --help
$ commandname -h

Vous avez maintenant une certaine sensation sur la manière d’utiliser un système Debian. Nous allons regarder plus profondément le mécanisme d’exécution des commandes sous le système Debian. J’ai ici, pour les débutants, simplifié la réalité. Consultez bash(1) pour l’explication exacte.

Une simple commande est une séquence de :

  1. assignations de variables (optionnelles) ;

  2. nom de la commande ;

  3. paramètres (optionnels) ;

  4. redirections (optionnelles : > , >> , < , <<, etc.) ;

  5. opérateurs de contrôle (optionnels : &&, || , <nouvelle ligne> , ;, &, ( , ) ).

Les valeurs de certaines variables d’environnement modifient le comportement de certaines commandes UNIX.

Les valeurs par défaut des variables d’environnement sont définies initialement par le système PAM, certaines d’entre-elles peuvent donc être réinitialisées par certains programmes d’application :

  • The PAM system such as pam_env may set environment variables by /etc/pam.conf", "/etc/environment" and "/etc/default/locale".

  • The display manager such as gdm3 may reset environment variables for GUI session by "~/.profile".

  • The user specific program initialization may reset environment variables by "~/.profile", "~/.bash_profile" and "~/.bashrc".

The default locale is defined in the "$LANG" environment variable and is configured as "LANG=xx_YY.UTF-8" by the installer or by the subsequent GUI configuration, e.g., "Settings" → "Region & Language" → "Language" / "Formats" for GNOME.

[Note] Note

I recommend you to configure the system environment just by the "$LANG" variable for now and to stay away from "$LC_*" variables unless it is absolutely needed.

La valeur complète des paramètres linguistiques indiqués par la variable « $LANG est constituée de trois parties « xx_YY.ZZZZ ».



L’exécution typique d’une commande utilise une séquence de lignes telle que la suivante :

$ echo $LANG
en_US.UTF-8
$ date -u
Wed 19 May 2021 03:18:43 PM UTC
$ LANG=fr_FR.UTF-8 date -u
mer. 19 mai 2021 15:19:02 UTC

Here, the program date(1) is executed with different locale values.

Habituellement, la plupart des exécutions de commandes ne sont pas précédées de la définition de variables d’environnement. Pour les exemples ci-dessus, vous pouvez aussi exécuter :

$ LANG=fr_FR.UTF-8
$ date -u
mer. 19 mai 2021 15:19:24 UTC
[Astuce] Astuce

When filing a bug report, running and checking the command under "en_US.UTF-8" locale is a good idea if you use non-English environment.

Pour des informations détaillées sur la configuration des paramètres linguistiques, consultez Section 8.1, « Les paramètres linguistiques (« locale ») ».

Souvent, vous voudrez utiliser une commande sur un groupe de fichiers sans avoir à tous les entrer. C’est facilité par l’utilisation des motifs génériques d’expansion du nom de fichier de l’interpréteur de commandes (glob), (on les appelle parfois jokers).


Essayez, par exemple, ce qui suit :

$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt
$ echo *.txt
1.txt 2.txt
$ echo *
1.txt 2.txt 3.c 4.h
$ echo *.[hc]
3.c 4.h
$ echo .*
. .. .5.txt ..6.txt
$ echo .*[^.]*
.5.txt ..6.txt
$ echo [^1-3]*
4.h
$ cd ..; rm -rf junk

Consultez glob(7).

[Note] Note

Contrairement à l’expansion normale du nom de fichier par l’interpréteur de commandes, le motif « * » de l’interpréteur testé par find(1) avec « -name » test etc., correspond au « . » du nom de fichier. (Nouvelle fonctionnalité POSIX).

[Note] Note

On peut modifier le comportement d’expansion de fichiers selon des motifs génériques de BASH (« glob ») avec ses options « shopt » incluses telles que « dotglob », « noglob », « nocaseglob », « nullglob », « extglob », etc. Consultez bash(1).

Essayez de retenir les idiomes suivants de l’interpréteur de commandes entrés sur une seule ligne en tant qu’extrait d’une commande de l’interpréteur.

Tableau 1.23. Idiomes des commandes de l’interpréteur

idiome de commande description
commande & exécuter la commande en arrière-plan dans le sous-shell
commande1 | commande2 la sortie standard de commande1 est passée (« piped ») à l’entrée standard de commande2. Les deux commandes peuvent tourner simultanément
commande1 2>&1 | commande2 La sortie standard et la sortie d’erreur standard de commande1 sont toutes les deux passées à l’entrée standard de commande2. Les deux commandes peuvent tourner simultanément
commande1 ; commande2 exécuter commande1 et commande2 séquentiellement
commande1 && commande2 exécuter commande1, en cas de succès, exécuter commande2 séquentiellement (retourne un succès si à la fois commande1 et commande2 ont été réussies)
commande1 || commande2 exécuter commande1, en cas d’échec, exécuter commande2 séquentiellement (retourne un succès si commande1 ou commande2 a été réussie)
commande > toto rediriger la sortir standard de commande vers le fichier toto (l’écraser)
commande 2> toto rediriger la sortie d’erreur standard de la commande vers le fichier toto (et l’écraser)
commande >> toto rediriger la sortie standard de la commande vers le fichier toto (ajouter à la fin du fichier)
commande 2>> toto rediriger la sortie d’erreur standard de la commande vers le fichier toto (ajouter à la fin du fichier)
commande > toto 2>&1 rediriger à la fois la sortie standard et l’erreur standard de la commande vers le fichier « toto »
commande < toto rediriger l’entrée standard de la commande vers le fichier toto
commande << délimiteur rediriger l’entrée standard de la commande vers les lignes suivantes jusqu’à ce que le « délimiteur » soit rencontré (ce document)
command <<- délimiteur rediriger l’entrée standard de commande vers les lignes qui suivent jusqu’à ce que le « délimiteur » soit rencontré, les caractères de tabulation de tête sont supprimés des lignes d’entrée)

Le système Debian est un système multi-tâches. Les travaux s’exécutant en arrière-plan permettent aux utilisateurs de faire tourner plusieurs programmes depuis un seul interpréteur de commandes. La gestion des processus en arrière-plan fait appel aux commandes internes de l’interpréteur : jobs, fg, bg et kill. Veuillez lire les sections de bash(1) se trouvant sous « SIGNAUX » et « CONTRÔLE DES TÂCHES » ainsi que builtins(1).

Essayez, par exemple, ce qui suit :

$ </etc/motd pager
$ pager </etc/motd
$ pager /etc/motd
$ cat /etc/motd | pager

Bien que ces 4 exemples de redirections d’interpréteur de commande affichent la même chose, le dernier exemple utilise la commande supplémentaire cat et gaspille des ressources sans raison.

L’interpréteur de commande vous permet d’ouvrir des fichiers en utilisant la commande interne exec avec un descripteur de fichier arbitraire.

$ echo Hello >foo
$ exec 3foo 4bar  # open files
$ cat <&3 >&4       # redirect stdin to 3, stdout to 4
$ exec 3<&- 4>&-    # close files
$ cat bar
Hello

Les descripteurs de fichiers 0-2 sont prédéfinis.


Dans un environnement de travail à la UNIX, le traitement du texte est effectué en passant le texte par des tubes au travers d’une chaîne d’outils standards de traitement de texte. C’est une autre innovation cruciale d’UNIX.

Il existe quelques outils standard de traitement de texte qui sont très souvent utilisés sur les systèmes « UNIX-like ».

Si vous n’êtes pas certain de ce que font exactement ces commandes veuillez utiliser la commande « man » pour vous en faire une idée par vous-même.

[Note] Note

Sort order and range expression are locale dependent. If you wish to obtain traditional behavior for a command, use C locale or C.UTF-8 locale instead of normal UTF-8 ones (see Section 8.1, « Les paramètres linguistiques (« locale ») »).

[Note] Note

Les expressions rationnelles de Perl (perlre(1)), Expressions rationnelles compatible avec Perl (PCRE) et les expressions rationnelles de Python proposées par le module re ont de nombreuses extensions courantes par rapport aux expressions rationnelles étendues ERE.

Les expressions rationnelles sont utilisées avec de nombreux outils de traitement du texte. Elles sont analogues aux motifs génériques « globs » du shell mais elles sont plus compliquées et plus puissantes.

L’expression rationnelle décrit le motif de correspondance, elle est constituée de caractères de texte et de métacaractères.

Un métacaractère est simplement un caractère ayant une signification particulière. Il en existe deux styles principaux, BRE et ERE suivant les outils de texte décrits ci-dessus.

Tableau 1.25. Métacaractères pour BRE et ERE

BRE ERE description de l’expression rationnelle
\ . [ ] ^ $ * \ . [ ] ^ $ * métacaractères courants
\+ \? \( \) \{ \} \|   métacaractères uniquement BRE, déspécifiés par « \ »
  + ? ( ) { } | métacaractères uniquement ERE, non déspécifiés par « \ »
c c correspond au non métacaractère « c »
\c \c correspond au caractère littéral « c » même si « c » est un métacaractère en lui-même
. . correspond à n’importe quel caractère y compris le saut de ligne
^ ^ position au début d’une chaîne de caractères
$ $ position à la fin d’une chaîne de caractères
\< \< position au début d’un mot
\> \> position à la fin d’un mot
[abc…] [abc…] correspond à n’importe quel caractère dans « abc… »
[^abc…] [^abc…] correspond à n’importe quel caractère sauf ceux se trouvant dans « abc… »
r* r* correspond à aucune ou plusieurs instances de l’expression rationnelle identifiée par « r »
r\+ r+ correspond à une ou plusieurs instances de l’expression rationnelle identifiée par « r »
r\? r? correspond à aucune ou une instance de l’expression rationnelle identifiée par « r »
r1\|r2 r1|r2 correspond à une instance de l’expression rationnelle identifiée par « r1 » ou« r2 ».
\(r1\|r2\) (r1|r2) correspond à une des expressions rationnelles identifiées par « r1 » ou « r2 » et la traite comme une expression rationnelle entre crochets

Une expression rationnelle d’emacs est BRE de base mais elle a été étendue afin de traiter « + » et « ? » comme des métacaractères comme dans les ERE. Il n’est dont pas nécessaire de les échapper avec « \ » dans les expressions rationnelles d’emacs.

grep(1) peut être utilisé pour effectuer de la recherche de texte en utilisant une expression rationnelle.

Essayez, par exemple, ce qui suit :

$ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL
GNU GENERAL PUBLIC LICENSE
GNU GENERAL PUBLIC LICENSE
Yoyodyne, Inc., hereby disclaims all copyright interest in the program

Pour l’expression de remplacement, certains caractères ont une signification particulière.


Pour chaîne de caractères Perl de remplacement, "$&" est utilisé au lieu de "&" et "$n" est utilisé au lieu de "\n".

Essayez, par exemple, ce qui suit :

$ echo zzz1abc2efg3hij4 | \
sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/'
zzz=1abc2efg3hij4=
$ echo zzz1abc2efg3hij4 | \
sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/'
zzzefg3hij4===1abc
$ echo zzz1abc2efg3hij4 | \
perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/'
zzzefg3hij4===1abc
$ echo zzz1abc2efg3hij4 | \
perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=$&=/'
zzz=1abc2efg3hij4=

Vous prêterez ici une attention particulière au style de l’expression rationnelle entre crochets et à la manière dont les chaînes qui correspondent sont utilisées dans le processus de remplacement du texte avec les différents outils.

Ces expressions rationnelles peuvent aussi être utilisées pour les déplacements du curseur et des actions de remplacement de texte dans certains éditeurs.

Un « back slash » (« \ ») en fin de ligne sur la ligne de commandes du shell déspécifie le saut de ligne en un caractère d’espacement et permet de poursuivre la ligne de commandes de l’interpréteur sur la ligne suivante.

Pour apprendre ces commandes, veuillez lire les pages de manuel correspondantes.

La commande ed(1) peut remplacer toutes les instances de « REGEX_SOURCE » par « TEXTE_DESTINATION dans « fichier » :

$ ed file <<EOF
,s/FROM_REGEX/TO_TEXT/g
w
q
EOF

La commande sed(1) peut remplacer toutes les instances de « REGEX_SOURCE » par « TEXTE_DESTINATION dans « fichier » :

$ sed -i -e 's/FROM_REGEX/TO_TEXT/g' file

La commande vim(1) peut remplacer toutes les instances de « REGEX_SOURCE » avec « TEXTE_DESTINATION » dans « file » en utilisant les commandes « ex(1) :

$ vim '+%s/FROM_REGEX/TO_TEXT/gc' '+w' '+q' file
[Astuce] Astuce

L’indicateur « c » dans l’exemple qui précède permet une confirmation interactive de chaque substitution.

Plusieurs fichiers ( fichier1 », « fichier2 » et « fichier3 ») peuvent être traités de manière similaire par une expression rationnelle avec vim(1) ou perl(1) :

$ vim '+argdo %s/FROM_REGEX/TO_TEXT/ge|update' '+q' file1 file2 file3
[Astuce] Astuce

L’indicateur « e » de l’exemple précédent évite qu’une erreur « No match » (pas de correspondance) ne casse un mapping :

$ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' file1 file2 file3

Dans l’exemple en perl(1) ci-dessus, le « -i » force l’édition directe de chaque fichier cible, et le « -p » induit une boucle implicite sur tous les fichiers.

[Astuce] Astuce

L’utilisation du paramètre « -i.bak » à la place de «  -i » conserve le fichier d’origine en ajoutant « .bak » à son nom de fichier. Cela permet la récupération plus facile d’erreurs lors de substitutions complexes.

[Note] Note

ed(1) et vim(1) sont BRE ; perl(1) est ERE.

Considérons un fichier texte « DPL » dans lequel les noms de certains des responsables du projet Debian d’avant 2004 et leur date d’investiture sont présentés dans un format séparés par des espaces :

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
[Astuce] Astuce

Consultez « Bref historique de Debian » pour la dernière Debian leadership history.

Awk est fréquemment utilisé pour extraire des données de ce type de fichiers.

Essayez, par exemple, ce qui suit :

$ awk '{ print $3 }' <DPL                   # month started
August
April
January
January
April
April
March
$ awk '($1=="Ian") { print }' <DPL          # DPL called Ian
Ian     Murdock   August  1993
Ian     Jackson   January 1998
$ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started
April 1996

Des interpréteurs de commandes comme Bash peuvent aussi être utilisés pour analyser ce genre de fichiers.

Essayez, par exemple, ce qui suit :

$ while read first last month year; do
    echo $month
  done <DPL
... same output as the first Awk example

Ici, la commande interne read utilise les caractères de « $IFS » (séparateurs de champs internes) pour scinder les lignes en mots.

Si vous changez « $IFS » en « : », vous pouvez analyser facilement le fichier « /etc/passwd » :

$ oldIFS="$IFS"   # save old value
$ IFS=':'
$ while read user password uid gid rest_of_line; do
    if [ "$user" = "bozo" ]; then
      echo "$user's ID is $uid"
    fi
  done < /etc/passwd
bozo's ID is 1000
$ IFS="$oldIFS"   # restore old value

(Si Awk est utilisé pour faire la même chose, utilisez « FS=':' » pour définir le séparateur de champs).

IFS est aussi utilisé par l’interpréteur de commandes pour scinder le résultat de l’expansion des paramètres, de la substitution de commande et de l’expansion arithmétique. Cela ne se produit pas pour les mots entre double ou simple apostrophes. La valeur de IFS par défaut est space, tab et newline combinés.

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

$ IFS=":,"                        # use ":" and "," as IFS
$ echo IFS=$IFS,   IFS="$IFS"     # echo is a Bash builtin
IFS=  , IFS=:,
$ date -R                         # just a command output
Sat, 23 Aug 2003 08:30:15 +0200
$ echo $(date -R)                 # sub shell --> input to main shell
Sat  23 Aug 2003 08 30 36 +0200
$ unset IFS                       # reset IFS to the default
$ echo $(date -R)
Sat, 23 Aug 2003 08:30:50 +0200

Les scripts suivants font des choses sympas avec les tubes.

Tableau 1.27. Liste de parties de scripts pour enchaîner (piping) les commandes

fragment de script (à entrer sur une seule ligne) effet de la commande
find /usr -print rechercher tous les fichiers se trouvant sous « /usr »
seq 1 100 imprimer 1 à 100
| xargs -n 1 commande lancer la commande de manière répétitive en utilisant chaque élément provenant du tube (pipe) comme paramètre
| xargs -n 1 echo scinder les éléments séparés par des espaces provenant du tube (pipe) en différentes lignes
| xargs echo concaténer les lignes provenant du tube en une seule ligne
| grep -e motif_expression_rationnelle extraire du tube les lignes contenant motif_expression_rationnelle
| grep -v -e motif_expression_rationnelle extraire du tube les lignes ne contenant pas motif_expression_rationnelle
| cut -d: -f3 - extraire du tube le troisième champ, séparé par « : » (fichier passwd, etc.)
| awk '{ print $3 }' extraire du tube le troisième champ séparé par des caractères d’espacement
| awk -F'\t' '{ print $3 }' extraire du tube le troisième champ séparé par une tabulation
| col -bx supprimer le retour arrière (backspace) et convertir les tabulations en espaces
| expand - convertir les tabulations en espaces
| sort| uniq trier et supprimer les doublons
| tr 'A-Z' 'a-z' convertir de majuscules en minuscules
| tr -d '\n' concaténer les lignes en une seule ligne
| tr -d '\r' supprimer le retour à la ligne (CR)
| sed 's/^/# /' ajouter « # » au début de chaque ligne
| sed 's/\.ext//g' supprimer « .ext »
| sed -n -e 2p afficher la seconde ligne
| head -n 2 - afficher les deux premières lignes
| tail -n 2 - afficher les deux dernières lignes

Un script de l’interpréteur d’une seule ligne peut reboucler sur de nombreux fichiers en utilisant find(1) et xargs(1) afin d’effectuer des tâches assez complexes. Consultez Section 10.1.5, « Idiomes pour la sélection de fichiers » et Section 9.4.9, « Répéter une commande en bouclant entre des fichiers ».

Lorsque l’utilisation de l’interpréteur de commandes en mode interactif devient trop compliquée, pensez à écrire un script en shell (consultez Section 12.1, « Les scripts de l’interpréteur de commande »).



[1] Even the older vim can starts in the sane "nocompatible" mode by starting it with the "-N" option.