Dlaczego rm może usuwać pliki tylko do odczytu?


91

Jeśli utworzę plik, a następnie zmienię jego uprawnienia na 444(tylko do odczytu), w jaki sposób rmmogę go usunąć?

Jeśli to zrobię:

echo test > test.txt
chmod 444 test.txt
rm test.txt

... rmzapyta, czy chcę usunąć plik chroniony przed zapisem test.txt. Spodziewałbym się, że rmnie uda mi się usunąć takiego pliku i że będę musiał zrobić chmod +w test.txtpierwszy. Jeśli robię rm -f test.txtnastępnie rmusunie plik, nawet bez pytania, mimo że jest tylko do odczytu.

Czy ktoś może to wyjaśnić? Używam Ubuntu 12.04 / bash.


Wyjaśnienie: Uruchamiam te polecenia jako mój zwykły użytkownik, a nie jako root.
Magnus,

Odpowiedzi:


104

Wszystkie rmpotrzeby to uprawnienie do zapisu i wykonania w katalogu nadrzędnym. Uprawnienia do samego pliku są nieistotne.

Oto odniesienie, które wyjaśnia model uprawnień jaśniej niż kiedykolwiek:

Każda próba dostępu do danych pliku wymaga pozwolenia na odczyt. Każda próba modyfikacji danych pliku wymaga pozwolenia na zapis. Każda próba wykonania pliku (programu lub skryptu) wymaga pozwolenia na wykonanie ...

Ponieważ katalogi nie są używane w taki sam sposób jak zwykłe pliki, uprawnienia działają nieco (ale tylko nieznacznie) inaczej. Próba wyświetlenia listy plików w katalogu wymaga uprawnień do odczytu dla katalogu, ale nie dotyczy plików w nim zawartych. Próba dodania pliku do katalogu, usunięcia pliku z katalogu lub zmiany nazwy pliku wymaga uprawnień do zapisu w tym katalogu, ale (co może zaskakujące) nie dotyczy plików w nim zawartych. Uprawnienie do wykonywania nie dotyczy katalogów (katalog nie może być również programem). Ale ten bit zezwolenia jest ponownie wykorzystywany w katalogach do innych celów.

Wymagane jest zezwolenie na wykonanie katalogu, aby móc w nim cd (tzn. Aby jakiś katalog stał się bieżącym katalogiem roboczym).

Aby uzyskać dostęp do informacji o „i-węzłach” plików w katalogu, konieczne jest wykonanie. Potrzebujesz tego do przeszukiwania katalogu w celu odczytania i-węzłów plików w nim zawartych. Z tego powodu uprawnienie do wykonywania katalogu jest często nazywane zamiast tego uprawnieniem do wyszukiwania.


2
Więc jeśli chciałbym stworzyć katalog, w którym niektóre pliki nie mogłyby zostać usunięte / zmienione bez zrobienia najpierw chmod, ale inne mogłyby być swobodnie zapisywane, czy byłoby to niemożliwe? Musiałbym przeskoczyć do katalogu 555, co oznaczałoby, że nie można tworzyć ani modyfikować plików w tym katalogu.
Magnus,

3
@Magnus - Oczywiście nic nie stoi na przeszkodzie, abyś utworzył zapisywalny katalog podrzędny w katalogu tylko do odczytu i przechował w nim zapisywalne pliki. Sam katalog potomny nie może zostać usunięty, ale jego zawartość może.
ire_and_curses,

7
Czy nie można ulepszyć katalogu +t, aby ludzie nie mogli już modyfikować ani usuwać plików w tym katalogu, których nie są właścicielami, nawet jeśli mają dostęp do zapisu w tym katalogu?
Shadur

3
@Magnus Jeśli masz dostęp do roota (w tym sudo), możesz użyć, chattraby dodać niezmienną flagę do plików. Jeśli nie, to ire_and_curses jest całkiem poprawne.
James O'Gorman,

6
Nieużywanie rm -f działa tylko tak długo, jak jestem trzeźwy ... plus, nie mam pojęcia, co piszą skrypty bash, które piszę, czy nie
Magnus

53

Ok, zgodnie z Twoim komentarzem do ire_and_curses, naprawdę chcesz, aby niektóre pliki były niezmienne. Możesz to zrobić za pomocą chattrpolecenia. Na przykład:

na przykład

$ cd /tmp
$ touch immutable-file
$ sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

Nie można nic zrobić z niezmiennym plikiem - nie można go usunąć, edytować, nadpisać, zmienić nazwy, chmod lub chown ani nic innego. Jedyne, co możesz z tym zrobić, to przeczytać (jeśli pozwalają na to uprawnienia unixowe) i (jako root) chattr -iusunąć niezmienny bit.

Nie wszystkie systemy plików obsługują wszystkie atrybuty. AFAIK, niezmienny jest obsługiwany przez wszystkie popularne systemy plików Linux (w tym ext2 / 3/4 i xfs. Zfsonlinux obecnie nie obsługuje atrybutów)


3
jest to czasami przydatne. przy okazji nawet root nie może modyfikować ani usuwać pliku niezmiennego (nie bez uprzedniego usunięcia atrybutu niezmiennego). także btw, użyj, lsattraby wyświetlić atrybuty.
cas

2
+1 - zapomniałem o atrybutach i byłem tak zajęty odpowiedzią na dosłowne pytanie, rmże to nigdy nawet nie przyszło mi do głowy ...
ire_and_curses

2
Jest to specyficzne dla systemu plików i może przynieść więcej problemów, które rozwiązuje.
Stéphane Gimenez,

4
@Magnus: możliwe problemy obejmują tworzenie kopii zapasowych (nie wszystkie narzędzia do tworzenia kopii zapasowych będą tworzyć atrybuty - w rzeczywistości większość nie zrobi tego) i przywracanie (jeśli przywrócisz do katalogu, który już zawiera niezmienny plik, niektóre programy będą traktować niezdolność do zastąpienia tego pliku jako błąd krytyczny i przerwanie). Możesz także spowodować zamieszanie, jeśli zapomnisz, że plik stał się niezmienny i nie możesz dowiedzieć się, dlaczego nie możesz go usunąć .... komunikat o błędzie „Operacja niedozwolona” to ten sam komunikat o błędzie, który pojawia się w przypadku niektórych systemów plików korupcja, która może prowadzić do potencjalnie niebezpiecznej nadmiernej reakcji.
cas

1
Państwo może skopiować (cp) plik niezmienny.
Ośmiornica

0

Jedna odpowiedź na to pytanie głosi, że możesz usunąć plik z katalogu tylko wtedy, gdy ma tylko writeuprawnienie, jest całkowicie błędny! po prostu spróbuj! Daj katalogowi tylko writeuprawnienia i spróbuj usunąć, nie możesz!
Aby usunąć plik w katalogu, potrzebujesz zarówno uprawnień, jak writei executekatalogu

Wróćmy do pytania: aby usunąć plik za pomocą rm, usuwasz tylko informacje z jego i-węzła z katalogu, tzn. Nie jesteś shreddingnim z dysku. Jeśli informacji i-węzła pliku nie ma w katalogu, nie możesz uzyskać do niego dostępu (również dlatego, że go nie widzisz, ponieważ nie ma go w katalogu macierzystym), tzn. Jest on dla ciebie usuwany .
Aby więc usunąć plik z katalogu, wystarczy uprawnienia do katalogu; uprawnienia do tego pliku są nieistotne

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.