Jak usunąć niepusty katalog, który nie jest własnością użytkownika w systemie Linux?

10

Jeśli katalog „foo” jest własnością użytkownika A i zawiera katalog „bar”, który jest własnością użytkownika root, użytkownik A może po prostu go usunąć rmdir, co jest logiczne, ponieważ „foo” jest zapisywalne przez użytkownika A.

Ale jeśli „pasek” katalogu zawiera inny plik będący własnością użytkownika root, katalogu nie można usunąć, ponieważ pliki w nim muszą zostać najpierw usunięte, aby stał się pusty. Ale samego „paska” nie można zapisać, więc nie można w nim usunąć plików.

Czy jest na to jakiś sposób? Lub przekonaj mnie inaczej, dlaczego jest to konieczne.

Alex B.
źródło

Odpowiedzi:

7

Interpretacja 1: katalog jest podprzestrzenią systemu plików. Można go dalej podzielić na podprzestrzenie, tworząc w nim podkatalogi. Właścicielem katalogu foopowinny mieć kontrolę nad wszystkim wewnątrz podprzestrzeni: foo/bar, foo/bar/qux, itd.

Interpretacja 2: katalog jest podprzestrzenią systemu plików. Każdy katalog jest dołączony do innego katalogu, zwanego jego rodzicem. Właściciel katalogu fooma kontrolę nad wszystkim wewnątrz podprzestrzeni; jednak w przypadku podkatalogu foo/barwłaściciel fooma kontrolę nad tym, czy barmożna do niego dołączyć, fooale nie nad tym, co się w nim znajduje bar: tylko właściciel barma nad tym kontrolę.

Dowody przemawiające za interpretacją 2: jak zauważyłeś, sposób działania uprawnień. Ponadto fakt, że niektóre systemy plików Unix pozwalają na dołączenie katalogu do więcej niż jednego rodzica: nazywa się to posiadaniem wielu twardych dowiązań. (Posiadanie wielu twardych dowiązań jest wspólne dla zwykłych plików, ale zwykle jest odradzane lub zabronione dla katalogów, głównie ze względu na ryzyko tworzenia pętli, w których katalog jest usuwany przez swojego dziadka N razy - więc nie możesz dostać się do niego z katalogu głównego katalog, co jest bardzo częstym oczekiwaniem. Istnieje również problem, co zrobić, jeśli katalog ma 0 dowiązań twardych, ale nie jest pusty: ponieważ katalog nie jest przyłączony, chcesz go usunąć, ale co robisz z jego zawartość?)

Dowody na korzyść interpretacji 1: w praktyce katalogi mają samotnego rodzica, a zatem tworzą strukturę drzewa. I nie możesz uzyskać dostępu, foo/bar/quxchyba że masz uprawnienia do wykonywania, foojak również bar(oprócz tego, że istnieją nieco niejasne sposoby, aby uzyskać dostęp barbez dostępu foo). Zatem górne poziomy mają znaczenie.

Mówiąc bardziej praktycznie, w twojej sytuacji użytkownik A może to zrobić

śmieci mkdir
mv foo / bar garbage /
rmdir foo
Gilles „SO- przestań być zły”
źródło
1
To świetna odpowiedź (przytoczona), ale pozorna niekonsekwencja pozostaje dla mnie frustrująca. I chociaż praktyczny przykład przenoszenia paska na śmieci działa, pozostaje nam katalog o nazwie śmieci, którego nie można usunąć. Mam ten sam problem, z tym wyjątkiem, że jest to użytkownik A i użytkownik B, w którym B utknął w katalogu należącym do A, który A chce usunąć.
Paul Hooper
To dobre wytłumaczenie, ale przykład na końcu mvobejścia problemu nie działa dla mnie na Raspbian (nie próbowałem na żadnym innym systemie). Ponadto, po zbadaniu tego problemu, nie widziałem zastosowania mvjako rozwiązania wspomnianego nigdzie indziej. Rzeczywiście, w oparciu o moje rozumienie, jak działają uprawnienia, ma sens, że mvnie udaje się, gdy próbuję. Czy coś brakuje? A może ta funkcja uległa zmianie? @Gilles @PaulHooper
fvgs
@fvgs Nic się nie zmieniło, ale twoja sytuacja może mieć inne uprawnienia od tego. Sugeruję, abyś zadał nowe pytanie (w Unixie i Linuksie zamiast błędu serwera, ponieważ pytanie to byłoby prawdopodobnie nie na temat, gdyby zostało teraz zadane na SF) i podał wszystkie szczegóły swojej sytuacji.
Gilles „SO- przestań być zły”
@Gilles Czy mógłbyś wskazać mi dokumentację, odniesienie lub wzmiankę o opisanym przez ciebie zachowaniu mv? Mogę użyć mvdo zmiany nazwy katalogu paska. Oznacza to, że mvudaje się, dopóki nie próbuję przenieść paska poza bieżący katalog lub do innego katalogu. Ale podany przez ciebie przykład (który przesuwa pasek w górę katalogu) nie działa dla mnie (odmowa dostępu). Czy podany przykład zakłada określone warunki inne niż te określone w pytaniu?
fvgs
@fvgs Mój przykład nie przenosi barkatalogu do góry, przenosi go do katalogu, który posiadasz. garbagemoże znajdować się w dowolnym miejscu na tym samym systemie plików, niekoniecznie jako rodzeństwo foo.
Gilles „SO- przestań być zły”
0

Jedynym sposobem na obejście tego byłoby użycie setgid lub setuid w katalogu nadrzędnym lub użycie ACL.

Ustaw katalog setgid za pomocą

chmod g+s foo

Ustaw domyślną listę ACL za pomocą

setfacl -d -R -m g:group:rwx foo

Ustawia to jako domyślną listę ACL na tej ścieżce. Musisz zamontować system plików zawierający tę ścieżkę z opcją acl!

Teraz powiedz mi, dlaczego uważasz, że tego chcesz.

wzzrd
źródło
Problem polega na spójności. Nic nie powstrzymuje mnie przed usunięciem pliku lub pustego katalogu należącego do innego użytkownika w katalogu, który posiadam, ale jeśli nie jest pusty, nie mogę usunąć własnego katalogu.
Alex B,
W takim przypadku skorzystałbym z jednej z podanych opcji. Będą dla ciebie dobrze działać.
wzzrd
Często używam wielu kont na pulpicie (jednym z nich jest „główne konto użytkownika innego niż root”). Mogę też dostać taką sytuację, gdy zacznę make installod rootowania i zacznie coś budować.
Vi.
setgid w katalogu nadrzędnym nie pomaga. Po wykonaniu jako root cd ~user && mkdir qqq && touch qqq/qqqnie mogę pozbyć się qqq od użytkownika przez chmod g+s .i rm -Rf qqq.
Vi.
Mhm To prawdopodobnie sprawa umask. Jeśli twój katalog to 775, to setgid, a twój umask to 0002, to pliki można zapisywać w grupach, a zatem można je usunąć. Ale tak naprawdę nie działa z umask 0022 (który jest najczęściej domyślny). Powinienem to powiedzieć. Czy przetestowałeś opcję acl?
wzzrd