Dlaczego Linux / POSIX ma lchown, ale nie lchmod?

11

Wygląda na to, że Linux obsługuje zmianę właściciela dowiązania symbolicznego (tj. lchown), Ale zmiana trybu / uprawnienia dowiązania symbolicznego (tj. lchmod) Nie jest obsługiwana . O ile widzę, jest to zgodne z POSIX. Nie rozumiem jednak, dlaczego ktoś wspierałby jedną z tych operacji, ale nie obie. Jaka jest tego motywacja?

Florian Brucker
źródło
1
Uprawnienia dowiązania symbolicznego są zawsze lrwxrwxrwx. To chmodnie ma sensu. Podążanie za linkiem prowadzi do uprawnień docelowych.
ott--
2
@ott: W Linuksie uprawnienia do dowiązania symbolicznego są zawsze tymi, które dałeś dokładnie, ponieważ Linux nie obsługuje lchmod. Ale inne systemy uniksopodobne go obsługują (np. Mac OS X ), więc pytanie brzmi, dlaczego Linux nie obsługuje, gdy obsługuje lchown.
Florian Brucker

Odpowiedzi:

9

Linux, podobnie jak większość systemów uniksopodobnych (Apple OS / X jest jednym z nielicznych wyjątków), ignoruje uprawnienia do dowiązań symbolicznych, na przykład w przypadku rozwiązywania ich celów.

Jednak własność dowiązań symbolicznych, podobnie jak innych plików, jest istotna, jeśli chodzi o pozwolenie na zmianę nazwy lub odłączenie ich wpisów w katalogach, które mają tustawiony bit, np /tmp.

Aby móc usunąć lub zmienić nazwę pliku (dowiązanie symboliczne lub nie) /tmp, musisz być właścicielem pliku. To jeden z powodów, dla których warto zmienić własność dowiązania symbolicznego (aby udzielić lub usunąć uprawnienia do rozłączenia / zmiany nazwy).

$ ln -s / /tmp/x
$ rm /tmp/x
# OK removed

$ ln -s / /tmp/x
$ sudo chown -h nobody /tmp/x
$ rm /tmp/x
rm: cannot remove ‘/tmp/x’: Operation not permitted

Ponadto, jak wspomniał Mark Plotnick w swojej obecnie usuniętej odpowiedzi , aplikacje lchown()do tworzenia kopii zapasowych i archiwizacji muszą przywracać dowiązania symboliczne do swoich pierwotnych właścicieli. Inną opcją byłoby przełączenie euid i egid przed utworzeniem dowiązania symbolicznego, ale nie byłoby to wydajne i nie skomplikowałoby właściwego zarządzania katalogiem, w którym wyodrębniono dowiązanie symboliczne.

Stéphane Chazelas
źródło
Nie jestem pewien, czy jest to oryginalna motywacja, ale daje powód, dla którego projekt jest użyteczny. Dzięki!
Florian Brucker,
0

W posixie nie ma funkcji lchmod (), ale fchmodat (), która pozwoliłaby ustawić uprawnienia dowiązania symbolicznego. Nadal nie wymaga to oceny uprawnień dowiązań symbolicznych.

schily
źródło
1
OP wie, że brak posiadania lchmodjest zgodny z POSIX. Co dodaje ta odpowiedź, której nie ma jeszcze w pytaniu?
muru
Operator zapytał, dlaczego obsługiwana jest tylko jedna funkcja, i wyjaśniłem, że praktycznie obie są dostępne, ale nie pod wymienioną nazwą.
schily
1
Jak to? Standard mówi : Niektóre implementacje mogą pozwolić na zmianę trybu dowiązań symbolicznych. Nie jest to obsługiwane przez interfejsy w specyfikacji POSIX. Systemy z taką obsługą zapewniają interfejs o nazwie lchmod (). Do obsługi takich implementacji fchmodat () ma parametr flagi. Wszystko to mówi, że istnieje flaga dla fchmodat, która pozwala implementacji zmienić permlinlink perm. Nie musi to koniecznie.
muru
Poprawnie, ponieważ uprawnienia do dowiązań symbolicznych nie są oceniane od 35 lat, zmiana trybów nie ma sensu. Fchmodat () istnieje dla ortogonslity. Jedyną prawdziwą zaletą była futimensat (), ponieważ ustawialne znaczniki czasu dla dowiązań symbolicznych pomagają ludziom zrozumieć drzewo katalogów.
schily
@schilly, OS / X honoruje uprawnienia do dowiązań symbolicznych. Tam, jeśli nie masz uprawnień do odczytu, nie możesz rozwiązać ich celów.
Stéphane Chazelas