Mam folder z -wx
uprawnieniami folder1
i innym folderem w nim folder2
z rwx
uprawnieniami.
Próbowałem usunąć folder1
za pomocą tego polecenia:
rm -r folder1
Ale dostałem następujący błąd:
rm: cannot remove 'folder1': Permission denied
Powodem, dla którego myślę, że dostałem ten błąd, jest to, że rm
program musi najpierw pobrać zawartość folder1
(uzyskać nazwy plików i folderów w środku folder1
), aby móc usunąć tę zawartość (ponieważ nie można usunąć pliku lub folder bez znajomości jego nazwy, jak sądzę), a następnie rm
program może się usunąć folder1
.
Ponieważ jednak folder1
nie ma read
pozwolenia, rm
program nie może pobrać jego zawartości, a zatem nie może usunąć swojej zawartości, a ponieważ nie może usunąć swojej zawartości, nie może jej usunąć.
Mam rację?
linux
permissions
rm
Jan
źródło
źródło
Odpowiedzi:
Myślę, że Twoja analiza jest poprawna: nie możesz usunąć katalogu, ponieważ jest on pusty i nie możesz go opróżnić, ponieważ nie możesz zobaczyć jego zawartości.
Właśnie spróbowałem:
Kiedy pisałem „ty”, miałem na myśli każdy program, który możesz uruchomić. Twoje
rm -r
polecenie najpierw widzi, żefolder1
jest to katalog, więc próbuje odkryć jego zawartość, aby go opróżnić, ale kończy się niepowodzeniem z powodu braku uprawnień do odczytu, a następnie próbuje go usunąć, ale kończy się niepowodzeniem, ponieważ nie jest pusty. „Odmowa zezwolenia” wprowadza w błąd; Myślę, żermdir
bardziej odpowiedni byłby „Katalog niepusty” (np. Raporty).)źródło
Directory not empty
tym przypadku nie może się zgłosić, ponieważ nie wiedziałby, że jest pusty lub nie. Nadal pojawia się ten sam błąd podczas próby usunięcia pustego katalogu, w którym nie masz uprawnień do odczytu. (Proszę również zignorować mój poprzedni komentarz, nie miałem założonego ograniczenia myślenia).rmdir
jest w stanie zgłosić „Katalog nie jest pusty”. A jeśli przeczytasz mój test, zobaczysz, że akceptuje usunięciefolder1
katalogu bez pozwolenia na odczyt , gdy go opróżnię.Permission denied
kiedy próbuję,rm -r folder1
kiedy jest pusty. Korzystam z OpenBSD, nie Linux.-r
jest używany, każda pozycja katalogu (z wyjątkiem.
i..
) powinna zostać usunięta tak, jakby była operandem plikurm -r
. Wygląda na to, że GNUrm
po prostu robirmdir()
w katalogu, jeśli nie jest czytelny, ponieważ nie będzie w stanie uzyskać jego zawartości.Aby nastąpiło usunięcie, system musi być w stanie odczytać zawartość i określić, co należy usunąć.
Próbowałem symulować to, co próbujesz:
Jeśli spróbujemy usunąć bez uprawnień do odczytu, nie powiedzie się:
W przypadku dwóch prób różnica polega na tym, że nie można odczytać zawartości katalogu (getdents):
Z uprawnieniami do odczytu:
Aby zakończyć, nawet jeśli masz katalog z bitem wykonywalnym, nadal potrzebujesz uprawnień do odczytu, aby zobaczyć jego zawartość i usunąć folder. Jednak dla pliku to nie to samo.
źródło
Cóż, nie mam wystarczającej reputacji, aby skomentować odpowiedź ttaran7, więc wygląda na to, że odpowiedź będzie musiała być. Moje głosowanie nie jest również publicznie widoczne z powodu niskiej reputacji. Głosowałem za odpowiedzią na to, że w rzeczywistości uwzględniłem ślad wywołania systemowego, a nie tylko spekulacje.
Aby odpowiedzieć na pytanie OP: Tak, twoje rozumowanie było prawidłowe: blokuje się brak odczytu katalogu
Przebiegłem podobny ślad do tego, co zrobili (ttaran7), ponieważ podejrzewałem to samo rozumowanie:
rm
połączenie nie powiedzie się po nie przeczytaniu katalogu i to będzie koniec tego, nie ma szans na narzekać, że katalog jest pusty. Po drugim spojrzeniu na ślad, który wziąłem, zauważyłem, że wywołano systemowe wywołanie, aby mimo to spróbować odłączyć podaną nazwę pliku:Spójrz na czwartą linię:
unlinkat
... która kończy się niepowodzeniem, ponieważ katalog NIE jest pusty. To właśnie uważam za nieoczekiwane zachowanie, fakt, że próbuje on w ogóle usunąć katalog, mimo że nie ma uprawnień do odczytu.źródło