Powiedzmy, że masz taką strukturę:
+ directory
-- file1
-- file2
-- file3 -> /tmp/file3
file3
to link do innej file3
strony w systemie.
Teraz powiedzmy, że mam chmod 777
katalog i całą zawartą w nim zawartość. Czy my file3
się /tmp
otrzymać te uprawnienia? Powiedzmy też, że mamy tę samą sytuację, ale odwróconą.
/tmp/file3 -> /directory/file3
Jeśli zastosuję uprawnienia do pliku, do którego prowadzi link, jak to wpłynie na link?
Odpowiedzi:
To zależy od tego, jak dzwonisz
chmod
i platformy, na której działasz.Na przykład w systemie Linux
man chmod
mówi:Jednak na komputerze Mac chmod może być używany do modyfikowania uprawnień dowiązania symbolicznego za pomocą opcji takich jak to (z
man chmod
):Dla przykładu załóżmy, że jesteś na komputerze z systemem Linux do końca tej odpowiedzi.
Jeśli w pierwszym przypadku uruchomisz
chmod -R 777 directory
rekurencyjną zmianę uprawnień, nie będzie to miało wpływu na cel łącza, ale jeśli to zrobiszchmod 777 directory/*
, to zmieni się.Jeśli bezpośrednio zmienisz uprawnienia do celu linku, uprawnienia te zostaną przeniesione (ponieważ, jak mówią strona man i baraboom , rzeczywiste uprawnienia do łącza nie są używane do niczego).
Dziennik testu dla ilustracji:
źródło
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 lubchmod()
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 () :
Tutaj „nieokreślony” pozostawia miejsce na interpretację dla każdego wdrożenia. Specyfika:
stat()
zwracast_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.chmod -h
Komenda wymieniona powyżej może zmienić to uprawnienie (które wewnętrznie używalchown()
do tego celu wywołania systemowego innego niż POSIX ), astat()
system call zwraca tę wartość dlast_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ę zEACCES
(Odmowa zezwolenia), jeśli użytkownik nie ma uprawnień do odczytu:(Zwróć uwagę, że
-> target
brakuje części w danych wyjściowych drugiegols -l
polecenia, i żecat symlink
nadal się powiodło i wydrukowało zawartośćtarget
pliku, nawet jeśli użytkownik nie miał uprawnień do odczytusymlink
.)NetBSD najwyraźniej oferuje specjalną opcję montowania o nazwie,
symperm
która, jeśli jest ustawiona, powoduje symboliczne uprawnienia do odczytu / wykonaniareadlink()
łącza do kontroli i przejścia łącza.źródło
źródło