symlink
Table des matières
Retour à l'index
NOM
symlink - Gestion des liens symboliques
DESCRIPTION
Les liens symboliques sont des fichiers qui agissent comme des pointeurs
vers d'autres fichiers. Pour comprendre leur fonctionnement, vous devez
d'abord comprendre comment fonctionnent les liens physiques.
Un lien physique (hard link) vers un fichier est indistinguable du fichier
d'origine, car c'est une référence directe vers l'objet sous-jacent pointé
par le nom originel. (Pour être précis, chaque lien physique sur un fichier
fait référence au même numéro d'inœud, ce numéro étant un indice dans une
table d'inœuds qui contient des métadonnées sur tout le contenu du système
de fichiers. Consultez stat(2)). Les changements dans un fichier sont
indépendants du nom utilisé pour faire référence au fichier. Les liens
physiques ne peuvent pas faire référence aux répertoires (pour éviter le
risque de boucles dans l’arborescence du système de fichiers, ce qui
planterait de nombreux programmes) et ne peuvent pas référencer des fichiers
sur un autre système de fichiers (car les numéros d'inœud ne sont uniques
que sur un même système de fichiers).
Un lien symbolique est un fichier d'un type spécial, dont le contenu est une
chaîne représentant le chemin d'accès vers un autre fichier, celui vers
lequel le lien pointe. (Le contenu d'un lien symbolique peut être lu en
utilisant readlink(2).) En d'autres termes, un lien symbolique est un
pointeur vers un autre nom, pas vers le contenu sous-jacent. Pour cette
raison, les liens symboliques peuvent faire référence aux répertoires et
peuvent franchir les frontières des systèmes de fichiers.
Il n'y a pas d'obligation pour que le fichier dont le nom est référencé par
un lien symbolique existe. Un lien symbolique qui fait référence à un nom de
fichier inexistant est dit dangling link (pendouillant).
Comme un lien symbolique et l'objet qu'il référence coexistent sur le
système de fichiers, une confusion peut survenir pour distinguer le lien
lui-même et l'objet référencé. Sur des systèmes historiques, les commandes
et les appels système adoptaient leur propres conventions pour le suivi des
liens symboliques de manière arbitraire. Des règles pour une approche plus
uniforme, comme elles sont implémentées sur Linux et d'autres systèmes, sont
présentées ici. Il est important que les applications locales se conforment
aussi à ces règles pour que l'interface avec l'utilisateur soit la plus
cohérente possible.
Liens magiques
Il existe une classe spéciale d’objets ressemblant aux liens symboliques
connus comme « liens magiques » qui peuvent être trouvés dans certains
pseudo-systèmes de fichiers tels que proc(5) (par exemple,
/proc/pid/exe et /proc/pid/fd/*). Au contraire des liens
symboliques, les liens magiques ne sont pas résolus au travers d’une
expansion de noms de chemin, mais agissent plutôt comme des références
directes vers la propre représentation du noyau de la gestion de
fichier. Comme tels, ces liens magiques permettent aux utilisateurs
d’accéder à des fichiers qui ne peuvent être référencés par des chemins
normaux (tels que des fichiers déliés encore référencés par un programme en
cours d’exécution).
Parce qu’ils peuvent contourner les restrictions ordinaires basées sur
mount_namespaces(7), les liens magiques ont été utilisés comme vecteur
d’attaque dans divers exploits.
Propriétés, permissions et horodatage des liens symboliques
Le propriétaire et le groupe d'un lien symbolique existant peuvent être
modifiés en utilisant lchown(2). L'appartenance d'un lien symbolique est
importante lors de sa suppression ou de son renommage dans un répertoire
dont le bit « Sticky » est positionné (consultez inode(7)) et quand le
sysctl fs.protected_symlinks est défini (see proc(5)).
Les horodatages du dernier accès et de la dernière modification d'un lien
symbolique peuvent être modifiés en utilisant utimensat(2) ou
lutimes(3).
Sur Linux, les permissions associées à un lien symbolique ordinaire ne sont
utilisées dans aucune opération. Ces permissions sont toujours 0777
(lecture, écriture et exécution pour toutes les catégories d'utilisateurs)
et ne peuvent pas être modifiées.
Cependant, les liens magiques ne suivent pas cette règle. Ils peuvent avoir
un mode différent de 0777, bien que ce mode ne soit pas actuellement utilisé
pour la vérification des permissions.
Obtention d’un descripteur de fichier faisant référence à un lien symbolique.
L'utilisation des indicateurs O_PATH et O_NOFOLLOW en association pour
un appel open(2) délivre un descripteur de fichier qui peut être transmis
comme l'argument dirfd à des appels système tels que fstatat(2),
fchownat(2), fchmodat(2), linkat(2) et readlinkat(2), afin
d'agir sur des liens symboliques eux-mêmes (et non sur les fichiers vers
lesquels ils pointent).
Par défaut (c'est-à-dire si l'indicateur AT_SYMLINK_FOLLOW n'est pas
précisé), lorsque name_to_handle_at(2) est utilisée sur un lien
symbolique, il délivre un gestionnaire pour le lien symbolique (et non pour
le fichier vers lequel il pointe). On peut alors obtenir un descripteur de
fichier du lien symbolique (et non du fichier vers lequel il pointe) en
précisant l'indicateur O_PATH lors d'un appel ultérieur à
open_by_handle_at(2). De nouveau, ce descripteur de fichier peut être
utilisé dans des appels système cités précédemment pour agir sur le lien
symbolique lui-même.
Traitement des liens symboliques par les appels système et les commandes
Les liens symboliques sont traités en agissant soit sur le lien lui-même,
soit sur l'objet pointé par le lien. Dans ce dernier cas, on dit que
l'application ou l'appel système suit le lien. Les liens symboliques
peuvent faire référence à d'autres liens symboliques, auquel cas les liens
sont suivis jusqu'à ce qu'un objet qui n'est pas un lien symbolique soit
rencontré, qu'un lien symbolique pointant sur un fichier inexistant soit
trouvé, ou qu'une boucle soit détectée (la détection des boucles est faite
en définissant une limite maximale sur le nombre de liens qui peuvent être
suivis, et une erreur se produit si cette limite est atteinte).
Il faut considérer trois domaines d'utilisation différents des liens
symboliques. Ce sont :
- -
-
Les liens symboliques fournis en argument des appels système sous forme de
noms de fichiers.
- -
-
Les liens symboliques indiqués comme arguments de la ligne de commande pour
les utilitaires qui ne parcourent pas l'arborescence des fichiers.
- -
-
Les liens symboliques rencontrés par les utilitaires qui traversent
l'arborescence (soit indiqués sur la ligne de commande, soit rencontrés
comme partie de la hiérarchie des fichiers).
Avant de décrire le traitement des liens symboliques par les appels système
et les commandes, quelques explications technologiques sont
nécessaires. Étant donné un nom de chemin de la forme a/b/c, la partie
précédant la barre oblique finale (c’est-à-dire a/b) est appelée la
composante dirname (nom de répertoire) et la partie suivant la barre
oblique finale (c’est-à-dire c) est appelée la composante basename
(nom de base).
Traitement des liens symboliques par les appels système
Le premier domaine est celui des liens symboliques utilisés en noms de
fichiers comme argument pour les appels système.
Le traitement des liens symboliques dans un nom de chemin passé à un appel
système est le suivant :
- (1)
-
Dans la composante du nom de répertoire d’un chemin, les liens symboliques
sont toujours suivis dans presque tous les appels système (cela est aussi
vrai pour les commandes). La seule exception est openat2(2) qui fournit
des indicateurs pouvant être utilisés pour empêcher explicitement le suivi
de liens symboliques dans la composante du nom de répertoire.
- (2)
-
Sauf exceptions mentionnées ci-dessous, tous les appels système suivent les
liens symboliques dans la composante du nom de base d’un chemin. Par
exemple, s'il existe un lien symbolique slink qui pointe vers un fichier
appelé un_fichier, l'appel système open("slink" ...) renverra un
descripteur de fichier faisant référence à un_fichier.
Certains appels système ne suivent pas les liens symboliques dans la
composante du nom de base d’un chemin et agissent sur le lien symbolique
lui-même. Ce sont : lchown(2), lgetxattr(2), llistxattr(2),
lremovexattr(2), lsetxattr(2), lstat(2), readlink(2),
rename(2), rmdir(2) et unlink(2).
Certains autres appels système suivent éventuellement les liens symboliques
dans la composante du nom de base d’un chemin. Il s'agit de :
faccessat(2), fchownat(2), fstatat(2), linkat(2),
name_to_handle_at(2), open(2), openat(2), open_by_handle_at(2)
et utimensat(2). Reportez-vous à leur pages de manuel pour plus de
détails. Comme remove(3) est un alias pour unlink(2), cette fonction
de bibliothèque ne suit pas non plus les liens symboliques. Quand
rmdir(2) est utilisée sur un lien symbolique, elle échoue avec l'erreur
ENOTDIR.
L'appel link(2) réclame une discussion particulière. POSIX.1-2001 précise
que link(2) doit déréférencer ancien_chemin si c'est un lien
symbolique. Néanmoins, Linux ne le fait pas. (Par défaut, Solaris non plus,
mais des options de compilation permettent d'obtenir le comportement
POSIX.1-2001). POSIX.1-2008 a modifié la spécification pour permettre les
deux comportements dans une implémentation.
Commandes ne parcourant pas les arborescences de fichiers
Le second domaine est celui des liens symboliques, indiqués en tant que noms
de fichiers, comme argument pour des commandes ne traversant pas les
arborescences.
Sauf exception mentionnée ci-dessous, les commandes suivent les liens
symboliques fournis en argument de ligne de commande. Par exemple, si un
lien symbolique slink pointe vers un fichier nommé un_fichier, la
commande cat slink affichera le contenu du fichier un_fichier.
Notez bien que cette règle s'applique à des commandes qui peuvent dans
d'autres situations parcourir l'arborescence, par exemple la commande
chown fichier suit cette règle, alors que chown -R fichier, qui
descend l'arborescence, ne la suit pas. (Cette dernière est traitée dans la
troisième partie ci-dessous).
Si on désire qu'une commande agisse sur le lien symbolique lui-même plutôt
qu'en le suivant --- par exemple si on veut que chown slink change le
propriétaire du fichier slink, que ce soit un lien symbolique ou
non --- l'option -h doit être utilisée. Dans cet exemple, la commande
chown root slink modifierait le propriétaire du fichier référencé par
slink, tandis que chown -h root slink modifierait le propriétaire
de slink lui-même.
Il y a quelques exceptions à cette règle :
- -
-
Les commandes mv(1) et rm(1) ne suivent pas les liens symboliques
fournis en argument, mais essayent respectivement de les renommer ou de les
détruire. (Notez que lorsqu'un lien symbolique fait référence à un fichier
par un chemin relatif, il peut cesser de fonctionner si on le déplace dans
un autre répertoire puisque le chemin relatif ne serait plus correct).
- -
-
La commande ls(1) est aussi une exception à cette règle. Pour assurer la
compatibilité avec des systèmes historiques (quand ls(1) ne descend pas
une arborescence --- c'est-à-dire si l'option -R n'est pas présente),
la commande ls(1) suit les liens symboliques fournis en argument si les
options -H ou -L sont indiquées ou si les options -F, -d et
-l ne sont pas présentes (la commande ls(1) est la seule dont les
options -H et -L modifient le comportement même lorsqu'elle ne fait
pas un parcours d'arborescence).
- -
-
La commande file(1) est aussi une exception à cette règle. Par défaut, la
commande file(1) ne suit pas les liens symboliques fournis en
argument. La commande file(1) ne les suit que si l'option -L est
mentionnée.
Commandes parcourant une arborescence
Les commandes suivantes parcourent, toujours ou sur option, l'arborescence
des fichiers : chgrp(1), chmod(1), chown(1), cp(1), du(1),
find(1), ls(1), pax(1), rm(1) et tar(1).
Il est important de remarquer que les règles ci-dessous s'appliquent tant
aux liens symboliques rencontrés durant un parcours d'arborescence qu'aux
liens fournis en argument de ligne de commande.
La première règle s'applique aux liens qui référencent des fichiers
autres que des répertoires. Les opérations entreprises sur ces liens sont
appliquées sur les liens eux-mêmes, ou alors les liens sont ignorés.
La commande rm -r slink répertoire effacera slink, ainsi que tout
lien symbolique rencontré durant le parcours dans le répertoire, car les
liens symboliques peuvent être effacés. En aucun cas rm(1) ne touchera au
fichier référencé par slink.
La seconde règle s'applique aux liens symboliques qui pointent vers des
répertoires. Par défaut, ces liens ne sont jamais suivis. Cela est souvent
appelé un parcours « physique » par opposition à un parcours « logique » (où
les liens symboliques vers des répertoires seraient suivis).
Certaines conventions sont (ou devraient être) respectées autant que
possible par les commandes parcourant des arborescences de fichiers :
- -
-
Une commande peut être forcée à suivre n'importe quel lien symbolique
indiqué sur la ligne de commande, quel que soit le type de fichier vers
lequel il pointe, en utilisant l'option -H (pour « half-logical »). Cette
option permet d'avoir un espace de noms de la ligne de commande conforme à
l'espace de noms logique. (Notez que pour les commandes qui ne parcourent
pas toujours l'arborescence, l'option -H sera ignorée si l'option -R
n'est pas également présente.)
-
Par exemple, la commande chown -HR utilisateur slink parcourra la
hiérarchie de fichiers débutant par le fichier pointé par
slink. Remarquez que l'option -H n'est pas la même que l'option -h
traitée précédemment. L'option -H permet de suivre les liens symboliques
indiqués sur la ligne de commande aussi bien pour l'action à exécuter que
pour le parcours de l'arborescence ; tout se passe comme si l'utilisateur
avait fourni le nom du fichier référencé par le lien symbolique.
- -
-
Une commande peut être forcée à suivre les liens symboliques nommés sur sa
ligne de commande, ainsi que tous les liens rencontrés durant le parcours,
quel que soit le type des fichiers qu'ils référencent, en utilisant l'option
-L (pour « logical »). Cette option permet de rendre l'espace de noms en
entier semblable à l'espace de noms logique. Notez que les commandes qui ne
font pas systématiquement de parcours d'arborescence ignoreront l'option
-L si l'option -R n'est pas présente.
-
Par exemple, la commande chown -LR utilisateur slink modifiera le
propriétaire du fichier référencé par slink. Si slink pointe vers un
répertoire, chown(1) descendra l'arborescence à partir de ce
répertoire. En outre, si des liens symboliques sont rencontrés pendant le
parcours de chown(1), ils seront traités de la même façon que slink.
- -
-
Une commande peut être forcée à employer le comportement par défaut en
utilisant l'option -P (pour « physique »). Cet attribut permet de rendre
l'espace de noms semblable à l'espace de noms physique.
Pour les commandes qui ne parcourent pas d'arborescence par défaut, les
options -H, -L et -P sont ignorées si l'option -R n'est pas
présente. De plus, vous pouvez indiquer -H, -L et -P plusieurs
fois ; c'est la dernière option qui déterminera le comportement de la
commande. Cela permet de créer des alias de commandes afin d'avoir un
comportement choisi et de surcharger ce comportement en ligne de commande.
Les commandes ls(1) et rm(1) présentent des exceptions pour ces
règles :
- -
-
La commande rm(1) agit toujours sur le lien symbolique et jamais sur le
fichier qu'il référence. Ainsi le lien n'est jamais suivi. La commande
rm(1) ne prend pas en charge les options -H, -L ou -P.
- -
-
Afin d'assurer une compatibilité avec les systèmes historiques, la commande
ls(1) agit un peu différemment. Si une option -F, -d ou -l n’est
pas précisée, alors ls(1) suivra les liens indiqués sur la ligne de
commande. Si l'option -L est mentionnée, ls(1) suivra tous les liens
symboliques, quels que soient leurs types, qu'ils soient fournis sur la
ligne de commande ou rencontrés en parcourant l'arborescence.
VOIR AUSSI
chgrp(1), chmod(1), find(1), ln(1), ls(1), mv(1),
namei(1), rm(1), lchown(2), link(2), lstat(2),
readlink(2), rename(2), symlink(2), unlink(2), utimensat(2),
lutimes(3), path_resolution(7)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>,
Frédéric Hantrais <fhantrais@gmail.com>
et
Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- DESCRIPTION
-
- Liens magiques
-
- Propriétés, permissions et horodatage des liens symboliques
-
- Obtention d’un descripteur de fichier faisant référence à un lien symbolique.
-
- Traitement des liens symboliques par les appels système et les commandes
-
- Traitement des liens symboliques par les appels système
-
- Commandes ne parcourant pas les arborescences de fichiers
-
- Commandes parcourant une arborescence
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:38 GMT, September 19, 2025