Source de cours/fichiers.php
<?
require ("../page.inc");
require ("lessons.inc");
$currentPage = new LessonPage("fichiers");
$currentPage->setContent('');
$currentPage->addChapter('introduction', 'Introduction', '
<p>
Il existe de nombreux outils pour gérer les fichiers en mode graphique. Ici ne seront abordés que ceux en mode texte qui s\'utilisent en ligne de commande ou dans l\'<a href="scripts.php">écriture de shell-scripts</a>. Avec Linux, ceux qui sont utilisés le plus souvent font partie des logiciels <acronym lang="en" xml:lang="en" title="GNU\'s Not Unix">GNU</acronym>.
</p><p>
Seules les options les plus fréquentes de ces programmes seront présentées. Pour connaître les autres, il faudra consulter leurs <a href="references.php#ref">pages de manuel</a>.
</p><p>
Les fichiers sont organisés en une <strong>arborescence</strong> sur les systèmes GNU/Linux. On trouve des répertoires qui peuvent contenir des fichiers ou d\'autres répertoires, pouvant à leur tour répéter le même schéma.
</p><p>
Les systèmes de fichiers les plus utilisés sous GNU/Linux sont l\'<acronym lang="en" xml:lang="en" title="EXTended 2 File System">ext2fs</acronym> et l\'<acronym lang="en" xml:lang="en" title="EXTended 3 File System">ext3fs</acronym>. Le second est semblable au premier si ce n\'est qu\'il ajoute une <strong>journalisation</strong>. Ceci consiste en un enregistrement des opérations effectuées sur les fichiers, ce qui permet de corriger d\'éventuelles erreurs en cas d\'arrêt brutal du système. Ce qui suit concerne ces systèmes de fichiers (même si cela peut parfois s\'appliquer à d\'autres).
</p>
');
$currentPage->addChapter('navig', 'Naviguer dans l\'arborescence', '
<p>
Avant toute chose, une commande utile est <strong>pwd</strong>. Elle permet d\'afficher le nom du répertoire courant. En voici un exemple d\'utilisation :
</p>
<code class="terminal">
> pwd<br />
/home/Tian
</code>
<p>
Pour se déplacer à l\'intérieur de l\'arborescence, il y a <strong>cd</strong> qui est une commande intégrée à <a href="bash.php">bash</a>, le shell par défaut sur les systèmes GNU/Linux. Elle s\'utilise en lui donnant le répertoire qui doit devenir celui courant pour les actions suivantes.
</p>
<code class="terminal">
> cd répertoire<br />
</code>
<p>
Le répertoire peut être indiqué de manière <strong>absolue</strong> (par rapport à la racine en commençant le chemin par / ) ou <strong>relative</strong> (par rapport au répertoire courant). On peut aussi utiliser <strong>..</strong> qui désigne le répertoire parent d\'un répertoire ou <strong>.</strong> qui désigne le répertoire courant. Par exemple pour remonter dans l\'arborescence, on utilise :
</p>
<code class="terminal">
> cd ..<br />
</code>
<p>
Lors d\'une indication de chemin relatif, en plus du répertoire courant, cd regarde dans ceux définis dans la variable d\'environnement <strong>$CDPATH</strong>. Cette dernière contient une liste de noms de répertoires séparés par <strong>:</strong> (deux points). Si par exemple $CDPATH contient "/usr:.", la commande suivante fera de /usr/local le répertoire courant quelque soit le répertoire actuel.
</p>
<code class="terminal">
> cd local<br />
</code>
<p>
A la suite de cd on peut aussi utiliser <strong>-</strong> (tiret) qui désigne le répertoire précédent. Cela permet de revenir au répertoire précédemment visité. Mais ce ne se fait que sur un seul niveau. Une fois revenu dans le répertoire précédent, - désigne celui d\'où on vient. Il existe deux commandes intégrées pour contourner ce problème: <strong>pushd</strong> et <strong>popd</strong>.
</p><p>
pushd s\'utilise exactement comme cd pour se rendre dans un autre répertoire. La différence est que le répertoire quitté est sauvegardé dans une pile. Et, à chaque changement de répertoire, est ajouté en haut de la pile un nouveau répertoire. popd permet de passer dans le dernier répertoire enregistré par pushd. Celui-ci est alors suprrimé de la pile et un nouvel appel à popd permet d\'aller dans le répertoire qui était visité avant celui courant.
</p><p>
Ce comportement est le même que celui utilisé par la plupart des navigateurs internet qui possèdent un bouton ou une commande pour retourner à la page précédente. C\'est ce rôle que joue popd. Pour ceux qui sont habitués à l\'utilisation de cd pour changer de répertoire mais souhaiteraient bénéficier de ce comportement, il suffit de définir un <a href="bash.php#alias">alias</a> :
</p>
<code class="terminal">
> alias cd="pushd"
</code>
<p>
Un changement de répertoire en utilisant cd sauvegardera alors le répertoire quitté. popd permettra ensuite de remonter l\'historique des répertoires visités.
</p>
');
$currentPage->addChapter('manag', 'Manipulation des répertoires et fichiers', '
<p>
Le programme <strong>mkdir</strong> permet de créer un ou plusieurs répertoires. On peut, de même que pour cd lui indiquer un chemin absolu ou relatif. Il s\'utilise par exemple comme ceci :
</p>
<code class="terminal">
> mkdir mon_repertoire
</code>
<p>
Qui va créer mon_repertoire en tant que sous-répertoire de celui courant. On peut indiquer plusieurs répertoires à créer à la suite de la commande. Si un chemin comportant des répertoires est donné, tous doivent exister. Voici un exemple conduisant à une erreur :
</p>
<code class="terminal">
> mkdir mon_repertoire/sous_repertoire/sous_sous_repertoire<br />
mkdir: Ne peut pas créer le répertoire `mon_repertoire/sous_repertoire/sous_sous_repertoire\': Aucun fichier ou répertoire de ce type
</code>
<p>
En supposant que sous_repertoire n\'existe pas. Il existe toutefois une option de mkdir permettant de modifier ce comportement. Avec <strong>-p</strong> mkdir créera tous les répertoires intermédiaires nécessaires. L\'exemple précédent aurait donc ammené la création de sous_repertoire et sous_sous_repertoire.
</p><p>
Le pendant de ce programme est <strong>rmdir</strong> qui efface le ou les répertoires spécifiés en paramètres. Les répertoires indiqués doivent être vides, sinon rmdir retournera une erreur. La manière de supprimer un répertoire et tout son contenu sera évoquée plus loin dans cette partie. Un exemple d\'utilisation :
</p>
<code class="terminal">
> rmdir mon_repertoire
</code>
<p>
Ce programme a aussi une option <strong>-p</strong> qui provoque un comportement inverse à celui vu pour mkdir. Si les répertoires situés au dessus de celui qui doit être supprimé deviennent vides (c\'est à dire s\'ils ne contenaient que le répertoire en question), ils sont supprimés aussi. L\'exemple suivant se place dans le cas d\'utilisation de mkdir -p précédent.
</p>
<code class="terminal">
> rmdir -p mon_repertoire/sous_repertoire/sous_sous_repertoire
</code>
<p>
Si aucune opération n\'avait été effectuée entre temps, sous_sous_repertoire sera supprimé, mais aussi sous_repertoire et mon_repertoire car ils se trouveraient alors être vides.
</p><p>
Pour copier un fichier d\'un emplacement à un autre, c\'est le programme <strong>cp</strong> qui est utilisé. La manière la plus simple de l\'utiliser est en donnant en premier paramètre le nom du fichier, et en second le répertoire destination.
</p>
<code class="terminal">
> cp document.txt /tmp
</code>
<p>
Cet exemple copiera le fichier document.txt, situé dans le répertoire courant, dans le répertoire /tmp. Si le fichier n\'existe pas, cp affichera un message d\'erreur. Le fichier créé dans /tmp portera le même nom, à savoir document.txt.
</p><p>
On peut spécifier un nom différent de celui du fichier d\'origine pour la copie. Il suffit de l\'indiquer après l\'indication du chemin.
</p>
<code class="terminal">
> cp document.txt /tmp/copie.txt
</code>
<p>
On aura alors dans /tmp un fichier copie.txt qui sera une copie de document.txt.
</p>
<p>
Il est aussi possible de copier un répertoire ainsi que tout son contenu de manière récursive. Cela se fait à l\'aide de l\'option <strong>-R</strong> de cp.
</p>
<code class="terminal">
> cp -R /home/Tian/bin /tmp
</code>
<p>
Cet exemple copie le répertoire bin (se trouvant dans /home/Tian) et tout son contenu dans /tmp.
</p><p>
Il existe aussi l\'option <strong>-r</strong> qui réalise à peu près la même chose. Mais pour la version GNU de cp, son utilisation est déconseillée car elle ne gère pas de manière correcte les fichiers spéciaux.
</p><p>
Le programme <strong>mv</strong> s\'utilise de la même manière que cp mais il correspond à un déplacement du fichier. Cela permet de changer un fichier de répertoire comme dans cet exemple :
</p>
<code class="terminal">
> mv document.txt /tmp
</code>
<p>
Et étant donné que comme avec cp on peut donner un nom de fichier différent, c\'est mv qui est utilisé pour renommer un fichier.
</p>
<code class="terminal">
> mv document.txt humeurs.txt
</code>
<p>
Cet exemple renomme le fichier document.txt en humeurs.txt
</p><p>
Ce programme peut aussi fonctionner sur des répertoires. Pas besoin de spécifier d\'option pour obtenir un traitement récursif car c\'est ce qui est fait de toutes façons. Déplacer un répertoire sans ses sous-répertoires n\'aurait pas beaucoup de sens.
</p><p>
Enfin, pour supprimer un fichier, il y a le programme <strong>rm</strong> dont c\'est le but. Il s\'utilise en indiquant le ou les fichiers devant être effacés.
</p>
<code class="terminal">
> rm humeurs.txt
</code>
<p>
Ce programme permet aussi de supprimer un répertoire et tout ce qu\'il peut contenir ce que ne permettait pas rmdir. Ceci se fait à l\'aide de l\'option <strong>-r</strong> ou <strong>-R</strong> qui sont équivalentes dans ce cas.
</p>
<code class="terminal">
> rm -r mon_repertoire
</code>
');
$currentPage->addChapter('perm', 'Gestion des permissions', '
<p>
Les systèmes de fichiers ext2fs et ext3fs comportent des systèmes de permissions sur les fichiers et répertoires. Cela permet de les protéger contre des accès indésirables en spécifiant qui a le droit ou non de faire des opérations sur ces éléments.
</p><p>
Il y a trois notions importantes pour un fichier ou répertoire. Les indications entre parenthèses seront utilisées plus bas.
</p>
<ul>
<li>L\'utilisateur propriétaire (<acronym lang="en" xml:lang="en" title="User">u</acronym>)</li>
<li>Le groupe propriétaire (<acronym lang="en" xml:lang="en" title="Group">g</acronym>)</li>
<li>Les autres (<acronym lang="en" xml:lang="en" title="Others">o</acronym>)</li>
</ul>
<p>
L\'utilisateur propriétaire est celui qui a créé le fichier. Le programme <strong>chown</strong> permet de changer celui-ci.
</p>
<code class="terminal">
> chown Tian /tmp/index.html
</code>
<p>
Ceci permet de faire de l\'utilisateur Tian le propriétaire du fichier /tmp/index.html. Dans le cas d\'un répertoire, on peut utiliser l\'option <strong>-R</strong> pour le faire de manière récursive.
</p><p>
Les utilisateurs appartiennent à un ou plusieurs groupes. Cela permet de créer des catégories d\'utilisateur avec des permissions communes. Un fichier appartient à un de ces groupes (par défaut le groupe principal du créateur du fichier). Pour le modifier, on peut utiliser <strong>chgrp</strong> qui s\'utilise de la même manière que chown.
</p><p>
Il y a trois types de permissions sur un fichier ou répertoire :
</p>
<ul>
<li><strong>Lire</strong> (<acronym lang="en" xml:lang="en" title="Read">r</acronym>)</li>
<li><strong>Ecrire</strong> (<acronym lang="en" xml:lang="en" title="Write">w</acronym>)</li>
<li><strong>Exécuter</strong> (<acronym lang="en" xml:lang="en" title="eXecute">x</acronym>)</li>
</ul>
<p>
Dans le cas d\'un répertoire, la permission d\'exécution correspond en fait au droit de parcourir ce répertoire. Par exemple la commande cd sur un répertoire n\'ayant pas ce droit retournerait une erreur.
</p><p>
Pour un fichier ou un répertoire, chacune de ces trois permissions est spécifiée pour chacun des trois types d\'utilisateurs vus précédemment. Lors de l\'utilisation de <strong>ls</strong>, qui permet de lister les fichiers, avec l\'option -l ils sont indiqués sous cette forme là :
</p>
<code class="terminal">
> ls -l gfind<br />
-rwxr-xr-- 1 Tian users 161 mai 26 2003 gfind
</code>
<p>
C\'est la première colonne qui est importante ici. Il s\'agit de la <strong>notation symbolique</strong> des permissions. Elle comprend une série de dix caractères. Le premier ne concerne pas les permissions mais le type de fichier. Les valeur possibles et leurs significations sont indiquées dans le tableau suivant.
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Les correspondances entre la notation symbolique et les différents types de fichier">
<caption>Différents types de fichiers</caption>
<tr>
<th scope="col" abbr="Lettre">Lettre</th><th scope="col" abbr="Type">Type</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td><strong>-</strong></td><td>Fichier normal</td>
</tr>
<tr>
<td><strong>d</strong></td><td>Répertoire</td>
</tr>
<tr>
<td><strong>l</strong></td><td><a href="#symlink">Lien symbolique</a></td>
</tr>
<tr>
<td><strong>b</strong></td><td>Fichier de périphérique en mode bloc</td>
</tr>
<tr>
<td><strong>c</strong></td><td>Fichier de périphérique en mode charactère</td>
</tr>
</table>
</div>
<p>
Il y a ensuite les trois types de permissions, répétés pour chaque type d\'utilisateur. La présence d\'un <strong>-</strong> signifie que la permission correspondantes est absente. L\'exemple précédent se lit comme suit :
</p><p>
Le propriétaire du fichier gfind, Tian, peut lire, écrire et exécuter le fichier. Les membres du groupe users peuvent lire ou exécuter ce fichier, mais pas le modifier (absence de w). Tous les autres utilisateurs peuvent seulement le lire (ni w, ni x).
</p><p>
Il existe une autre manière d\'indiquer les permissions, appelée <strong>notation octale</strong>. Elle est composée de trois chiffres de 0 à 7 correspondant respecivement de gauche à droite aux permissions du propriétaire, du groupe et des autres utilisateurs. Pour déterminer ces trois chiffres, une valeur est associée à chaque permission comme indiqué dans le tableau suivant. La valeur symbolique y est aussi rappelée.
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Correspondances entre les valeurs octales et les valeurs symboliques des différentes permissions">
<caption>Valeurs symboliques et octales des permissions</caption>
<tr>
<th scope="col" abbr="Permission">Permission</th><th scope="col" abbr="Symbole">Valeur symbolique</th><th scope="col" abbr="Octal">Valeur octale</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td>Lecture</td><td><strong>r</strong></td><td><strong>4</strong></td>
</tr>
<tr>
<td>Ecriture</td><td><strong>w</strong></td><td><strong>2</strong></td>
</tr>
<tr>
<td>Exécution</td><td><strong>x</strong></td><td><strong>1</strong></td>
</tr>
</table>
</div>
<p>
Ces valeurs sont ensuite ajoutées pour les permissions qui sont présentes. L\'exemple précédent aurait donc comme valeur 754 en notation octale.
</p><p>
Dans les propriétés d\'un fichier, il y a aussi d\'autres indications que ce qui vient d\'être abordé. Il y a notamment ce que l\'on appelle les attributs <acronym lang="en" xml:lang="en" title="Set User IDentifier">SUID</acronym> et <acronym lang="en" xml:lang="en" title="Set Group IDentifier">SGID</acronym>.
</p><p>
L\'attribut SUID indique que, lors de l\'exécution du programme, c\'est l\'identifiant du propriétaire du fichier qui est utilisé plutôt que celui de l\'utilisateur l\'ayant lancé. Cela se passe donc comme si c\'est ce propriétaire qui le fait s\'exécuter. Un exemple classique pour illustrer cela est le programme <strong>passwd</strong> qui permet de changer le mot de passe d\'un utilisateur. Tout le monde peut l\'utiliser pour changer son mot de passe. Mais ce dernier est stocké dans un fichier accessible seulement au root en écriture (/etc/passwd ou /etc/shadow). Pour que passwd puisse le modifier, ce programme a l\'attribut SUID lui conférant les droits du root pendant son exécution.
</p><p>
L\'attribut SGID a un comportement similaire à celui du précédent. La différence est que c\'est le groupe qui est modifié lors du lancement pour le faire correspondre à celui du groupe possédant le fichier.
</p><p>
Il faut également citer l\'attribut appelé <strong>sticky-bit</strong>. Il est utilisé sur un répertoire pour indiquer que seul le propriétaire du répertoire ou d\'un fichier présent dans ce répertoire a le droit de modifier un de ces fichiers. Il est utilisé par exemple pour le répertoire /tmp. Dans ce dernier, tout le monde a le droit de créer un fichier, mais aussi d\'en supprimer. Afin d\'éviter qu\'un utilisateur ne supprime des fichiers ne lui appartenant pas, le sticky-bit est utilisé.
</p><p>
Cet attribut peut aussi être utilisé sur des fichiers. C\'est d\'ailleurs là son but originel. Il indique que le contenu d\'un programme qui a été lancé doit rester stocké au niveau du <a href="systemes_exploitation.php#memory">swap</a> après la fin de l\'exécution. Mais ce comportement n\'est plus réellement utilisé.
</p><p>
En notation symbolique, ces attributs sont indiqués avec celui d\'exécution. La présence de la lettre <strong>s</strong> à la place du w pour le propriétaire ou le groupe indique respectivement que l\'attribut SUID ou SGID est actif. Ceci est le cas lorsque la permission d\'exécution est aussi présente. Dans celui (peu utile) ou la permission d\'exécution est absente, c\'est la lettre <strong>S</strong> qui est utilisée. Pour le sticky-bit, il se trouve avec l\'indication d\'exécution pour les autres utilisateurs (dernier caractère de la notation). Il se note avec la lettre <strong>t</strong>. De même que pour le s, si la permission d\'exécution est absente, c\'est un <strong>T</strong> qui est utilisé.
</p><p>
Pour la notation octale, un chiffre supplémentaire est indiqué devant les trois autres. Sa valeur est calculée en ajoutant les valeurs associée aux attributs selon le tableau suivant :
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Correspondance entre valeurs octale et symbolique des attributs spéciaux">
<caption>Valeurs symboliques et octales des attributs spéciaux</caption>
<tr>
<th scope="col" abbr="Attribut">Attribut</th><th scope="col" abbr="Symbole">Valeur symbolique</th><th scope="col" abbr="Octal">Valeur octale</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td>SUID</td><td><strong>s</strong> (pour l\'utilisateur)</td><td><strong>4</strong></td>
</tr>
<tr>
<td>SGID</td><td><strong>s</strong> (pour le groupe)</td><td><strong>2</strong></td>
</tr>
<tr>
<td>sticky-bit</td><td><strong>t</strong></td><td><strong>1</strong></td>
</tr>
</table>
</div>
<p>
Pour changer ces permissions et attributs, on peut utiliser le programme <strong>chmod</strong>. Il peut être utilisé avec les notations symbolique ou octale. On spécifie ensuite un ou plusieurs fichiers auxquels appliquer les valeurs spécifiées. Le mode octal s\'utilise en donnant tout simplement la valeur désirée. Les attributs peuvent ne pas être indiqués en donnant une valeur sur seulement trois chiffres.
</p>
<code class="terminal">
> chmod 640 index.html<br />
> chmod 4755 /usr/bin/passwd
</code>
<p>
Le premier exemple permet au propriétaire de lire et écrire le fichier index.html. Les membres du groupe auquel appartient ce fichier peuvent uniquement le lire, tandis que les autres utilisateurs ne peuvent rien faire avec.
</p><p>
Le deuxième exemple permet à tout le monde (utilisateur, groupe, autres) de lire et exécuter le fichier, alors que seul le propriétaire peut le modifier. Le 4 indique que de plus l\'attribut SUID doit être mis.
</p><p>
Pour la notation symbolique, on doit indiquer à qui s\'appliquent les permissions. Cela se fait à l\'aide des lettres u, g et o vues précédemment. Il y a en plus la lettre <acronym lang="en" xml:lang="en" title="All">a</acronym> qui permet en une seule fois de faire les changements pour tous les types d\'utilisateurs. Plusieurs de ces lettres peuvent être placées les unes à la suite des autres. On trouve ensuite un signe permettant de spécifier l\'action à effectuer, puis la notation symbolique des permissions. Voici les actions possibles :
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Les différentes actions pouvant être réalisées sur les fichiers avec chmod">
<caption>Actions sur les permissions</caption>
<tr>
<th scope="col" abbr="Signe">Signe</th><th scope="col" abbr="Action">Action</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td><strong>+</strong></td><td>Ajouter les permissions</td>
</tr>
<tr>
<td><strong>-</strong></td><td>Supprimer les permissions</td>
</tr>
<tr>
<td><strong>=</strong></td><td>Seules les permissions spécifiées doivent être appliquées</td>
</tr>
</table>
</div>
<p>
Plusieurs groupes d\'action à effectuer peuvent être spécifiées en les séparant par des virgules. Voici un exemple qui permet de mettre les mêmes permissions au fichier passwd que celles vues précédemment pour la notation octale :
</p>
<code class="terminal">
> chmod u=rwxs,go=rx /usr/bin/passwd
</code>
<p>
On a tout d\'abord les permissions à mettre pour le propriétaire du fichier (u). Il s\'agit de lui laisser un accès en lecture, en écriture et en exécution (rwx). On spécifie aussi l\'attribut SUID (s). Pour les membres du groupe et tous les autres utilisateurs, un même traitement est appliqué ici (go), à savoir leur laisser un accès en lecture et la possibilité de lancer le programme (rx).
</p><p>
S\'il fallait ensuite interdire à absolument tous les utilisateurs de pouvoir exécuter passwd, il suffirait d\'utiliser chmod comme suit :
</p>
<code class="terminal">
> chmod a-x /usr/bin/passwd
</code>
<p>
La modification porte ici sur tous les types d\'utilisateurs (a) pour leur enlever (-) le droit d\'exécution (x).
</p>
');
$currentPage->addChapter('links', 'Liens physiques et symboliques', '
<p>
Un fichier stocké sur le disque dur est un ensemble de données qui sont enregistrées. Il faut ensuite un moyen d\'accéder à ces données. C\'est le rôle que joue alors le nom de fichier qui permet d\'indiquer à quelles données on fait référence.
</p><p>
Lors de la création d\'un fichier, on lui associe traditionnellement un seul nom. Mais en fait il peut y en avoir plusieurs. Chacun de ces noms de fichier est appelé <strong>lien physique</strong> vers celui-ci. Il faut voir cela comme un point d\'accès, vers les données, se trouvant dans l\'arborescence.
</p><p>
Lors de l\'utilisation du programme ls avec l\'option -l, on peut voir le nombre de ces liens physiques.
</p>
<code class="terminal">
> ls -l gfind<br />
-rwxr-xr-- 1 Tian users 161 mai 26 2003 gfind
</code>
<p>
C\'est la deuxième colonne qui l\'indique. On l\'appelle <strong>compteur de référence</strong>. Ici on sait donc qu\'il y a une seule référence existant vers le contenu de ce fichier, celle-ci s\'appelant gfind. C\'est le cas le plus courant. On peut rajouter un lien physique à l\'aide du programme <strong>ln</strong>. On lui passe en paramètre un des liens physiques déjà existant suivi par le nom du nouveau lien à créer. On pourrait par exemple ajouter un lien physique du nom de search. Cet exemple montre aussi le résultat ensuite.
</p>
<code class="terminal">
> ln gfind search<br />
> ls -l gfind<br />
-rwxr-xr-- 2 Tian users 161 mai 26 2003 gfind<br />
> ls -l search<br />
-rwxr-xr-- 2 Tian users 161 mai 26 2003 search
</code>
<p>
Le nombre de liens physiques est alors passé à 2. Il faut bien voir que tous les liens physiques sont strictement équivalents. Lors de la suppression d\'un de ces liens (à l\'aide du programme rm), le compteur de référence est décrémenté. S\'il est différent de 0, rien n\'est fait au niveau du fichier. La suppression du fichier ne sera effective que lorsque le dernier lien physique vers celui-ci sera supprimé. Etant donné que généralement on ne crée des fichiers qu\'avec un seul lien physique, la suppression de celui-ci avec rm est équivalente à la suppression du fichier.
</p>
<p id="symlink">
Il existe un autre type de lien, les <strong>liens symboliques</strong>. Ce sont eux qui s\'approchent le plus de la notion intuitive de lien.
</p><p>
Un lien symbolique est en fait un type de fichier spécial qui contient le chemin vers un fichier du disque (en réalité un de ses liens physiques). On les crée aussi avec le programme ln mais en utilisant l\'option <strong>-s</strong>. Voici un exemple pour illustrer cela. On suppose que le lien physique créé précédemment a été supprimé.
</p>
<code class="terminal">
> ln -s gfind cherche<br />
> ls -l gfind<br />
-rwxr-xr-- 1 Tian users 161 mai 26 2003 gfind<br />
> ls -l cherche<br />
lrwxrwxrwx 1 Tian users 8 mai 26 2003 cherche -> gfind
</code>
<p>
La première chose à observer est le fait que le compteur de référence de gfind n\'a pas été modifié. Un fichier n\'a absolument pas connaissance du nombre de liens symboliques pointant vers lui.
</p><p>
Dans les permissions du lien appelé cherche, on peut voir tout d\'abord la lettre l indiquant qu\'il s\'agit bien d\'un type particulier de fichier, un lien symbolique. On remarquera également que toutes les permissions sont présentes. Ceci car ce sont en fait celles du fichier destination qui seront utilisées pour vérifier les autorisations d\'accès.
</p><p>
Et enfin on a l\'indication de la cible du lien symbolique. Lors de la création, on aurait pu utiliser une indication de chemin. Celle-ci aurait été conservée telle quelle dans le lien symbolique y compris si le chemin était donné de manière relative.
</p><p>
L\'utilisation ensuite du lien symbolique sera équivalente à celle du fichier cible pour les programmes l\'utilisant.
</p><p>
Si ce dernier point fait apparaître les deux types de liens comme très proches, il reste des différences.
</p><p>
Le lien symbolique est totalement indépendant du fichier lui-même et aussi du lien physique auquel il fait référence. On peut créer un lien symbolique en indiquant un chemin de fichier n\'existant pas. Le fichier peut aussi être supprimé ensuite sans que le lien symbolique n\'en soit informé. Toutefois les accès futurs au fichier au travers de ce lien renverront bien sûr une erreur. Et enfin la suppression d\'un lien symbolique (à l\'aide également du programme rm) n\'aura aucune conséquence sur le fichier.
</p>
');
$currentPage->display();
?>
require ("../page.inc");
require ("lessons.inc");
$currentPage = new LessonPage("fichiers");
$currentPage->setContent('');
$currentPage->addChapter('introduction', 'Introduction', '
<p>
Il existe de nombreux outils pour gérer les fichiers en mode graphique. Ici ne seront abordés que ceux en mode texte qui s\'utilisent en ligne de commande ou dans l\'<a href="scripts.php">écriture de shell-scripts</a>. Avec Linux, ceux qui sont utilisés le plus souvent font partie des logiciels <acronym lang="en" xml:lang="en" title="GNU\'s Not Unix">GNU</acronym>.
</p><p>
Seules les options les plus fréquentes de ces programmes seront présentées. Pour connaître les autres, il faudra consulter leurs <a href="references.php#ref">pages de manuel</a>.
</p><p>
Les fichiers sont organisés en une <strong>arborescence</strong> sur les systèmes GNU/Linux. On trouve des répertoires qui peuvent contenir des fichiers ou d\'autres répertoires, pouvant à leur tour répéter le même schéma.
</p><p>
Les systèmes de fichiers les plus utilisés sous GNU/Linux sont l\'<acronym lang="en" xml:lang="en" title="EXTended 2 File System">ext2fs</acronym> et l\'<acronym lang="en" xml:lang="en" title="EXTended 3 File System">ext3fs</acronym>. Le second est semblable au premier si ce n\'est qu\'il ajoute une <strong>journalisation</strong>. Ceci consiste en un enregistrement des opérations effectuées sur les fichiers, ce qui permet de corriger d\'éventuelles erreurs en cas d\'arrêt brutal du système. Ce qui suit concerne ces systèmes de fichiers (même si cela peut parfois s\'appliquer à d\'autres).
</p>
');
$currentPage->addChapter('navig', 'Naviguer dans l\'arborescence', '
<p>
Avant toute chose, une commande utile est <strong>pwd</strong>. Elle permet d\'afficher le nom du répertoire courant. En voici un exemple d\'utilisation :
</p>
<code class="terminal">
> pwd<br />
/home/Tian
</code>
<p>
Pour se déplacer à l\'intérieur de l\'arborescence, il y a <strong>cd</strong> qui est une commande intégrée à <a href="bash.php">bash</a>, le shell par défaut sur les systèmes GNU/Linux. Elle s\'utilise en lui donnant le répertoire qui doit devenir celui courant pour les actions suivantes.
</p>
<code class="terminal">
> cd répertoire<br />
</code>
<p>
Le répertoire peut être indiqué de manière <strong>absolue</strong> (par rapport à la racine en commençant le chemin par / ) ou <strong>relative</strong> (par rapport au répertoire courant). On peut aussi utiliser <strong>..</strong> qui désigne le répertoire parent d\'un répertoire ou <strong>.</strong> qui désigne le répertoire courant. Par exemple pour remonter dans l\'arborescence, on utilise :
</p>
<code class="terminal">
> cd ..<br />
</code>
<p>
Lors d\'une indication de chemin relatif, en plus du répertoire courant, cd regarde dans ceux définis dans la variable d\'environnement <strong>$CDPATH</strong>. Cette dernière contient une liste de noms de répertoires séparés par <strong>:</strong> (deux points). Si par exemple $CDPATH contient "/usr:.", la commande suivante fera de /usr/local le répertoire courant quelque soit le répertoire actuel.
</p>
<code class="terminal">
> cd local<br />
</code>
<p>
A la suite de cd on peut aussi utiliser <strong>-</strong> (tiret) qui désigne le répertoire précédent. Cela permet de revenir au répertoire précédemment visité. Mais ce ne se fait que sur un seul niveau. Une fois revenu dans le répertoire précédent, - désigne celui d\'où on vient. Il existe deux commandes intégrées pour contourner ce problème: <strong>pushd</strong> et <strong>popd</strong>.
</p><p>
pushd s\'utilise exactement comme cd pour se rendre dans un autre répertoire. La différence est que le répertoire quitté est sauvegardé dans une pile. Et, à chaque changement de répertoire, est ajouté en haut de la pile un nouveau répertoire. popd permet de passer dans le dernier répertoire enregistré par pushd. Celui-ci est alors suprrimé de la pile et un nouvel appel à popd permet d\'aller dans le répertoire qui était visité avant celui courant.
</p><p>
Ce comportement est le même que celui utilisé par la plupart des navigateurs internet qui possèdent un bouton ou une commande pour retourner à la page précédente. C\'est ce rôle que joue popd. Pour ceux qui sont habitués à l\'utilisation de cd pour changer de répertoire mais souhaiteraient bénéficier de ce comportement, il suffit de définir un <a href="bash.php#alias">alias</a> :
</p>
<code class="terminal">
> alias cd="pushd"
</code>
<p>
Un changement de répertoire en utilisant cd sauvegardera alors le répertoire quitté. popd permettra ensuite de remonter l\'historique des répertoires visités.
</p>
');
$currentPage->addChapter('manag', 'Manipulation des répertoires et fichiers', '
<p>
Le programme <strong>mkdir</strong> permet de créer un ou plusieurs répertoires. On peut, de même que pour cd lui indiquer un chemin absolu ou relatif. Il s\'utilise par exemple comme ceci :
</p>
<code class="terminal">
> mkdir mon_repertoire
</code>
<p>
Qui va créer mon_repertoire en tant que sous-répertoire de celui courant. On peut indiquer plusieurs répertoires à créer à la suite de la commande. Si un chemin comportant des répertoires est donné, tous doivent exister. Voici un exemple conduisant à une erreur :
</p>
<code class="terminal">
> mkdir mon_repertoire/sous_repertoire/sous_sous_repertoire<br />
mkdir: Ne peut pas créer le répertoire `mon_repertoire/sous_repertoire/sous_sous_repertoire\': Aucun fichier ou répertoire de ce type
</code>
<p>
En supposant que sous_repertoire n\'existe pas. Il existe toutefois une option de mkdir permettant de modifier ce comportement. Avec <strong>-p</strong> mkdir créera tous les répertoires intermédiaires nécessaires. L\'exemple précédent aurait donc ammené la création de sous_repertoire et sous_sous_repertoire.
</p><p>
Le pendant de ce programme est <strong>rmdir</strong> qui efface le ou les répertoires spécifiés en paramètres. Les répertoires indiqués doivent être vides, sinon rmdir retournera une erreur. La manière de supprimer un répertoire et tout son contenu sera évoquée plus loin dans cette partie. Un exemple d\'utilisation :
</p>
<code class="terminal">
> rmdir mon_repertoire
</code>
<p>
Ce programme a aussi une option <strong>-p</strong> qui provoque un comportement inverse à celui vu pour mkdir. Si les répertoires situés au dessus de celui qui doit être supprimé deviennent vides (c\'est à dire s\'ils ne contenaient que le répertoire en question), ils sont supprimés aussi. L\'exemple suivant se place dans le cas d\'utilisation de mkdir -p précédent.
</p>
<code class="terminal">
> rmdir -p mon_repertoire/sous_repertoire/sous_sous_repertoire
</code>
<p>
Si aucune opération n\'avait été effectuée entre temps, sous_sous_repertoire sera supprimé, mais aussi sous_repertoire et mon_repertoire car ils se trouveraient alors être vides.
</p><p>
Pour copier un fichier d\'un emplacement à un autre, c\'est le programme <strong>cp</strong> qui est utilisé. La manière la plus simple de l\'utiliser est en donnant en premier paramètre le nom du fichier, et en second le répertoire destination.
</p>
<code class="terminal">
> cp document.txt /tmp
</code>
<p>
Cet exemple copiera le fichier document.txt, situé dans le répertoire courant, dans le répertoire /tmp. Si le fichier n\'existe pas, cp affichera un message d\'erreur. Le fichier créé dans /tmp portera le même nom, à savoir document.txt.
</p><p>
On peut spécifier un nom différent de celui du fichier d\'origine pour la copie. Il suffit de l\'indiquer après l\'indication du chemin.
</p>
<code class="terminal">
> cp document.txt /tmp/copie.txt
</code>
<p>
On aura alors dans /tmp un fichier copie.txt qui sera une copie de document.txt.
</p>
<p>
Il est aussi possible de copier un répertoire ainsi que tout son contenu de manière récursive. Cela se fait à l\'aide de l\'option <strong>-R</strong> de cp.
</p>
<code class="terminal">
> cp -R /home/Tian/bin /tmp
</code>
<p>
Cet exemple copie le répertoire bin (se trouvant dans /home/Tian) et tout son contenu dans /tmp.
</p><p>
Il existe aussi l\'option <strong>-r</strong> qui réalise à peu près la même chose. Mais pour la version GNU de cp, son utilisation est déconseillée car elle ne gère pas de manière correcte les fichiers spéciaux.
</p><p>
Le programme <strong>mv</strong> s\'utilise de la même manière que cp mais il correspond à un déplacement du fichier. Cela permet de changer un fichier de répertoire comme dans cet exemple :
</p>
<code class="terminal">
> mv document.txt /tmp
</code>
<p>
Et étant donné que comme avec cp on peut donner un nom de fichier différent, c\'est mv qui est utilisé pour renommer un fichier.
</p>
<code class="terminal">
> mv document.txt humeurs.txt
</code>
<p>
Cet exemple renomme le fichier document.txt en humeurs.txt
</p><p>
Ce programme peut aussi fonctionner sur des répertoires. Pas besoin de spécifier d\'option pour obtenir un traitement récursif car c\'est ce qui est fait de toutes façons. Déplacer un répertoire sans ses sous-répertoires n\'aurait pas beaucoup de sens.
</p><p>
Enfin, pour supprimer un fichier, il y a le programme <strong>rm</strong> dont c\'est le but. Il s\'utilise en indiquant le ou les fichiers devant être effacés.
</p>
<code class="terminal">
> rm humeurs.txt
</code>
<p>
Ce programme permet aussi de supprimer un répertoire et tout ce qu\'il peut contenir ce que ne permettait pas rmdir. Ceci se fait à l\'aide de l\'option <strong>-r</strong> ou <strong>-R</strong> qui sont équivalentes dans ce cas.
</p>
<code class="terminal">
> rm -r mon_repertoire
</code>
');
$currentPage->addChapter('perm', 'Gestion des permissions', '
<p>
Les systèmes de fichiers ext2fs et ext3fs comportent des systèmes de permissions sur les fichiers et répertoires. Cela permet de les protéger contre des accès indésirables en spécifiant qui a le droit ou non de faire des opérations sur ces éléments.
</p><p>
Il y a trois notions importantes pour un fichier ou répertoire. Les indications entre parenthèses seront utilisées plus bas.
</p>
<ul>
<li>L\'utilisateur propriétaire (<acronym lang="en" xml:lang="en" title="User">u</acronym>)</li>
<li>Le groupe propriétaire (<acronym lang="en" xml:lang="en" title="Group">g</acronym>)</li>
<li>Les autres (<acronym lang="en" xml:lang="en" title="Others">o</acronym>)</li>
</ul>
<p>
L\'utilisateur propriétaire est celui qui a créé le fichier. Le programme <strong>chown</strong> permet de changer celui-ci.
</p>
<code class="terminal">
> chown Tian /tmp/index.html
</code>
<p>
Ceci permet de faire de l\'utilisateur Tian le propriétaire du fichier /tmp/index.html. Dans le cas d\'un répertoire, on peut utiliser l\'option <strong>-R</strong> pour le faire de manière récursive.
</p><p>
Les utilisateurs appartiennent à un ou plusieurs groupes. Cela permet de créer des catégories d\'utilisateur avec des permissions communes. Un fichier appartient à un de ces groupes (par défaut le groupe principal du créateur du fichier). Pour le modifier, on peut utiliser <strong>chgrp</strong> qui s\'utilise de la même manière que chown.
</p><p>
Il y a trois types de permissions sur un fichier ou répertoire :
</p>
<ul>
<li><strong>Lire</strong> (<acronym lang="en" xml:lang="en" title="Read">r</acronym>)</li>
<li><strong>Ecrire</strong> (<acronym lang="en" xml:lang="en" title="Write">w</acronym>)</li>
<li><strong>Exécuter</strong> (<acronym lang="en" xml:lang="en" title="eXecute">x</acronym>)</li>
</ul>
<p>
Dans le cas d\'un répertoire, la permission d\'exécution correspond en fait au droit de parcourir ce répertoire. Par exemple la commande cd sur un répertoire n\'ayant pas ce droit retournerait une erreur.
</p><p>
Pour un fichier ou un répertoire, chacune de ces trois permissions est spécifiée pour chacun des trois types d\'utilisateurs vus précédemment. Lors de l\'utilisation de <strong>ls</strong>, qui permet de lister les fichiers, avec l\'option -l ils sont indiqués sous cette forme là :
</p>
<code class="terminal">
> ls -l gfind<br />
-rwxr-xr-- 1 Tian users 161 mai 26 2003 gfind
</code>
<p>
C\'est la première colonne qui est importante ici. Il s\'agit de la <strong>notation symbolique</strong> des permissions. Elle comprend une série de dix caractères. Le premier ne concerne pas les permissions mais le type de fichier. Les valeur possibles et leurs significations sont indiquées dans le tableau suivant.
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Les correspondances entre la notation symbolique et les différents types de fichier">
<caption>Différents types de fichiers</caption>
<tr>
<th scope="col" abbr="Lettre">Lettre</th><th scope="col" abbr="Type">Type</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td><strong>-</strong></td><td>Fichier normal</td>
</tr>
<tr>
<td><strong>d</strong></td><td>Répertoire</td>
</tr>
<tr>
<td><strong>l</strong></td><td><a href="#symlink">Lien symbolique</a></td>
</tr>
<tr>
<td><strong>b</strong></td><td>Fichier de périphérique en mode bloc</td>
</tr>
<tr>
<td><strong>c</strong></td><td>Fichier de périphérique en mode charactère</td>
</tr>
</table>
</div>
<p>
Il y a ensuite les trois types de permissions, répétés pour chaque type d\'utilisateur. La présence d\'un <strong>-</strong> signifie que la permission correspondantes est absente. L\'exemple précédent se lit comme suit :
</p><p>
Le propriétaire du fichier gfind, Tian, peut lire, écrire et exécuter le fichier. Les membres du groupe users peuvent lire ou exécuter ce fichier, mais pas le modifier (absence de w). Tous les autres utilisateurs peuvent seulement le lire (ni w, ni x).
</p><p>
Il existe une autre manière d\'indiquer les permissions, appelée <strong>notation octale</strong>. Elle est composée de trois chiffres de 0 à 7 correspondant respecivement de gauche à droite aux permissions du propriétaire, du groupe et des autres utilisateurs. Pour déterminer ces trois chiffres, une valeur est associée à chaque permission comme indiqué dans le tableau suivant. La valeur symbolique y est aussi rappelée.
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Correspondances entre les valeurs octales et les valeurs symboliques des différentes permissions">
<caption>Valeurs symboliques et octales des permissions</caption>
<tr>
<th scope="col" abbr="Permission">Permission</th><th scope="col" abbr="Symbole">Valeur symbolique</th><th scope="col" abbr="Octal">Valeur octale</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td>Lecture</td><td><strong>r</strong></td><td><strong>4</strong></td>
</tr>
<tr>
<td>Ecriture</td><td><strong>w</strong></td><td><strong>2</strong></td>
</tr>
<tr>
<td>Exécution</td><td><strong>x</strong></td><td><strong>1</strong></td>
</tr>
</table>
</div>
<p>
Ces valeurs sont ensuite ajoutées pour les permissions qui sont présentes. L\'exemple précédent aurait donc comme valeur 754 en notation octale.
</p><p>
Dans les propriétés d\'un fichier, il y a aussi d\'autres indications que ce qui vient d\'être abordé. Il y a notamment ce que l\'on appelle les attributs <acronym lang="en" xml:lang="en" title="Set User IDentifier">SUID</acronym> et <acronym lang="en" xml:lang="en" title="Set Group IDentifier">SGID</acronym>.
</p><p>
L\'attribut SUID indique que, lors de l\'exécution du programme, c\'est l\'identifiant du propriétaire du fichier qui est utilisé plutôt que celui de l\'utilisateur l\'ayant lancé. Cela se passe donc comme si c\'est ce propriétaire qui le fait s\'exécuter. Un exemple classique pour illustrer cela est le programme <strong>passwd</strong> qui permet de changer le mot de passe d\'un utilisateur. Tout le monde peut l\'utiliser pour changer son mot de passe. Mais ce dernier est stocké dans un fichier accessible seulement au root en écriture (/etc/passwd ou /etc/shadow). Pour que passwd puisse le modifier, ce programme a l\'attribut SUID lui conférant les droits du root pendant son exécution.
</p><p>
L\'attribut SGID a un comportement similaire à celui du précédent. La différence est que c\'est le groupe qui est modifié lors du lancement pour le faire correspondre à celui du groupe possédant le fichier.
</p><p>
Il faut également citer l\'attribut appelé <strong>sticky-bit</strong>. Il est utilisé sur un répertoire pour indiquer que seul le propriétaire du répertoire ou d\'un fichier présent dans ce répertoire a le droit de modifier un de ces fichiers. Il est utilisé par exemple pour le répertoire /tmp. Dans ce dernier, tout le monde a le droit de créer un fichier, mais aussi d\'en supprimer. Afin d\'éviter qu\'un utilisateur ne supprime des fichiers ne lui appartenant pas, le sticky-bit est utilisé.
</p><p>
Cet attribut peut aussi être utilisé sur des fichiers. C\'est d\'ailleurs là son but originel. Il indique que le contenu d\'un programme qui a été lancé doit rester stocké au niveau du <a href="systemes_exploitation.php#memory">swap</a> après la fin de l\'exécution. Mais ce comportement n\'est plus réellement utilisé.
</p><p>
En notation symbolique, ces attributs sont indiqués avec celui d\'exécution. La présence de la lettre <strong>s</strong> à la place du w pour le propriétaire ou le groupe indique respectivement que l\'attribut SUID ou SGID est actif. Ceci est le cas lorsque la permission d\'exécution est aussi présente. Dans celui (peu utile) ou la permission d\'exécution est absente, c\'est la lettre <strong>S</strong> qui est utilisée. Pour le sticky-bit, il se trouve avec l\'indication d\'exécution pour les autres utilisateurs (dernier caractère de la notation). Il se note avec la lettre <strong>t</strong>. De même que pour le s, si la permission d\'exécution est absente, c\'est un <strong>T</strong> qui est utilisé.
</p><p>
Pour la notation octale, un chiffre supplémentaire est indiqué devant les trois autres. Sa valeur est calculée en ajoutant les valeurs associée aux attributs selon le tableau suivant :
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Correspondance entre valeurs octale et symbolique des attributs spéciaux">
<caption>Valeurs symboliques et octales des attributs spéciaux</caption>
<tr>
<th scope="col" abbr="Attribut">Attribut</th><th scope="col" abbr="Symbole">Valeur symbolique</th><th scope="col" abbr="Octal">Valeur octale</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td>SUID</td><td><strong>s</strong> (pour l\'utilisateur)</td><td><strong>4</strong></td>
</tr>
<tr>
<td>SGID</td><td><strong>s</strong> (pour le groupe)</td><td><strong>2</strong></td>
</tr>
<tr>
<td>sticky-bit</td><td><strong>t</strong></td><td><strong>1</strong></td>
</tr>
</table>
</div>
<p>
Pour changer ces permissions et attributs, on peut utiliser le programme <strong>chmod</strong>. Il peut être utilisé avec les notations symbolique ou octale. On spécifie ensuite un ou plusieurs fichiers auxquels appliquer les valeurs spécifiées. Le mode octal s\'utilise en donnant tout simplement la valeur désirée. Les attributs peuvent ne pas être indiqués en donnant une valeur sur seulement trois chiffres.
</p>
<code class="terminal">
> chmod 640 index.html<br />
> chmod 4755 /usr/bin/passwd
</code>
<p>
Le premier exemple permet au propriétaire de lire et écrire le fichier index.html. Les membres du groupe auquel appartient ce fichier peuvent uniquement le lire, tandis que les autres utilisateurs ne peuvent rien faire avec.
</p><p>
Le deuxième exemple permet à tout le monde (utilisateur, groupe, autres) de lire et exécuter le fichier, alors que seul le propriétaire peut le modifier. Le 4 indique que de plus l\'attribut SUID doit être mis.
</p><p>
Pour la notation symbolique, on doit indiquer à qui s\'appliquent les permissions. Cela se fait à l\'aide des lettres u, g et o vues précédemment. Il y a en plus la lettre <acronym lang="en" xml:lang="en" title="All">a</acronym> qui permet en une seule fois de faire les changements pour tous les types d\'utilisateurs. Plusieurs de ces lettres peuvent être placées les unes à la suite des autres. On trouve ensuite un signe permettant de spécifier l\'action à effectuer, puis la notation symbolique des permissions. Voici les actions possibles :
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Les différentes actions pouvant être réalisées sur les fichiers avec chmod">
<caption>Actions sur les permissions</caption>
<tr>
<th scope="col" abbr="Signe">Signe</th><th scope="col" abbr="Action">Action</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td><strong>+</strong></td><td>Ajouter les permissions</td>
</tr>
<tr>
<td><strong>-</strong></td><td>Supprimer les permissions</td>
</tr>
<tr>
<td><strong>=</strong></td><td>Seules les permissions spécifiées doivent être appliquées</td>
</tr>
</table>
</div>
<p>
Plusieurs groupes d\'action à effectuer peuvent être spécifiées en les séparant par des virgules. Voici un exemple qui permet de mettre les mêmes permissions au fichier passwd que celles vues précédemment pour la notation octale :
</p>
<code class="terminal">
> chmod u=rwxs,go=rx /usr/bin/passwd
</code>
<p>
On a tout d\'abord les permissions à mettre pour le propriétaire du fichier (u). Il s\'agit de lui laisser un accès en lecture, en écriture et en exécution (rwx). On spécifie aussi l\'attribut SUID (s). Pour les membres du groupe et tous les autres utilisateurs, un même traitement est appliqué ici (go), à savoir leur laisser un accès en lecture et la possibilité de lancer le programme (rx).
</p><p>
S\'il fallait ensuite interdire à absolument tous les utilisateurs de pouvoir exécuter passwd, il suffirait d\'utiliser chmod comme suit :
</p>
<code class="terminal">
> chmod a-x /usr/bin/passwd
</code>
<p>
La modification porte ici sur tous les types d\'utilisateurs (a) pour leur enlever (-) le droit d\'exécution (x).
</p>
');
$currentPage->addChapter('links', 'Liens physiques et symboliques', '
<p>
Un fichier stocké sur le disque dur est un ensemble de données qui sont enregistrées. Il faut ensuite un moyen d\'accéder à ces données. C\'est le rôle que joue alors le nom de fichier qui permet d\'indiquer à quelles données on fait référence.
</p><p>
Lors de la création d\'un fichier, on lui associe traditionnellement un seul nom. Mais en fait il peut y en avoir plusieurs. Chacun de ces noms de fichier est appelé <strong>lien physique</strong> vers celui-ci. Il faut voir cela comme un point d\'accès, vers les données, se trouvant dans l\'arborescence.
</p><p>
Lors de l\'utilisation du programme ls avec l\'option -l, on peut voir le nombre de ces liens physiques.
</p>
<code class="terminal">
> ls -l gfind<br />
-rwxr-xr-- 1 Tian users 161 mai 26 2003 gfind
</code>
<p>
C\'est la deuxième colonne qui l\'indique. On l\'appelle <strong>compteur de référence</strong>. Ici on sait donc qu\'il y a une seule référence existant vers le contenu de ce fichier, celle-ci s\'appelant gfind. C\'est le cas le plus courant. On peut rajouter un lien physique à l\'aide du programme <strong>ln</strong>. On lui passe en paramètre un des liens physiques déjà existant suivi par le nom du nouveau lien à créer. On pourrait par exemple ajouter un lien physique du nom de search. Cet exemple montre aussi le résultat ensuite.
</p>
<code class="terminal">
> ln gfind search<br />
> ls -l gfind<br />
-rwxr-xr-- 2 Tian users 161 mai 26 2003 gfind<br />
> ls -l search<br />
-rwxr-xr-- 2 Tian users 161 mai 26 2003 search
</code>
<p>
Le nombre de liens physiques est alors passé à 2. Il faut bien voir que tous les liens physiques sont strictement équivalents. Lors de la suppression d\'un de ces liens (à l\'aide du programme rm), le compteur de référence est décrémenté. S\'il est différent de 0, rien n\'est fait au niveau du fichier. La suppression du fichier ne sera effective que lorsque le dernier lien physique vers celui-ci sera supprimé. Etant donné que généralement on ne crée des fichiers qu\'avec un seul lien physique, la suppression de celui-ci avec rm est équivalente à la suppression du fichier.
</p>
<p id="symlink">
Il existe un autre type de lien, les <strong>liens symboliques</strong>. Ce sont eux qui s\'approchent le plus de la notion intuitive de lien.
</p><p>
Un lien symbolique est en fait un type de fichier spécial qui contient le chemin vers un fichier du disque (en réalité un de ses liens physiques). On les crée aussi avec le programme ln mais en utilisant l\'option <strong>-s</strong>. Voici un exemple pour illustrer cela. On suppose que le lien physique créé précédemment a été supprimé.
</p>
<code class="terminal">
> ln -s gfind cherche<br />
> ls -l gfind<br />
-rwxr-xr-- 1 Tian users 161 mai 26 2003 gfind<br />
> ls -l cherche<br />
lrwxrwxrwx 1 Tian users 8 mai 26 2003 cherche -> gfind
</code>
<p>
La première chose à observer est le fait que le compteur de référence de gfind n\'a pas été modifié. Un fichier n\'a absolument pas connaissance du nombre de liens symboliques pointant vers lui.
</p><p>
Dans les permissions du lien appelé cherche, on peut voir tout d\'abord la lettre l indiquant qu\'il s\'agit bien d\'un type particulier de fichier, un lien symbolique. On remarquera également que toutes les permissions sont présentes. Ceci car ce sont en fait celles du fichier destination qui seront utilisées pour vérifier les autorisations d\'accès.
</p><p>
Et enfin on a l\'indication de la cible du lien symbolique. Lors de la création, on aurait pu utiliser une indication de chemin. Celle-ci aurait été conservée telle quelle dans le lien symbolique y compris si le chemin était donné de manière relative.
</p><p>
L\'utilisation ensuite du lien symbolique sera équivalente à celle du fichier cible pour les programmes l\'utilisant.
</p><p>
Si ce dernier point fait apparaître les deux types de liens comme très proches, il reste des différences.
</p><p>
Le lien symbolique est totalement indépendant du fichier lui-même et aussi du lien physique auquel il fait référence. On peut créer un lien symbolique en indiquant un chemin de fichier n\'existant pas. Le fichier peut aussi être supprimé ensuite sans que le lien symbolique n\'en soit informé. Toutefois les accès futurs au fichier au travers de ce lien renverront bien sûr une erreur. Et enfin la suppression d\'un lien symbolique (à l\'aide également du programme rm) n\'aura aucune conséquence sur le fichier.
</p>
');
$currentPage->display();
?>
Si avez des problèmes ou des questions concernant ce fichier source, vous pouvez utiliser le Forum Sources du site