Welke bestandsmodus geeft aan dat een bestand een symbolische link (symlink) is?
Ik gebruik het om symbolische links in een git-repository (en zijn geschiedenis). Ik had de indruk dat een symlink een symlink is vanwege de bestandsmodus, en die bestandsmodus is wat de tool chmod
instelt.
Opmerkingen
Antwoord
Bestandsmodi omvatten twee verschillende begrippen: bestandstypen en bestandsrechten. De modus van een bestand wordt vertegenwoordigd door de waarde van st_mode
in het resultaat van stat(2)
aanroepen en ls -l
presenteert ze allemaal samen; zie UNIX-rechten en bestandstypen begrijpen voor details.
Zodra een bestand is gemaakt, kan het type “t worden veranderd. Bovendien kun je op Linux-systemen de permissies van een symlink “niet specificeren”; het enige dat telt is de toestemming van het doel (en in feite de volledige modus aangezien dat ook het gedrag van de symlink bepaalt). Zie Hoe zijn bestandsrechten van toepassing op symlinks? voor details. Op Mac OS X kunnen symlinks hun eigen rechten hebben.
Ten slotte gebruikt git
een vereenvoudigd model, met een beperkt aantal herkende modi:
-
040000
voor een map -
100644
voor een normaal bestand -
100755
voor een uitvoerbaar bestand -
120000
voor een symbolische link
U kunt deze waarden zien met behulp van opdrachten zoals git cat-file -p "master^{tree}"
; zie Pro Git voor details.
Antwoord
Welke bestandsmodus geeft aan dat een bestand een symbolische link (symlink) is?
De POSIX API om te controleren als een bestand een symlink is, wordt de S_ISLNK
macro gebruikt.
In glibc wordt S_ISLNK
als volgt gedefinieerd:
#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)
dwz een bestand is een symlink if ((mode & 0170000) == 0120000)
(tenminste op GNU / Linux).
Antwoord
Een symlink (hoewel sommige bestandssystemen symlinks anders behandelen) is een inode
tabelitem dat naar dezelfde plaats verwijst als een ander bestand (of directory).
Als foo
bijvoorbeeld inode 1234
is, dan is bar
(een symlink to foo) is inode 1234
.
bar
bestaat niet echt, het is slechts een verwijzing naar een “echt” bestand.
Symlinks
hebben over het algemeen geen “permissies buiten de permissies van het bestand waarnaar ze verwijzen. Dus bar"s
permissies zijn “hetzelfde” as foo"s
. U kunt “t machtigingen instellen voor bar
(de symlink) alleen voor foo
(het echte bestand).
Dat gezegd hebbende, het “is echt een weergave op hoog niveau. Verschillende bestandssystemen behandelen symlinks anders. Verschillende tools behandelen symlinks
anders. Sommige bestandssystemen” markeren “symlinks
en behandel ze speciaal, maar sommige niet.
Bijvoorbeeld chmod
op Linux
zal “geen symlinks
permissies maar op OSX
kun je het krijgen. In beide gevallen zijn de echte bestanden permissies veranderd.
Ik kan geen enkel systeem bedenken (niet bedoel dat het niet daarbuiten is) waar een symlink
rechten heeft die los staan van het echte bestand.
Reacties
- Nee, een symlink is een bestandstype (" alles is een bestand ") dat een bestandsnaam bevat in plaats van algemene- doelgegevens. Meestal verwijst deze bestandsnaam naar een bestaand bestand – dat ' het hele punt is van het hebben van symlinks – maar dit is niet gegarandeerd waar. Ja, een symlink (zoals elke andere type bestand) heeft een inode. Nee, een symlink en het bestand waarnaar het verwijst, hebben afzonderlijke inodes, met verschillende inodegetallen. Hard links hebben dezelfde inode, en dus hetzelfde inode num ber.
- nou, het was bedoeld als een hoog niveau, maar moderne systemen ' maken geen bestand op de harde schijf, de inodetabel bevat de string en geen echt bestand is gemaakt. Ik denk dat het ' heet " snelle symlink "
- Als ' foo ' en ' bar ' zijn beide verwijzingen naar knooppunt 1234, en ' zijn HARD-links, geen symlinks. Als " bar " een SYMlink zou zijn, dan zou dit letterlijk de tekenreeks " zijn foo " (of zelfs het pad naar foo) in plaats van een knooppunt. In feite kunt u een symbolische koppeling maken die niet ' nergens zinvol verwijst, bijv.
ln -s 'this is not a real file' bar
- Ook: BSD (inclusief Mac OS X) heeft een lchmod () systeemaanroep waarmee je de permissies van de symlink zelf kunt instellen. Ik heb geen idee wat het nut daarvan is.
chmod
stelt machtigingsbits in (rwx en sticky / setuid / setgid bits, …): dit is wat we een " -modus . Maar het lijkt erop dat u in plaats daarvan verwijst naar bestandstypes typen .