Odpowiedzi zarówno baraboom, jak i peth są poprawne: bity zezwolenia na same dowiązania symboliczne są nieistotne (z wyjątkiem macOS; patrz poniżej), a zmiana uprawnień na dowiązanie symboliczne - za pomocą chmod
narzędzia wiersza polecenia lub chmod()
wywołania systemowego - będzie po prostu działać jako jeśli został on wykonany przeciwko celowi dowiązania symbolicznego.
Cytując opis SUSv4 / POSIX.1-2008 wywołania systemowego symlink () :
Wartości bitów trybu pliku dla utworzonego dowiązania symbolicznego są nieokreślone. Wszystkie interfejsy określone przez POSIX.1-2008 powinien zachowywać się tak, jakby zawartość dowiązania symboliczne zawsze można odczytać z tym, że wartość bitów trybu pliku zwróconych w st_mode dziedzinie statystyk struktury jest nieokreślona.
Tutaj „nieokreślony” pozostawia miejsce na interpretację dla każdego wdrożenia. Specyfika:
- W systemie Linux (testowane przy użyciu ext4fs)
stat()
zwraca st_mode=0777
, bez względu na to, jakie umask było podczas tworzenia dowiązania symbolicznego; ls -l
dlatego zawsze wyświetla się lrwxrwxrwx
dla dowiązań symbolicznych.
- W systemach macOS (HFS) i FreeBSD (zarówno UFS, jak i ZFS) dowiązanie symboliczne ma swoje własne uprawnienie:
chmod -h
Komenda wymieniona powyżej może zmienić to uprawnienie (które wewnętrznie używa lchown()
do tego celu wywołania systemowego innego niż POSIX ), a stat()
system call zwraca tę wartość dla st_mode
.
Zawsze można podążać za dowiązaniami symbolicznymi w Linuksie i FreeBSD, zgodnie z POSIX. W szczególności w FreeBSD oznacza to, że tryb pliku dowiązania symbolicznego nie ma żadnego wpływu na kontrolę dostępu.
Z drugiej strony macOS nieznacznie psuje POSIX. Chociaż można podążać za dowiązaniem symbolicznym bez względu na jego uprawnienia do odczytu, readlink()
nie powiedzie się z EACCES
(Odmowa zezwolenia), jeśli użytkownik nie ma uprawnień do odczytu:
$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r-- 1 root staff 1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink
ls: symlink: Permission denied
l--------- 1 root staff 1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye
(Zwróć uwagę, że -> target
brakuje części w danych wyjściowych drugiego ls -l
polecenia, i że cat symlink
nadal się powiodło i wydrukowało zawartość target
pliku, nawet jeśli użytkownik nie miał uprawnień do odczytu symlink
.)
NetBSD najwyraźniej oferuje specjalną opcję montowania o nazwie, symperm
która, jeśli jest ustawiona, powoduje symboliczne uprawnienia do odczytu / wykonania readlink()
łącza do kontroli i przejścia łącza.