Vilket filläge indikerar att en fil är en symbolisk länk (symlink)?


Mitt användningsfall är att upptäcka symbolisk länkar inuti ett git-arkiv (och dess historik). Jag hade intrycket av att en symlink är en symlink på grund av dess filläge, och att filläget är vad verktyget chmod anger.

Kommentarer

Svar

Fillägen täcker två olika begrepp: filtyper och filbehörigheter. Ett fils läge representeras av värdet av st_mode i resultatet av stat(2) samtal och ls -l presenterar alla tillsammans; se Förstå UNIX-behörigheter och filtyper för detaljer.

När en fil har skapats kan dess typ kan inte ändras. Dessutom kan du inte på Linux-system ange en symlink-behörighet; allt som är viktigt är målets tillstånd (och i själva verket hela läget eftersom det också bestämmer symlinkens beteende). Se Hur gäller filbehörigheter för symlänkar? för mer information. På Mac OS X kan symlänkar ha sina egna behörigheter.

Slutligen använder git en förenklad modell med ett begränsat antal igenkända lägen:

  • 040000 för en katalog
  • 100644 för en normal fil
  • 100755 för en körbar fil
  • 120000 för en symbolisk länk

Du kan se dessa värden med kommandon som git cat-file -p "master^{tree}"; se Pro Git för mer information.

Svar

Vilket filläge indikerar att en fil är en symbolisk länk (symlink)?

POSIX API för att kontrollera om en fil är en symlink använder S_ISLNK makroen.

I glibc definieras S_ISLNK enligt följande:

#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) 

dvs. en fil är en symlink if ((mode & 0170000) == 0120000) (åtminstone på GNU / Linux).

Svar

En symlänk (även om vissa filsystem hanterar symlänkar på olika sätt) är en inode -tabellpost som pekar på samma plats som en annan fil (eller katalog).

Till exempel om foo är inode 1234bar (a symlink till foo) är inode 1234.

bar existerar inte det, det är bara en pekare till en ”riktig” fil.

Symlinks har i allmänhet inte behörigheter utanför behörigheterna för filen de pekar på. Så bar"s behörigheter är ”samma” as foo"s. Du kan inte ställa in behörigheter för bar (symlink) endast på foo (den riktiga filen).

Med detta sagt är det ”en riktigt hög nivåvy. Olika filsystem hanterar symlänkar på olika sätt. Olika verktyg hanterar symlinks på olika sätt. Vissa filsystem” flaggar ”symlinks och hantera dem speciellt, men vissa gör inte det.

Till exempel chmodLinux kommer inte att ändra en symlinks behörigheter men på OSX kan du få det till. I båda fallen ändras de riktiga filbehörigheterna.

Jag kan inte tänka mig något system (tänker inte menar att det ”inte finns där) där en symlink har behörigheter som är skilda från den riktiga filen.

Kommentarer

  • Nej, en symlänk är en typ av fil (" allt är en fil ") som innehåller ett filnamn snarare än allmänt- ändamålsdata. Typiskt hänvisar detta filnamn till en befintlig fil – att ' är hela poängen med att ha symlänkar – men detta är garanterat inte sant. Ja, en symlänk (som alla andra typ av fil) har en inod. Nej, en symlänk och den fil som den pekar på har separata inoder med olika inodnummer. Hård länkar har samma inod och därmed samma inode num ber.
  • ja det var tänkt att vara på hög nivå men moderna system gör ' t gör en fil på hårddisken inodtabellen innehåller strängen och ingen riktig fil är skapad. Jag tror att det ' heter " snabb symlink "
  • Om ' foo ' och ' bar ' är båda pekare till nod 1234, då är de ' HÅRDA länkar, inte symlänkar. Om " bar " var en SYMlink, skulle det bokstavligen vara teckensträngen " foo " (eller till och med vägen till foo) istället för en nod. I själva verket kan du skapa en symlink som inte ' t pekar någonstans meningsfull alls, t.ex. ln -s 'this is not a real file' bar
  • Dessutom: BSD (som inkluderar Mac OS X) har ett systemanrop lchmod () som låter dig ställa in behörigheterna för själva symlinket. Jag har ingen aning om vad användningen av det är.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *