symlink(7) Miscellaneous Information Manual symlink(7) 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 reference directe vers l'objet sous-jacent pointe par le nom originel. (Pour etre precis, chaque lien physique sur un fichier fait reference au meme numero d'inoeud, ce numero etant un indice dans une table d'inoeuds qui contient des metadonnees sur tout le contenu du systeme de fichiers. Consultez stat(2)). Les changements dans un fichier sont independants du nom utilise pour faire reference au fichier. Les liens physiques ne peuvent pas faire reference aux repertoires (pour eviter le risque de boucles dans l'arborescence du systeme de fichiers, ce qui planterait de nombreux programmes) et ne peuvent pas referencer des fichiers sur un autre systeme de fichiers (car les numeros d'inoeud ne sont uniques que sur un meme systeme de fichiers). Un lien symbolique est un fichier d'un type special, dont le contenu est une chaine representant le chemin d'acces vers un autre fichier, celui vers lequel le lien pointe. (Le contenu d'un lien symbolique peut etre 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 reference aux repertoires et peuvent franchir les frontieres des systemes de fichiers. Il n'y a pas d'obligation pour que le fichier dont le nom est reference par un lien symbolique existe. Un lien symbolique qui fait reference a un nom de fichier inexistant est dit dangling link (pendouillant). Comme un lien symbolique et l'objet qu'il reference coexistent sur le systeme de fichiers, une confusion peut survenir pour distinguer le lien lui-meme et l'objet reference. Sur des systemes historiques, les commandes et les appels systeme adoptaient leur propres conventions pour le suivi des liens symboliques de maniere arbitraire. Des regles pour une approche plus uniforme, comme elles sont implementees sur Linux et d'autres systemes, sont presentees ici. Il est important que les applications locales se conforment aussi a ces regles pour que l'interface avec l'utilisateur soit la plus coherente possible. Liens magiques There is a special class of symbolic-link-like objects known as "magic links", which can be found in certain pseudofilesystems such as proc(5) (examples include /proc/pid/exe and /proc/pid/fd/*). Unlike normal symbolic links, magic links are not resolved through pathname-expansion, but instead act as direct references to the kernel's own representation of a file handle. As such, these magic links allow users to access files which cannot be referenced with normal paths (such as unlinked files still referenced by a running program ). Parce qu'ils peuvent contourner les restrictions ordinaires basees sur mount_namespaces(7), les liens magiques ont ete utilises comme vecteur d'attaque dans divers exploits. Proprietes, permissions et horodatage des liens symboliques The owner and group of an existing symbolic link can be changed using lchown(2). The ownership of a symbolic link matters when the link is being removed or renamed in a directory that has the sticky bit set (see inode(7)), and when the fs.protected_symlinks sysctl is set (see proc(5)). Les horodatages du dernier acces et de la derniere modification d'un lien symbolique peuvent etre modifies en utilisant utimensat(2) ou lutimes(3). Sur Linux, les permissions associees a un lien symbolique ordinaire ne sont utilisees dans aucune operation. Ces permissions sont toujours 0777 (lecture, ecriture et execution pour toutes les categories d'utilisateurs) et ne peuvent pas etre modifiees. Cependant, les liens magiques ne suivent pas cette regle. Ils peuvent avoir un mode different de 0777, bien que ce mode ne soit pas actuellement utilise pour la verification des permissions. Obtention d'un descripteur de fichier faisant reference a un lien symbolique. L'utilisation des indicateurs O_PATH et O_NOFOLLOW en association pour un appel open(2) delivre un descripteur de fichier qui peut etre transmis comme l'argument dirfd a des appels systeme tels que fstatat(2), fchownat(2), fchmodat(2), linkat(2) et readlinkat(2), afin d'agir sur des liens symboliques eux-memes (et non sur les fichiers vers lesquels ils pointent). Par defaut (c'est-a-dire si l'indicateur AT_SYMLINK_FOLLOW n'est pas precise), lorsque name_to_handle_at(2) est utilisee sur un lien symbolique, il delivre 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 precisant l'indicateur O_PATH lors d'un appel ulterieur a open_by_handle_at(2). De nouveau, ce descripteur de fichier peut etre utilise dans des appels systeme cites precedemment pour agir sur le lien symbolique lui-meme. Traitement des liens symboliques par les appels systeme et les commandes Les liens symboliques sont traites en agissant soit sur le lien lui-meme, soit sur l'objet pointe par le lien. Dans ce dernier cas, on dit que l'application ou l'appel systeme suit le lien. Les liens symboliques peuvent faire reference a d'autres liens symboliques, auquel cas les liens sont suivis jusqu'a ce qu'un objet qui n'est pas un lien symbolique soit rencontre, qu'un lien symbolique pointant sur un fichier inexistant soit trouve, ou qu'une boucle soit detectee (la detection des boucles est faite en definissant une limite maximale sur le nombre de liens qui peuvent etre suivis, et une erreur se produit si cette limite est atteinte). Il faut considerer trois domaines d'utilisation differents des liens symboliques. Ce sont : - Les liens symboliques fournis en argument des appels systeme sous forme de noms de fichiers. - Les liens symboliques indiques comme arguments de la ligne de commande pour les utilitaires qui ne parcourent pas l'arborescence des fichiers. - Les liens symboliques rencontres par les utilitaires qui traversent l'arborescence (soit indiques sur la ligne de commande, soit rencontres comme partie de la hierarchie des fichiers). Avant de decrire le traitement des liens symboliques par les appels systeme et les commandes, quelques explications technologiques sont necessaires. Etant donne un nom de chemin de la forme a/b/c, la partie precedant la barre oblique finale (c'est-a-dire a/b) est appelee la composante dirname (nom de repertoire) et la partie suivant la barre oblique finale (c'est-a-dire c) est appelee la composante basename (nom de base). Traitement des liens symboliques par les appels systeme Le premier domaine est celui des liens symboliques utilises en noms de fichiers comme argument pour les appels systeme. Le traitement des liens symboliques dans un nom de chemin passe a un appel systeme est le suivant : (1) Dans la composante du nom de repertoire d'un chemin, les liens symboliques sont toujours suivis dans presque tous les appels systeme (cela est aussi vrai pour les commandes). La seule exception est openat2(2) qui fournit des indicateurs pouvant etre utilises pour empecher explicitement le suivi de liens symboliques dans la composante du nom de repertoire. (2) Sauf exceptions mentionnees ci-dessous, tous les appels systeme 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 appele un_fichier, l'appel systeme open("slink" ...) renverra un descripteur de fichier faisant reference a un_fichier. Certains appels systeme ne suivent pas les liens symboliques dans la composante du nom de base d'un chemin et agissent sur le lien symbolique lui-meme. 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 systeme suivent eventuellement 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 a leur pages de manuel pour plus de details. Comme remove(3) est un alias pour unlink(2), cette fonction de bibliotheque ne suit pas non plus les liens symboliques. Quand rmdir(2) est utilisee sur un lien symbolique, elle echoue avec l'erreur ENOTDIR. L'appel link(2) reclame une discussion particuliere. POSIX.1-2001 precise que link(2) doit dereferencer ancien_chemin si c'est un lien symbolique. Neanmoins, Linux ne le fait pas. (Par defaut, Solaris non plus, mais des options de compilation permettent d'obtenir le comportement POSIX.1-2001). POSIX.1-2008 a modifie la specification pour permettre les deux comportements dans une implementation. Commandes ne parcourant pas les arborescences de fichiers Le second domaine est celui des liens symboliques, indiques en tant que noms de fichiers, comme argument pour des commandes ne traversant pas les arborescences. Sauf exception mentionnee 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 nomme un_fichier, la commande cat slink affichera le contenu du fichier un_fichier. Notez bien que cette regle s'applique a des commandes qui peuvent dans d'autres situations parcourir l'arborescence, par exemple la commande chown fichier suit cette regle, alors que chown -R fichier, qui descend l'arborescence, ne la suit pas. (Cette derniere est traitee dans la troisieme partie ci-dessous). If it is explicitly intended that the command operate on the symbolic link instead of following the symbolic link--for example, it is desired that chown slink change the ownership of the file that slink is, whether it is a symbolic link or not--then the -h option should be used. In the above example, chown root slink would change the ownership of the file referred to by slink, while chown -h root slink would change the ownership of slink itself. Il y a quelques exceptions a cette regle : - 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 detruire. (Notez que lorsqu'un lien symbolique fait reference a un fichier par un chemin relatif, il peut cesser de fonctionner si on le deplace dans un autre repertoire puisque le chemin relatif ne serait plus correct). - The ls(1) command is also an exception to this rule. For compatibility with historic systems (when ls(1) is not doing a tree walk--that is, -R option is not specified), the ls(1) command follows symbolic links named as arguments if the -H or -L option is specified, or if the -F, -d, or -l options are not specified. (The ls(1) command is the only command where the -H and -L options affect its behavior even though it is not doing a walk of a file tree.) - La commande file(1) est aussi une exception a cette regle. Par defaut, 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 mentionnee. 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 regles ci-dessous s'appliquent tant aux liens symboliques rencontres durant un parcours d'arborescence qu'aux liens fournis en argument de ligne de commande. La premiere regle s'applique aux liens qui referencent des fichiers autres que des repertoires. Les operations entreprises sur ces liens sont appliquees sur les liens eux-memes, ou alors les liens sont ignores. La commande rm -r slink repertoire effacera slink, ainsi que tout lien symbolique rencontre durant le parcours dans le repertoire, car les liens symboliques peuvent etre effaces. En aucun cas rm(1) ne touchera au fichier reference par slink. La seconde regle s'applique aux liens symboliques qui pointent vers des repertoires. Par defaut, ces liens ne sont jamais suivis. Cela est souvent appele un parcours << physique >> par opposition a un parcours << logique >> (ou les liens symboliques vers des repertoires seraient suivis). Certaines conventions sont (ou devraient etre) respectees autant que possible par les commandes parcourant des arborescences de fichiers : - Une commande peut etre forcee a suivre n'importe quel lien symbolique indique 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 a l'espace de noms logique. (Notez que pour les commandes qui ne parcourent pas toujours l'arborescence, l'option -H sera ignoree si l'option -R n'est pas egalement presente.) Par exemple, la commande chown -HR utilisateur slink parcourra la hierarchie de fichiers debutant par le fichier pointe par slink. Remarquez que l'option -H n'est pas la meme que l'option -h traitee precedemment. L'option -H permet de suivre les liens symboliques indiques sur la ligne de commande aussi bien pour l'action a executer que pour le parcours de l'arborescence ; tout se passe comme si l'utilisateur avait fourni le nom du fichier reference par le lien symbolique. - Une commande peut etre forcee a suivre les liens symboliques nommes sur sa ligne de commande, ainsi que tous les liens rencontres durant le parcours, quel que soit le type des fichiers qu'ils referencent, en utilisant l'option -L (pour << logical >>). Cette option permet de rendre l'espace de noms en entier semblable a l'espace de noms logique. Notez que les commandes qui ne font pas systematiquement de parcours d'arborescence ignoreront l'option -L si l'option -R n'est pas presente. Par exemple, la commande chown -LR utilisateur slink modifiera le proprietaire du fichier reference par slink. Si slink pointe vers un repertoire, chown(1) descendra l'arborescence a partir de ce repertoire. En outre, si des liens symboliques sont rencontres pendant le parcours de chown(1), ils seront traites de la meme facon que slink. - Une commande peut etre forcee a employer le comportement par defaut en utilisant l'option -P (pour << physique >>). Cet attribut permet de rendre l'espace de noms semblable a l'espace de noms physique. Pour les commandes qui ne parcourent pas d'arborescence par defaut, les options -H, -L et -P sont ignorees si l'option -R n'est pas presente. De plus, vous pouvez indiquer -H, -L et -P plusieurs fois ; c'est la derniere option qui determinera le comportement de la commande. Cela permet de creer 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) presentent des exceptions pour ces regles : - La commande rm(1) agit toujours sur le lien symbolique et jamais sur le fichier qu'il reference. 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 compatibilite avec les systemes historiques, la commande ls(1) agit un peu differemment. Si une option -F, -d ou -l n'est pas precisee, alors ls(1) suivra les liens indiques sur la ligne de commande. Si l'option -L est mentionnee, ls(1) suivra tous les liens symboliques, quels que soient leurs types, qu'ils soient fournis sur la ligne de commande ou rencontres 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 francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Frederic Hantrais et Jean- Paul Guillonneau Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 symlink(7)