Quel mode de fichier indique quun fichier est un lien symbolique (lien symbolique)?
Mon cas dutilisation est de détecter symbolique liens dans un référentiel git (et son historique). Javais limpression quun lien symbolique est un lien symbolique en raison de son mode fichier, et que ce mode fichier est ce que loutil chmod
définit.
Commentaires
Réponse
Les modes de fichiers couvrent deux notions différentes: les types de fichiers et les permissions sur les fichiers. Le mode dun fichier « s est représenté par la valeur de st_mode
dans le résultat des appels stat(2)
et ls -l
les présente tous ensemble; voir Comprendre les autorisations UNIX et les types de fichiers pour plus de détails.
Une fois quun fichier est créé, son type peut « T être changé. De plus, sur les systèmes Linux, vous ne pouvez pas « t spécifier les permissions dun lien symbolique »; tout ce qui compte, cest la permission de la cible (et effectivement le mode complet puisque cela détermine aussi le comportement du lien symbolique). Voir Comment les autorisations de fichier sappliquent-elles aux liens symboliques? pour plus de détails. Sous Mac OS X, les liens symboliques peuvent avoir leurs propres autorisations.
Enfin, git
utilise un modèle simplifié, avec un nombre limité de modes reconnus:
-
040000
pour un répertoire -
100644
pour un fichier normal -
100755
pour un fichier exécutable -
120000
pour un lien symbolique
Vous pouvez voir ces valeurs à laide de commandes telles que git cat-file -p "master^{tree}"
; voir Pro Git pour plus de détails.
Réponse
Quel mode de fichier indique quun fichier est un lien symbolique (lien symbolique)?
LAPI POSIX à vérifier si un fichier est un lien symbolique utilise la macro S_ISLNK
.
Dans la glibc, S_ISLNK
est défini comme suit:
#define __S_IFMT 0170000 /* These bits determine file type. */ #define __S_IFLNK 0120000 /* Symbolic link. */ #define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask)) #define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK)
ie un fichier est un lien symbolique if ((mode & 0170000) == 0120000)
(au moins sous GNU / Linux).
Réponse
Un lien symbolique (bien que certains systèmes de fichiers gèrent différemment les liens symboliques) est une entrée de table inode
qui pointe vers le même endroit quun autre fichier (ou répertoire).
Par exemple, si foo
est inode 1234
alors bar
(a lien symbolique vers toto) est inode 1234
.
bar
nexiste pas vraiment, il « est juste un pointeur vers un « vrai » fichier.
Symlinks
nont généralement pas de permissions en dehors des permissions du fichier vers lequel elles pointent. Donc, les permissions bar"s
sont « the same » as foo"s
. Vous ne pouvez « t définir des autorisations sur bar
(le lien symbolique) que sur foo
(le vrai fichier).
Cela étant dit, cest « une vue de très haut niveau. Différents systèmes de fichiers gèrent les liens symboliques différemment. Différents outils gèrent symlinks
différemment. Certains systèmes de fichiers » signalent « symlinks
et les gérer spécialement, mais certains ne le font pas.
Par exemple, chmod
sur Linux
na « pas changé de symlinks
autorisations mais sur OSX
vous pouvez y accéder. Dans les deux cas, les autorisations des fichiers réels sont modifiées.
Je ne pense à aucun système (ne « t signifie que « nest pas là-bas) où un symlink
a des autorisations distinctes du fichier réel.
Commentaires
- Non, un lien symbolique est un type de fichier ( » tout est un fichier « ) qui contient un nom de fichier plutôt que général- données de finalité. Généralement, ce nom de fichier fait référence à un fichier existant – que ‘ est tout lintérêt davoir des liens symboliques – mais il nest pas garanti que ce soit vrai. Oui, un lien symbolique (comme tous les autres type de fichier) a un inode. Non, un lien symbolique et le fichier quil pointe pour avoir des inodes séparés, avec des numéros dinode différents. Hard les liens ont le même inode, et donc le même numéro dinode ber.
- eh bien cétait censé être de haut niveau mais les systèmes modernes ne font pas ‘ un fichier sur le disque dur la table des inodes contient la chaîne et aucun fichier réel nest créé. Je pense quil ‘ sappelle » lien symbolique rapide »
- Si ‘ foo ‘ et ‘ bar ‘ sont tous les deux des pointeurs vers le nœud 1234, puis ils ‘ concernent des liens HARD, pas des liens symboliques. Si » bar » était un SYMlink, alors ce serait littéralement la chaîne de caractères » foo » (ou même le chemin vers foo) au lieu dun nœud. En fait, vous pouvez créer un lien symbolique qui ne pointe ‘ nulle part significatif du tout, par exemple
ln -s 'this is not a real file' bar
- Aussi: BSD (qui inclut Mac OS X) a un appel système lchmod () qui vous permettra de définir les permissions du lien symbolique lui-même. Je nai aucune idée de son utilité.
chmod
définit les bits de permission (rwx et sticky / setuid / setgid bits, …): cest ce que nous appelons un mode » « . Mais vous semblez faire référence aux types de fichiers à la place.