Jaki tryb pliku wskazuje, że plik jest dowiązaniem symbolicznym (dowiązaniem symbolicznym)?


Mój przypadek użycia to wykrywanie symbolicznych linki wewnątrz repozytorium git (i jego historii). Odniosłem wrażenie, że link symboliczny jest dowiązaniem symbolicznym ze względu na tryb pliku, a ten tryb pliku jest tym, co narzędzie chmod ustawia.

Komentarze

Odpowiedź

Tryby plików obejmują dwa różne pojęcia: typy plików i uprawnienia do plików. Tryb pliku jest reprezentowany przez wartość st_mode w wyniku wywołań stat(2) i ls -l przedstawia je wszystkie razem; zobacz Zrozumienie uprawnień UNIX i typów plików , aby uzyskać szczegółowe informacje.

Po utworzeniu pliku jego typ może Nie można zmienić. Ponadto w systemach Linux nie można określić uprawnień dowiązania symbolicznego; liczy się tylko pozwolenie celu (i efektywnie pełny tryb, ponieważ to również określa zachowanie dowiązania symbolicznego). Zobacz W jaki sposób uprawnienia plików mają zastosowanie do linków symbolicznych? , aby uzyskać szczegółowe informacje. W systemie Mac OS X łącza symboliczne mogą mieć własne uprawnienia.

Wreszcie, git używa uproszczonego modelu z ograniczoną liczbą rozpoznawanych trybów:

  • 040000 dla katalogu
  • 100644 dla zwykłego pliku
  • 100755 dla pliku wykonywalnego
  • 120000 dla dowiązania symbolicznego

Możesz zobaczyć te wartości za pomocą poleceń, takich jak git cat-file -p "master^{tree}"; zobacz Pro Git , aby uzyskać szczegółowe informacje.

Odpowiedź

Jaki tryb pliku wskazuje, że plik jest dowiązaniem symbolicznym (dowiązaniem symbolicznym)?

API POSIX do sprawdzenia jeśli plik jest dowiązaniem symbolicznym, używa makra S_ISLNK.

W glibc S_ISLNK jest zdefiniowane w następujący sposób:

#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 plik jest dowiązaniem symbolicznym if ((mode & 0170000) == 0120000) (przynajmniej w systemie GNU / Linux).

Odpowiedź

Dowiązanie symboliczne (chociaż niektóre systemy plików obsługują dowiązania symboliczne inaczej) jest wpisem tabeli inode, który wskazuje to samo miejsce co inny plik (lub katalog).

Na przykład jeśli foo to inode 1234 to bar (a dowiązanie symboliczne do foo) to inode 1234.

bar nie „naprawdę istnieje”, to po prostu wskaźnik do „prawdziwy” plik.

Symlinks zazwyczaj nie ma uprawnień innych niż uprawnienia pliku, na który wskazują. Dlatego uprawnienia bar"s są „to samo” as foo"s. Nie możesz ustawić uprawnień dla bar (linku symbolicznego) tylko w foo (prawdziwy plik).

To powiedziawszy, jest to „widok naprawdę wysokiego poziomu. Różne systemy plików różnie obsługują dowiązania symboliczne. Różne narzędzia obsługują symlinks inaczej. Niektóre systemy plików„ flaga ”symlinks i obsługuj je specjalnie, ale niektóre nie.

Na przykład chmod na Linux won „t change a symlinks uprawnienia, ale na OSX możesz to uzyskać. W obu przypadkach rzeczywiste uprawnienia plików są zmienione.

Nie przychodzi mi do głowy żaden system (nie znaczy, że nie ma go tam), gdzie symlink ma uprawnienia oddzielne od rzeczywistego pliku.

Komentarze

  • Nie, dowiązanie symboliczne to typ pliku (" wszystko jest plikiem "), który zawiera nazwę pliku, a nie ogólne- dane celu. Zazwyczaj ta nazwa pliku odnosi się do istniejącego pliku – w tym ' chodzi o posiadanie dowiązań symbolicznych – ale nie jest to gwarantowane. Tak, dowiązanie symboliczne (jak każde inne typ pliku) ma i-węzeł. Nie, dowiązanie symboliczne i plik, który wskazuje, mają oddzielne i-węzły z różnymi numerami i-węzłów. Linki Hard mają ten sam i-węzeł, a zatem ten sam numer i-węzła ber.
  • cóż, to miał być wysoki poziom, ale nowoczesne systemy nie ' nie tworzą pliku na dysku twardym, a tabela i-węzłów zawiera ciąg i żaden prawdziwy plik nie jest Utworzony. Myślę, że ' nazywa się " szybkie łącze symboliczne "
  • Jeśli ' foo ' i ' bar ' to oba wskaźniki do węzła 1234, a następnie ' są łączami HARD, a nie symbolicznymi. Gdyby " bar " był linkiem SYM, to byłby to dosłownie ciąg znaków " foo " (lub nawet ścieżka do foo) zamiast węzła. W rzeczywistości możesz utworzyć dowiązanie symboliczne, które ' nie będzie wskazywać żadnego sensownego miejsca, np. ln -s 'this is not a real file' bar
  • Ponadto: BSD (który obejmuje Mac OS X) ma wywołanie systemowe lchmod (), które pozwala ustawić uprawnienia samego dowiązania symbolicznego. Nie mam pojęcia, do czego to służy.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *