Dlaczego można usunąć cały system plików?

24

Po popełnieniu niesławnego błędu poprzez usunięcie całego mojego systemu plików sudo rm -rf /*, odzyskanie od strasznych szkód, które wyrządziłem i poradzenie sobie z faktem, że właśnie straciłem 6 lat życia, zacząłem się zastanawiać, dlaczego w ogóle można to zrobić, i co można zrobić, aby zapobiec występowaniu tego błędu?

Jednym z zaproponowanych mi rozwiązań jest cofnięcie dostępu do konta root z mojego konta, ale jest to niewygodne, ponieważ wiele poleceń wymaga dostępu do konta root, a kiedy trzeba uruchamiać kilkadziesiąt poleceń każdego dnia, jest to denerwujące.

Tworzenie kopii zapasowej systemu to oczywisty sposób. Ale przywrócenie kopii zapasowej wymaga również przestojów, a w zależności od systemu może to być dni lub tygodnie, co w niektórych przypadkach może być nie do zaakceptowania.

Moje pytanie brzmi: dlaczego nie wdrożyć potwierdzenia, gdy użytkownik próbuje usunąć swój system plików? Tak więc, kiedy naprawdę chcesz to zrobić, po prostu naciśnij Y lub wejdź, a jeśli nie, przynajmniej nie stracisz wszystkiego.

Mister_Fix
źródło
20
„Dlaczego w ogóle można to zrobić?” Dlaczego to nie powinno być możliwe? Istnieją całkowicie dobre powody, aby usunąć zawartość hierarchii katalogów i istnieje wiele podzbiorów /, których usunięcie byłoby równie złe ( /etc/na przykład). Po prostu nie jest zadaniem rmdecydowanie, które katalogi można łatwo usunąć, a które nie.
chepner
2
Tytuł mówi „Dlaczego można usunąć system?” podczas gdy samo pytanie brzmi: „Moje pytanie brzmi: dlaczego nie wdrożyć potwierdzenia, gdy użytkownik próbuje usunąć swój system plików?”. To sprawia, że ​​pytanie jest niejasne. Które z nich jest Twoim aktualnym pytaniem, abyśmy przynajmniej wiedzieli, na co odpowiedzieć?
Zmodyfikuj
3
Jakie jest tutaj pytanie? Widzę trzy: (1) Dlaczego jest to możliwe? (2) Jak temu zapobiec? Oraz (3) Dlaczego nie wdrożyć potwierdzenia? - To nie to samo pytanie, pierwsze z pytaniem o rozumowanie, drugie o narzędzia. (Trzeci jest związany z drugim, ale wciąż nie jest taki sam. Potwierdzenie to nie jedyny sposób, aby temu zapobiec.)
ilkkachu
10
Jeśli nie pytasz autora o wyjaśnienia, nie komentuj wcale . Widzę tu wiele gratulujących komentarzy, wyjaśniających, że to wina OP, że nie wiedzą, co oznaczają flagi, albo że nie mają kopii zapasowej ani nic takiego. Bardzo się cieszę, że tak wielu naszych użytkowników jest na tyle mądrych, że ma kopie zapasowe i nie wykonuje poleceń, których nie rozumie. To dla nich absolutnie wspaniałe, ale zasadniczo nieprzydatne dla PO, który prawdopodobnie nauczył się już tej lekcji. Przestańmy więc wygrzewać się we własnym blasku i po prostu odpowiedz na pytanie.
terdon

Odpowiedzi:

16

rmjest narzędziem systemowym niskiego poziomu. Narzędzia te są zbudowane tak prosto, jak to możliwe, ponieważ muszą być obecne w dowolnym systemie. rmoczekuje się, że będzie dobrze znany, szczególnie w odniesieniu do monitów o potwierdzenie, aby można go było używać w skryptach.

Dodanie specjalnego przypadku w celu wyświetlenia monitu rm /*nie byłoby możliwe, ponieważ polecenie rm nie widzi tego w tej formie. Symbol *wieloznaczny jest rozszerzany przez powłokę przed przekazaniem do rm, więc rzeczywiste polecenie wymagające specjalnego przypadku byłoby podobne rm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz. Dodanie kodu do sprawdzenia tego przypadku (który prawdopodobnie będzie różny dla różnych linuksów) byłoby złożonym wyzwaniem, a także podatnością na subtelne błędy. Standardowy linux rmma domyślną ochronę przed zniszczeniem systemu poprzez odmowę usunięcia /bez --no-preserve-rootopcji.

Domyślnie istnieją trzy zabezpieczenia przed usunięciem systemu w ten sposób:

  1. Uprawnienia - zwykli użytkownicy nie będą mogli usuwać ważnych plików. Ominąłeś to sudo
  2. Katalogi - domyślnie rm nie usuwa katalogów. Ominąłeś to flagą -r
  3. Zapis plików chronionych - domyślnie rm poprosi o potwierdzenie przed usunięciem pliku chronionego przed zapisem (nie zatrzymałoby to wszystkich szkód, ale może wyświetlił monit, zanim system stanie się niemożliwy do odzyskania). Ominąłeś tę ochronę flagą -f

Aby usunąć całą zawartość folderu, zamiast uruchamiać rm /path/to/folder/*, zrób to rm -rf /path/to/folder, mkdir /path/to/folderponieważ spowoduje to włączenie --preserve-rootochrony, a także usunięcie wszelkich plików dotf z folderu

rhellen
źródło
3
„Oczekuje się, że rm ma dobrze znane zachowanie” i jest w rzeczywistości jednym z narzędzi określonych przez standard POSIX. „on * symbol wieloznaczny jest rozszerzany przez powłokę przed przekazaniem do rm” Dokładnie, więc dodanie kontroli dla wszystkich typów parametrów, które mogą być dowiązaniami symbolicznymi do rzeczywistych katalogów i plików, /wymagałoby wielu kombinacji i rozważań, więc nie jest to praktyczne. Wracając do idei standardów, dodanie takich kontroli
złamałoby
Właśnie dlatego safe-rmjest to opakowanie rm: w ten sposób może sprawdzić każdy pojedynczy argument (zamiast całego losowego wiersza poleceń), sprawdzić, czy nie ma go na konfigurowalnej czarnej liście, a dopiero potem wywołać rmze zweryfikowanymi argumentami. Nie jest to ani bardzo skomplikowane, ani podatne na błędy.
deser
59

Poznaj safe-rmZainstaluj Safe-RM„opakowanie wokół rmpolecenia, aby zapobiec przypadkowemu usunięciu”:

safe-rm zapobiega przypadkowemu usunięciu ważnych plików, zastępując rmje opakowaniem, które sprawdza podane argumenty względem konfigurowalnej czarnej listy plików i katalogów, których nigdy nie należy usuwać.

Użytkownicy, którzy spróbują usunąć jeden z tych chronionych plików lub katalogów, nie będą mogli tego zrobić i zamiast tego zostanie wyświetlony komunikat ostrzegawczy. ( man safe-rm)

Jeśli powyższy link instalacyjny nie działa, po prostu użyj sudo apt install safe-rmzamiast tego. Domyślna konfiguracja zawiera już katalogi systemowe, spróbujmy rm /*na przykład:

$ rm /*
safe-rm: skipping /bin
safe-rm: skipping /boot
safe-rm: skipping /dev
safe-rm: skipping /etc
safe-rm: skipping /home
safe-rm: skipping /lib
safe-rm: skipping /proc
safe-rm: skipping /root
safe-rm: skipping /sbin
safe-rm: skipping /sys
safe-rm: skipping /usr
safe-rm: skipping /var
…

Jak widzisz, to uniemożliwiłoby ci usunięcie /home, gdzie, jak sądzę, twoje osobiste pliki są przechowywane. Nie uniemożliwia to jednak usunięcia ~ani żadnego z jego podkatalogów, jeśli spróbujesz je usunąć bezpośrednio. Aby dodać ~/precious_photoskatalog, po prostu dodaj jego ścieżkę bezwzględną z tyldą rozstrzygniętą w safe-rmpliku konfiguracyjnym /etc/safe-rm.conf, np .:

echo /home/dessert/precious_photos | sudo tee -a /etc/safe-rm.conf

W przypadkach, gdzie działają rmbez sudo1 i -fflaga jest to dobry pomysł, aby dodajalias do muszli sprawia, że rm„s -iflagi domyślne. W ten sposób rmpyta się o każdy plik przed jego usunięciem:

alias rm='rm -i'

Podobnie użyteczną flagą jest to -I, że ostrzega „tylko raz przed usunięciem więcej niż trzech plików lub podczas usuwania rekurencyjnego”, co jest „mniej ingerujące niż -i, a jednocześnie zapewnia ochronę przed większością błędów”:

alias rm='rm -I'

Ogólne niebezpieczeństwo związane z tymi pseudonimami polega na tym, że łatwo przyzwyczaisz się polegać na nich, aby cię uratować, co może źle wpłynąć na sytuację w przypadku korzystania z innego środowiska.


1: sudoignoruje aliasy , można to obejść, definiując alias sudo='sudo 'jednak

deser
źródło
25

Potwierdzenie już tam jest, problem tkwi -fw poleceniu, to znaczy --force; Gdy użytkownik wymusza operację, przypuszcza, że ​​wie, co robi (oczywiście błąd zawsze może się pojawić).

Przykład:

 rm -r ./*
 rm: remove write-protected regular file './mozilla_mvaschetto0/WEBMASTER-04.DOC'? N
 rm: cannot remove './mozilla_mvaschetto0': Directory not empty
 rm: descend into write-protected directory './pulse-PKdhtXMmr18n'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-bolt.service-rZWMCb'? n
 rm: descend into write-protected directory './systemd-private-     890f5b31987b4910a579d1c49930a591-colord.service-4ZBnUf'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-fwupd.service-vAxdbk'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-minissdpd.service-9G8GrR'? 
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-ModemManager.service-s43zUX'? nn
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-rtkit-daemon.service-cfMePv'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-systemd-timesyncd.service-oXT4pr'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-upower.service-L0k9rT'? n

Z --forceopcją jest inaczej : nie otrzymam żadnego potwierdzenia, a pliki zostaną usunięte.

Problem polega na znajomości polecenia i jego parametrach, poruszaniu się po manpoleceniu (także jeśli polecenie znajduje się w samouczku) w celu uzyskania przykładów: kiedy po raz pierwszy zobaczyłem polecenie tar xzf some.tar.gz, zadaję sobie pytanie: „co to xzfznaczy? „

Potem przeczytałem stronę ze smołą i odkryłem ją.

AtomiX84
źródło
Nie sądzę, żeby miało to znaczenie. W momencie, w którym rm najpierw prosi o plik chroniony przed zapisem lub inny plik, mógł już usunąć całą masę ważnych plików.
Jonas Schäfer
1
Dlatego osobiście zawsze uważałem, że jest -fto konieczne do usunięcia folderów. Otworzyłem nawet monit o potwierdzenie i narzekanie, ale dowiedziałem się, że -rto po prostu potrzebne. Przypuszczam, że rm -rfstał się normą, ponieważ jest tak przydatny w skrypcie (nie chcesz, aby skrypt się nie udał tylko dlatego, że próbujesz usunąć rzeczy, które nie istnieją), więc często go widzisz, ale przypuszczam, że potrzebujemy zachować czujność w kwestii używania rm -rnaszego „domyślnego” ustawienia w powłoce (co zrozumiałe, nie powinno być żadnych „domyślnych” założeń, których nie rozumiesz, szczególnie w przypadku sudo, ale ludzie będą ludźmi i przynajmniej to jest bezpieczniejsze).
Captain Man
2
Rmdir to najbezpieczniejszy sposób na usunięcie folderu
AtomiX84
rmdomyślnie nie prosi o potwierdzenie, żąda tylko chronionych przed zapisem katalogów i plików. Jeśli uruchomiłeś to polecenie na swoim komputerze, prawdopodobnie usunąłeś wiele własnych plików. Jeśli musisz rmpoprosić o potwierdzenie, musisz przekazać -iparametr. Na przykład:rm -ir ./*
Dan
8

Uruchamianie bez kopii zapasowych oznacza, że ​​musisz być bardzo ostrożny, aby nigdy nie popełniać błędów. I mam nadzieję, że Twój sprzęt nigdy nie zawiedzie. (Nawet RAID nie uchroni cię przed uszkodzeniem systemu plików spowodowanym wadliwą pamięcią RAM.) Więc to twój pierwszy problem. (Zakładam, że już to wiesz i będziesz robić kopie zapasowe w przyszłości.)


Są jednak rzeczy, które możesz zrobić, aby zmniejszyć prawdopodobieństwo takich błędów:

  • alias, rm='rm -I'aby monitować, jeśli usuwasz więcej niż 3 rzeczy.
  • alias mv i cp do mv -ii cp -i(wiele zwykłych przypadków użycia nie wymaga zastąpienia pliku docelowego).
  • alias sudo='sudo 'zrobić rozszerzenie aliasu przy pierwszym argumencie dosudo

Uważam, że rm -Ijest o wiele bardziej przydatny niż rm -i. Zwykle nie wyświetla monitu podczas normalnego użytkowania, więc tet pyta, gdy nie spodziewałeś się, że jest to znacznie bardziej zauważalne / lepsze ostrzeżenie. Z -i(zanim odkryłem -I), przyzwyczaiłem się do pisania, \rmaby wyłączyć rozwijanie aliasu, po upewnieniu się, że poprawnie wpisałem polecenie.

Nie chcesz, aby dostać się do nawyku polegania na rm -ilub -Ialiasów cię uratować . To twoja linia bezpieczeństwa, która, jak masz nadzieję, nigdy się nie przyda. Jeśli faktycznie chcę interaktywnie wybrać, które dopasowania mam usunąć, lub nie jestem pewien, czy moja glob może pasować do dodatkowych plików, piszę ręcznie rm -i .../*whatever*. (Również dobry nawyk na wypadek, gdybyś kiedykolwiek przebywał w środowisku bez swoich pseudonimów).

Broń się przed palcami tłuszczu Enter, pisząc ls -d /*foo*najpierw , a następnie strzałkę w górę i zmień to na rm -rpo zakończeniu pisania. Dlatego linia poleceń nigdy nie zawiera rm -rf ~/ani podobnych niebezpiecznych poleceń w żadnym momencie. Uzbrajasz go tylko, zmieniając lsna rmcontrol-a, alt-d, aby przejść do początku linii i dodając -rlub -fpo zakończeniu wpisywania ~/some/sub/dir/części polecenia.

W zależności od tego, co usuwasz, faktycznie uruchom ls -dpierwszy lub nie, jeśli nie dodałoby to niczego do tego, co widzisz po uzupełnieniu tabulatorami. Możesz zacząć od rm(bez -rlub -rf), więc jest to po prostu control-a / control-right (lub alt + f) / space / -r.

(Przyzwyczaj się do bash / readline potężnych skrótów klawiszowych do edycji, aby szybko się poruszać, takich jak strzałki sterujące lub alt + f / b, aby poruszać się po słowach i zabijać całe słowa za pomocą alt + backspace lub alt + d lub control-w. I kontroluj -u zabij do początku linii. I kontroluj- / cofnij edycję, jeśli przejdziesz o jeden krok za daleko. I oczywiście historię strzałek w górę, którą możesz przeszukać za pomocą control-r / control-s.)

Unikaj, -rfchyba że faktycznie potrzebujesz , aby wyciszyć monity o usunięcie plików tylko do odczytu.

Poświęć trochę czasu na przemyślenie, zanim naciśniesz sudokomendę return . Zwłaszcza, jeśli nie masz pełnych kopii zapasowych lub teraz byłby zły czas, aby je przywrócić.

Peter Cordes
źródło
6

Krótka odpowiedź brzmi: nie uruchamiać takiego polecenia.

Długa historia jest taka, że ​​jest to część personalizacji. Zasadniczo w grę wchodzą tutaj dwa czynniki. Jednym z nich jest fakt, że możesz modyfikować wszystkie pliki.

Po drugie, polecenie rm oferuje pomocny cukier syntaktyczny do usuwania wszystkich plików w folderze.

Skutecznie można to przeformułować jako pojedynczą prostą zasadę uniksowych maszyn. Wszystko jest plikiem . Aby poprawić sytuację, istnieją kontrole dostępu, ale są one zastępowane przez użycie

sudo

Myślę, że możesz dodać alias lub funkcję, aby mieć pewność, że nigdy nie będzie można jej uruchomić.

HaoZeke
źródło
4

Jeśli użycie systemowej przestrzeni plików nie jest ogromne (a obecnie „ogromne” oznacza „setki gigabajtów lub więcej”), stwórz jakieś instancje maszyny wirtualnej i zawsze działaj wewnątrz jednego. Odzyskiwanie wymagałoby tylko użycia kopii zapasowej.

Możesz też stworzyć więzienie chroot i pracować w nim. Nadal będziesz potrzebować trochę odzyskiwania, jeśli zostanie zniszczone, ale byłoby to łatwiejsze z działającym (zamykającym) systemem do pracy.

Loren Rosen
źródło
Jest to prawdopodobnie najskuteczniejsza odpowiedź, ponieważ może chronić przed wszelkimi uszkodzeniami, nawet skryptami stron trzecich. Będziesz musiał się martwić tylko o rzeczywiste złośliwe oprogramowanie.
PyRulez
Myśl pod innym kątem. Warto przede wszystkim zapytać, dlaczego trzeba usuwać rekurencyjnie. Może naprawdę potrzebne są skrypty do usuwania projektu itp.
Loren Rosen
„Warto przede wszystkim zapytać, dlaczego trzeba usuwać rekurencyjnie”. To, że nie ma wbudowanego polecenia, nie oznacza, że ​​nadal nie możesz popełnić błędu. Skrypty innych firm mogą usuwać pliki jeden po drugim z jakiegoś katalogu. Są też inne sposoby na rozwarcie systemu, który dotyka tylko jednego pliku. Jednak przynajmniej zastąpienie rmpomocą safe-rmpomaga.
PyRulez
Moje wyobrażenie o skrypcie było takie, że miałoby ono wbudowane pojęcie „projektu” lub podobnego. Być może miałbyś pusty plik w katalogu głównym projektu o nazwie .project_rootlub, jeśli system plików go obsługuje, atrybut w samym katalogu. Następnie skrypt przejdzie do drzewa plików w poszukiwaniu katalogu głównego projektu i narzeka, że ​​bieżącego katalogu nie ma w projekcie. Lub, jeśli wszystkie projekty znajdują się w tym samym miejscu, skrypt może wymagać podania nazwy projektu. Nadal możesz usunąć niewłaściwy projekt, ale nie zniszczyć całego systemu.
Loren Rosen
... wariantem chrootbyłoby użycie czegoś takiego jak Docker (który, jak sądzę, faktycznie używa chrootpod przykryciem). W przypadku innych plików, które musisz tylko odczytać, zamontuj system plików tylko do odczytu.
Loren Rosen
3

rmjest bardzo starym poleceniem uniksowym i prawdopodobnie nie został zaprojektowany z myślą o łatwości obsługi. Stara się robić dokładnie to, o co prosi, kiedy ma uprawnienia. Problemem wielu nowych użytkowników jest to, że często widzą kod sudoi nie zastanawiają się nad jego użyciem. Funkcje, które bezpośrednio modyfikować pliki, takie jak rm, dd, chrootitp wymagają zachowania szczególnej ostrożności w użyciu.

Obecnie lubię używać trash(bez sudo) z trash-cli . Działa podobnie jak Kosz z Windows, dzięki czemu można łatwo odzyskać przypadkowo usunięte pliki. Ubuntu ma już folder Kosz i funkcję przenoszenia do kosza wbudowaną w Pliki.

Nawet wtedy możesz popełniać błędy, więc rób kopie zapasowe całego systemu plików.

qwr
źródło