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.
źródło
/
, których usunięcie byłoby równie złe (/etc/
na przykład). Po prostu nie jest zadaniemrm
decydowanie, które katalogi można łatwo usunąć, a które nie.Odpowiedzi:
rm
jest narzędziem systemowym niskiego poziomu. Narzędzia te są zbudowane tak prosto, jak to możliwe, ponieważ muszą być obecne w dowolnym systemie.rm
oczekuje 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 dorm
, więc rzeczywiste polecenie wymagające specjalnego przypadku byłoby podobnerm /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 linuxrm
ma domyślną ochronę przed zniszczeniem systemu poprzez odmowę usunięcia/
bez--no-preserve-root
opcji.Domyślnie istnieją trzy zabezpieczenia przed usunięciem systemu w ten sposób:
Aby usunąć całą zawartość folderu, zamiast uruchamiać
rm /path/to/folder/*
, zrób torm -rf /path/to/folder
,mkdir /path/to/folder
ponieważ spowoduje to włączenie--preserve-root
ochrony, a także usunięcie wszelkich plików dotf z folderuźródło
/
wymagałoby wielu kombinacji i rozważań, więc nie jest to praktyczne. Wracając do idei standardów, dodanie takich kontrolisafe-rm
jest to opakowanierm
: 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ćrm
ze zweryfikowanymi argumentami. Nie jest to ani bardzo skomplikowane, ani podatne na błędy.Poznaj
safe-rm
„opakowanie wokółrm
polecenia, aby zapobiec przypadkowemu usunięciu”:Jeśli powyższy link instalacyjny nie działa, po prostu użyj
sudo apt install safe-rm
zamiast tego. Domyślna konfiguracja zawiera już katalogi systemowe, spróbujmyrm /*
na przykład: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_photos
katalog, po prostu dodaj jego ścieżkę bezwzględną z tyldą rozstrzygniętą wsafe-rm
pliku konfiguracyjnym/etc/safe-rm.conf
, np .:W przypadkach, gdzie działają
rm
bezsudo
1 i-f
flaga jest to dobry pomysł, aby dodajalias
do muszli sprawia, żerm
„s-i
flagi domyślne. W ten sposóbrm
pyta się o każdy plik przed jego usunięciem: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”: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:
sudo
ignoruje aliasy , można to obejść, definiującalias sudo='sudo '
jednakźródło
Potwierdzenie już tam jest, problem tkwi
-f
w 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:
Z
--force
opcją jest inaczej : nie otrzymam żadnego potwierdzenia, a pliki zostaną usunięte.Problem polega na znajomości polecenia i jego parametrach, poruszaniu się po
man
poleceniu (także jeśli polecenie znajduje się w samouczku) w celu uzyskania przykładów: kiedy po raz pierwszy zobaczyłem polecenietar xzf some.tar.gz
, zadaję sobie pytanie: „co toxzf
znaczy? „Potem przeczytałem stronę ze smołą i odkryłem ją.
źródło
-f
to konieczne do usunięcia folderów. Otworzyłem nawet monit o potwierdzenie i narzekanie, ale dowiedziałem się, że-r
to po prostu potrzebne. Przypuszczam, żerm -rf
stał 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żywaniarm -r
naszego „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).rm
domyś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 musiszrm
poprosić o potwierdzenie, musisz przekazać-i
parametr. Na przykład:rm -ir ./*
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:
rm='rm -I'
aby monitować, jeśli usuwasz więcej niż 3 rzeczy.mv -i
icp -i
(wiele zwykłych przypadków użycia nie wymaga zastąpienia pliku docelowego).sudo='sudo '
zrobić rozszerzenie aliasu przy pierwszym argumencie dosudo
Uważam, że
rm -I
jest 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,\rm
aby wyłączyć rozwijanie aliasu, po upewnieniu się, że poprawnie wpisałem polecenie.Nie chcesz, aby dostać się do nawyku polegania na
rm -i
lub-I
aliasó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ęcznierm -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 narm -r
po zakończeniu pisania. Dlatego linia poleceń nigdy nie zawierarm -rf ~/
ani podobnych niebezpiecznych poleceń w żadnym momencie. Uzbrajasz go tylko, zmieniającls
narm
control-a, alt-d, aby przejść do początku linii i dodając-r
lub-f
po zakończeniu wpisywania~/some/sub/dir/
części polecenia.W zależności od tego, co usuwasz, faktycznie uruchom
ls -d
pierwszy lub nie, jeśli nie dodałoby to niczego do tego, co widzisz po uzupełnieniu tabulatorami. Możesz zacząć odrm
(bez-r
lub-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,
-rf
chyba że faktycznie potrzebujesz , aby wyciszyć monity o usunięcie plików tylko do odczytu.Poświęć trochę czasu na przemyślenie, zanim naciśniesz
sudo
komendę return . Zwłaszcza, jeśli nie masz pełnych kopii zapasowych lub teraz byłby zły czas, aby je przywrócić.źródło
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
Myślę, że możesz dodać alias lub funkcję, aby mieć pewność, że nigdy nie będzie można jej uruchomić.
źródło
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.
źródło
rm
pomocąsafe-rm
pomaga..project_root
lub, 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.chroot
byłoby użycie czegoś takiego jak Docker (który, jak sądzę, faktycznie używachroot
pod przykryciem). W przypadku innych plików, które musisz tylko odczytać, zamontuj system plików tylko do odczytu.rm
jest 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ą kodsudo
i nie zastanawiają się nad jego użyciem. Funkcje, które bezpośrednio modyfikować pliki, takie jakrm
,dd
,chroot
itp 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.
źródło