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

  • Zie superuser.com/questions/303040/…
  • Het lijkt erop dat mijn vraag misschien beter is gesteld ' welke bestandsmodus zijn symlinks in git '.
  • stackoverflow.com/questions/15465436/git-how-to-handle-symlinks
  • 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 .
  • @JohnWHSmith Ik zou graag een link naar documenten opwaarderen die de verschillen in bestandsmodi en bestandstypen onderscheiden! : D

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *