Jak zapobiec przypadkowemu rm -rf / *?

164

Po prostu pobiegłem rm -rf /*przypadkowo, ale miałem na myśli rm -rf ./*(zauważ gwiazdę po ukośniku).

alias rm='rm -i'i --preserve-rootdomyślnie mnie nie uratował, więc czy są na to jakieś automatyczne zabezpieczenia?


Nie byłem rootem i natychmiast anulowałem polecenie, ale były gdzieś jakieś odprężone uprawnienia, ponieważ zauważyłem, że mój monit Bash już się zepsuł. Nie chcę polegać na uprawnieniach i nie być rootem (mógłbym popełnić ten sam błąd sudo) i nie chcę szukać tajemniczych błędów z powodu jednego brakującego pliku gdzieś w systemie, więc kopie zapasowe sudosą dobre , ale chciałbym coś lepszego w tym konkretnym przypadku.


O myśleniu dwa razy i korzystaniu z mózgu. Używam tego właściwie! Ale używam go do rozwiązania złożonego zadania programistycznego obejmującego 10 różnych rzeczy. Jestem głęboko zanurzony w tym zadaniu, nie ma już mocy mózgu do sprawdzania flag i ścieżek, nawet nie myślę w kategoriach poleceń i argumentów, myślę w kategoriach działań takich jak „pusty aktualny katalog”, inna część mojego mózgu tłumaczy je na polecenia i czasami popełnia błędy. Chcę, żeby komputer je poprawił, przynajmniej te niebezpieczne.

Valentin Nemcev
źródło
13
Do Twojej wiadomości, możesz także rm -rf . /mydirzamiast tego rm -rf ./mydirzabić katalog, w którym się znajdowałeś. Zabijam to częściej.
user606723,
27
Aby użyć analogii pistoletu, to pytanie mówi, aby pistolet rozpoznał, że celuję w moją stopę, a nie strzelam, ale nie chcę ponosić żadnej odpowiedzialności za niecelowanie pistoletu w moją stopę. Pistolety i komputery są głupie, a jeśli zrobisz głupią rzecz, otrzymasz te wyniki. Postępując zgodnie z analogią broni, nic nie powstrzyma cię przed zranieniem, z wyjątkiem czujności i praktyki.
slillibri,
73
@slillibri Z wyjątkiem tego, że rmnie jest pistoletem, jest to program komputerowy, może być wystarczająco inteligentny, aby stwierdzić, że użytkownik zamierza usunąć niektóre ważne pliki i wygenerować ostrzeżenie (tak jak w rzeczywistości, jeśli spróbujesz obejść się rm -rf /bez gwiazdy).
Valentin Nemcev,
80
@slillibri Guns mają zabezpieczenia. Pytanie o to, jak zwiększyć bezpieczeństwo rmpolecenia, jest całkowicie uzasadnionym pytaniem sysadmin.
Gilles,
21
sudo rm / bin / rm nie jest zalecane, ale zapobiegnie większości rm :-)
Paul

Odpowiedzi:

220

Jedną z trików, które podążam, jest wprowadzenie #na początku podczas korzystania z rmpolecenia.

root@localhost:~# #rm -rf /

Zapobiega to przypadkowemu wykonaniu rmniewłaściwego pliku / katalogu. Po zweryfikowaniu usuń #od początku. Ta sztuczka działa, ponieważ w Bash słowo zaczynające się od #powoduje, że to słowo i wszystkie pozostałe znaki w tym wierszu zostaną zignorowane. Tak więc polecenie jest po prostu ignorowane.

LUB

Jeśli chcesz zapobiec ważnemu katalogowi, jest jeszcze jedna sztuczka.

Utwórz plik o nazwie -iw tym katalogu. Jak stworzyć taki dziwny plik? Za pomocą touch -- -ilubtouch ./-i

Teraz spróbuj rm -rf *:

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

Tutaj *rozwinie się -ido linii poleceń, więc twoje polecenie ostatecznie stanie się rm -rf -i. Dlatego polecenie wyświetli monit przed usunięciem. Możesz umieścić ten plik w /, /home/, /etc/, itd.

LUB

Użyj --preserve-rootjako opcji do rm. W rmzawartych w nowszych coreutilspakietach ta opcja jest domyślna.

--preserve-root
              do not remove `/' (default)

LUB

Użyj safe-rm

Fragment strony internetowej:

Safe-rm to narzędzie bezpieczeństwa, którego zadaniem jest zapobieganie przypadkowemu usunięciu ważnych plików poprzez zamianę / bin / rm na opakowanie, 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:

$ rm -rf /usr
Skipping /usr
Sachin Divekar
źródło
10
safe-rm wygląda bardzo dobrze, patrząc na to teraz ...
Valentin Nemcev
45
safe-rm jest schludne. To także sprytna sztuczka z -iplikiem. Hah Głupie bash
EricR
5
Niesamowite, jakie sztuczki są wykonywane w Uniksie.
WernerCD
4
Tworzenie pliku o nazwie -i jest absolutnie genialny. Mógłbym tego użyć około rok temu, kiedy przypadkowo uruchomiłem rm -rf / etc / * na VPS ... (na szczęście robię nocne migawki, więc mogłem je przywrócić w mniej niż 45 minut).
David W
9
To jest genialne. Czarnoksięstwo byłobytouch -- -rf
Mircea Vutcovici,
46

Twój problem:

Właśnie przypadkowo uruchomiłem rm -rf / *, ale miałem na myśli rm -rf ./* (zauważ gwiazdę po ukośniku).

Rozwiązanie: nie rób tego! W ramach praktyki nie używaj ./na początku ścieżki. Ukośniki nie dodają żadnej wartości do polecenia i powodują jedynie zamieszanie.

./*oznacza to samo co *, więc powyższe polecenie lepiej napisać jako:

rm -rf *

Oto powiązany problem. Często widzę następujące wyrażenie, w którym ktoś zakładał, że FOOjest ustawiony na coś podobnego /home/puppies. Widziałem to właśnie dzisiaj, w dokumentacji jednego z głównych dostawców oprogramowania.

rm -rf $FOO/

Ale jeśli FOOnie jest ustawiony, spowoduje to ocenę rm -rf /, która spróbuje usunąć wszystkie pliki w systemie. Końcowy ukośnik jest niepotrzebny, więc w praktyce nie używaj go.

Następujące czynności zrobią to samo i mniej prawdopodobne jest uszkodzenie systemu:

rm -rf $FOO

Nauczyłem się tych wskazówek na własnej skórze. Kiedy miałem 14 lat temu moje pierwsze konto administratora, przez przypadek uciekłem rm -rf $FOO/ze skryptu powłoki i zniszczyłem system. Czterej inni administratorzy spojrzeli na to i powiedzieli: „Tak. Każdy to robi raz. Oto twoje nośniki instalacyjne (36 dyskietek). Idź to naprawić.

Inne osoby tutaj polecają rozwiązania takie jak --preserve-rooti safe-rm. Jednak te rozwiązania nie są dostępne dla wszystkich wariantów Un * xe i mogą nie działać w systemach Solaris, FreeBSD i MacOSX. Ponadto safe-rmwymaga zainstalowania dodatkowych pakietów na każdym używanym systemie Linux. Jeśli polegasz na safe-rmtym, co stanie się, gdy rozpoczniesz nowe zadanie, a nie zostało ono safe-rmzainstalowane? Te narzędzia są kulą i o wiele lepiej jest polegać na znanych domyślnych ustawieniach i poprawić nawyki pracy.

Stefan Lasiewski
źródło
19
Mój przyjaciel powiedział mi, że nigdy nie używa rm -rf *. Zawsze najpierw zmienia katalog i używa określonego celu. Powodem jest to, że często wykorzystuje historię pocisku i martwi się, że takie polecenie w jego historii może wyskoczyć w niewłaściwym czasie.
haggai_e
@haggai_e: Dobra wskazówka. Kiedy byłem nowy w Uniksie, raz natknąłem się na błąd, który rm -rf *również został usunięty .i ... Byłem rootem, a to przeszło do niższych katalogów jak ../../..i było dość destrukcyjne. Od tego czasu staram się być bardzo ostrożny rm -rf *.
Stefan Lasiewski,
2
rm -rf $FOOnie pomoże, jeśli potrzebujesz rm -rf $FOO/$BAR. cd $FOO && rm -rf $BARpomoże, choć jest znacznie dłużej.
Victor Sergienko,
5
@VictorSergienko, z bash, co powiesz na określenie ${FOO:?}, jak w rm -rf ${FOO:?}/i rm -rf ${FOO:?}/${BAR:?}. Zapobiegnie to tłumaczeniu rm -rf /. Mam więcej informacji na ten temat w mojej odpowiedzi tutaj .
Acumenus,
@haggai_e: Uważam, że to jedna z najlepszych porad na ten temat. Spaliłem palec, używając rm -rf *w pętli for, która przez pomyłkę zmieniła katalog na niewłaściwy i ostatecznie usunąłem coś innego. Gdybym użył określonego celu, miałby znacznie mniejszą szansę na usunięcie niewłaściwej rzeczy.
richk
30

Ponieważ dotyczy to „Serverfault”, chciałbym powiedzieć:

Jeśli masz dziesiątki lub więcej serwerów, o sporej zespół administratorów / użytkowników, ktoś ma zamiar rm -rflub chownniewłaściwym katalogu.

Powinieneś mieć plan przywrócenia usługi, której dotyczy problem, przy możliwie najniższym MTTR.

Nie teraz
źródło
4
I powinieneś używać maszyny wirtualnej lub zapasowego pudełka, aby ćwiczyć odzyskiwanie - dowiedz się, co nie zadziałało i dopracuj ten plan. Wchodzimy w dwutygodniowy restart - ponieważ w naszym budynku były przerwy w dostawie prądu i za każdym razem było to bolesne. Robiąc kilka planowych wyłączeń wszystkich stojaków, skróciliśmy to z kilku dni pracy do około 3 godzin teraz - za każdym razem, gdy dowiadujemy się, które bity zautomatyzować / naprawić skrypty init.d dla itp.
Danny Staple
I wypróbuj to polecenie na maszynie wirtualnej. To interesujące! Ale najpierw wykonaj migawkę.
Stefan Lasiewski,
23

Najlepsze rozwiązania obejmują zmianę przyzwyczajeń, aby nie używać rmbezpośrednio.

Jednym z podejść jest uruchomienie w echo rm -rf /stuff/with/wildcards*pierwszej kolejności. Sprawdź, czy dane wyjściowe z symboli wieloznacznych wyglądają rozsądnie, a następnie użyj historii powłoki, aby wykonać poprzednie polecenie bez echo.

Innym podejściem jest ograniczenie echopolecenia do przypadków, w których oślepiająco oczywiste jest, co usuniesz. Zamiast usuwać wszystkie pliki z katalogu, usuń katalog i utwórz nowy. Dobrą metodą jest zmiana nazwy istniejącego katalogu na DELETE-foo, następnie utworzenie nowego katalogu fooz odpowiednimi uprawnieniami, a na koniec usunięcie DELETE-foo. Zaletą tej metody jest to, że polecenie wprowadzone w historii to rm -rf DELETE-foo.

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

Jeśli naprawdę nalegasz na usunięcie kilku plików, ponieważ potrzebujesz, aby katalog pozostał (ponieważ musi zawsze istnieć lub nie masz uprawnień do jego ponownego utworzenia), przenieś pliki do innego katalogu i usuń ten katalog .

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(Naciśnij ten klawisz Alt+ .).

Usunięcie katalogu od wewnątrz byłoby atrakcyjne, ponieważ rm -rf .jest krótkie, dlatego ma niskie ryzyko literówek. Niestety typowe systemy nie pozwalają na to. Możesz rm -rf -- "$PWD"zamiast tego z większym ryzykiem literówek, ale większość z nich prowadzi do niczego nie usuwając. Uwaga, pozostawia to niebezpieczne polecenie w historii twojej powłoki.

Kiedy tylko możesz, używaj kontroli wersji. Ty nie rm, ty cvs rmczy cokolwiek innego, i to jest nie do naprawienia.

Zsh ma opcje monitowania przed uruchomieniem rmz argumentem, który wyświetla wszystkie pliki w katalogu: rm_star_silent(domyślnie włączone) monituje przed wykonaniem rm whatever/*i rm_star_wait(domyślnie wyłączone) dodaje 10-sekundowe opóźnienie, podczas którego nie można potwierdzić. Ma to ograniczone zastosowanie, jeśli chcesz usunąć wszystkie pliki z jakiegoś katalogu, ponieważ będziesz już oczekiwać na monit. To może pomóc uniknąć literówek jak rm foo *dla rm foo*.

Istnieje wiele innych rozwiązań, które wymagają zmiany rmpolecenia. Ograniczeniem tego podejścia jest to, że pewnego dnia będziesz na prawdziwej maszynie rmi automatycznie zadzwonisz rm, bezpiecznie oczekując potwierdzenia… a następnie przywrócisz kopie zapasowe.

Gilles
źródło
mv -t DELETE_ME -- *jest nieco bardziej niezawodny.
Tobu,
@Giles Nieużywanie rmbezpośrednio to dobra rada! Jeszcze lepszą alternatywą jest użycie findpolecenia .
aculich
A jeśli potrzebujesz katalogu, aby pozostać, możesz to zrobić po prostu za pomocą, find somedir -type f -deletektóry usunie wszystkie pliki, somedirale opuści katalog i wszystkie podkatalogi.
aculich
19

Zawsze możesz zrobić alias, jak wspomniałeś:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

Możesz także zintegrować go z klientem Twittera z wiersza poleceń, aby ostrzec znajomych o tym, jak niemal upokorzyłeś się, wycierając dysk twardy rm -fr /*jako root.

Naftuli Kay
źródło
3
+1 dla telnet miku.acm.uiuc.edu
Ali
1
alias echo = "telnet miku.acm.uiuc.edu"
kubańczyk
Nie mogę być wystarczająco oldschoolowy ... jakie jest znaczenie telnet miku.acm.uiuc.edu?
Kyle Strand
Wypróbuj i przekonaj się. To nieniszczące. Jeśli jesteś tak paranoikiem, jak powinieneś, uruchom na maszynie wirtualnej.
Naftuli Kay
3
-1 Nie można aliasować poleceń ze spacjami, nie mówiąc już o tym / * co jest niepoprawną nazwą
xenithorb 28.04.2016
15

Tak: Nie pracuj jako root i zawsze myśl dwa razy przed działaniem.

Zobacz także coś takiego jak https://launchpad.net/safe-rm .

Sven
źródło
Wspomniany jako root w edycji
Valentin Nemcev
@Valentin: o_O !!
Jonathan Rioux,
15

Najprostszym sposobem zapobiegania przypadkowemu rm -rf /*jest uniknięcie wszelkiego użycia rmpolecenia! W rzeczywistości zawsze miałem ochotę uciec, rm /bin/rmaby całkowicie pozbyć się tego polecenia! Nie, nie jestem żartobliwy.

Zamiast tego użyj -deleteopcji findpolecenia , ale najpierw przed usunięciem plików polecam podgląd plików, które chcesz usunąć:

find | less

Uwaga: we współczesnych wersjach, findjeśli pominiesz nazwę katalogu, domyślnie użyje on bieżącego katalogu, więc powyższe jest odpowiednikiem:

find . | less

Po upewnieniu się, że są to pliki, które chcesz usunąć, możesz dodać -deleteopcję:

find path/to/files -delete

Jest więc nie tylko find bezpieczniejszy w użyciu, ale także bardziej wyrazisty , więc jeśli chcesz usunąć tylko niektóre pliki w hierarchii katalogów, które pasują do określonego wzorca, możesz użyć takiego wyrażenia do podglądu, a następnie usunąć pliki:

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

Jest wiele dobrych powodów, aby uczyć się i używać findoprócz bezpieczniejszego rm, więc później podziękujesz sobie, jeśli poświęcisz czas na naukę korzystania find.

aculich
źródło
Bardzo interesująca dyskusja. Podoba mi się twoje podejście i zrobiłem mały urywek. Jest bardzo nieefektywny, ponieważ wywołuje znajdowanie najwyżej 3 razy, ale dla mnie to dobry początek: github.com/der-Daniel/fdel
Daniel Hitzel
14

W tym wątku jest kilka złych porad, na szczęście większość z nich została odrzucona.

Przede wszystkim, gdy musisz być rootem, stań się root - sudo, a różne sztuczki aliasowe osłabią cię. Co gorsza, sprawią, że będziesz nieostrożny. Naucz się robić rzeczy we właściwy sposób, przestań polegać na aliasach, aby cię chronić. Pewnego dnia zrootujesz się na pudełku, które nie ma kół treningowych i nie wysadzisz czegoś w powietrze.

Po drugie - kiedy masz root, pomyśl o sobie jak o jeździe autobusem pełnym dzieci w wieku szkolnym. Czasami możesz rozkoszować się piosenką w radiu, ale innym razem musisz patrzeć w obie strony, spowolnić i dwukrotnie sprawdzić wszystkie swoje lustra.

Po trzecie - prawie nigdy naprawdę nie musisz rm -rf- bardziej prawdopodobne, że chcesz mv something something.baklubmkdir _trash && mv something _trash/

Po czwarte - lsprzedtem zawsze twoja wieloznaczna karta rm- Nie ma nic szalonego w patrzeniu na coś przed zniszczeniem go na zawsze.

eventi
źródło
2
+1 za użycie ls.
Sachin Divekar,
@eventi Zgadzam się, że w tym wątku jest kilka okropnych rad i brzydkich hacków. Zdecydowanie dobrym pomysłem jest spojrzenie na coś przed zniszczeniem, ale istnieje jeszcze lepszy sposób, aby to zrobić za pomocą findpolecenia .
aculich
Nie widzę, jak znalezienie jest prostsze lub bezpieczniejsze, ale podoba mi się twój find . -name '*~'przykład. Chodzi mi o to, że lswylistuje ten sam glob, który rmbędzie używał.
eventy
11

Jest to mój standard, zwłaszcza dla wyrażeń regularnych w kontekście rm, ale w takim przypadku by cię to uratowało.

Zawsze robię echo foo*/[0-9]*{bar,baz}*najpierw, aby zobaczyć, jakie będzie wyrażenie regularne. Po uzyskaniu danych wyjściowych wracam do edycji z wiersza poleceń i zmieniam echona rm -rf. I nigdy, przenigdy nie używać rm -rfna niesprawdzonych regexp .

Szalony Kapelusznik
źródło
5
OK, czego szukam? Czy masz na myśli, że składnia wyrażeń regularnych do dopasowywania plików jest inna (a czasem wywoływana inną nazwą) niż ta używana np. W perlu? Lub jakiś inny punkt, który mi umknął? Przepraszam za powolność myślenia, to pierwsza rzecz tutaj w sobotę rano!
MadHatter,
9
Rzeczy, które nazywasz „regexp”, są w rzeczywistości globami. To nie jest inna składnia wyrażeń regularnych; to nie jest wyrażenie regularne.
bukzor
1
Argument ten można z pewnością wysunąć; jednakże z artykułu w Wikipedii na temat wyrażeń regularnych stwierdzam, że „Wiele współczesnych systemów komputerowych zapewnia znaki wieloznaczne w dopasowywanych nazwach plików z systemu plików. Jest to podstawowa funkcja wielu powłok wiersza poleceń i jest również znany jako globbing” - zwróć uwagę na użycie „znanego również jako”, co wydaje mi się wskazywać, że wywoływanie tokenów zawierających metaznaki w celu dopasowania jednej lub większej liczby nazw wyrażeń regularnych nie jest błędne. Zgadzam się, że globowanie jest lepszym terminem, ponieważ nie oznacza nic innego niż użycie wyrażeń regularnych w dopasowywaniu nazw plików.
MadHatter,
1
@MadHatter Również globowanie, choć wizualnie nieco podobne, różni się znacznie semantycznie od wyrażeń regularnych. W wyrażeniu regularnym znaczenie *ma bardzo precyzyjna definicja zwana Gwiazdą Kleene, która jest jednoargumentowym operatorem, który dopasowuje zero lub więcej elementów zbioru, do którego jest stosowany (w przypadku wyrażeń regularnych znak lub zestaw znaków poprzedzający Kleene Star), podczas gdy podczas globowania *dopasowuje wszystko według następującego wzoru. Są semantycznie bardzo różne, nawet jeśli wydają się mieć podobną składnię.
aculich
9

Rozwiązaniem tego problemu jest regularne tworzenie kopii zapasowych. Za każdym razem, gdy wyprodukujesz coś, czego nie chcesz ryzykować, zrób kopię zapasową. Jeśli regularne wykonywanie kopii zapasowej jest zbyt bolesne, uprość ten proces, aby nie był bolesny.

Na przykład, jeśli pracujesz nad kodem źródłowym, użyj narzędzia takiego jak gitdublowanie kodu i przechowywanie historii na innym komputerze. Jeśli pracujesz nad dokumentami, przygotuj skrypt, który będzie rsynctwoimi dokumentami na innym komputerze.

David Schwartz
źródło
Pomocny może być również system plików kopiowania przy zapisie, taki jak btrfs. Możesz łatwo skonfigurować prosty automatyczny obrót migawek, który działa lokalnie (oprócz zewnętrznej kopii zapasowej).
malthe
6

Wydaje się, że najlepszym sposobem na zmniejszenie tego ryzyka jest dwuetapowe usunięcie, jak w przypadku większości GUI. Oznacza to, że zamień rm na coś, co przenosi rzeczy do katalogu śmieci (na tym samym wolumenie). Następnie wyczyść ten śmieci po upływie wystarczającego czasu, aby zauważyć błąd.

Jedno z takich narzędzi, trash-cli, jest omówione na Unix StackExchange tutaj .

Nnutter
źródło
To pierwsza rzecz, którą instaluję na każdym komputerze. Powinno to być domyślne narzędzie do usuwania, przy czym rm jest używane tylko wtedy, gdy musisz absolutnie coś teraz usunąć. Przykro mi, że jeszcze nie wystartował, ale pewnego dnia tak się stanie. Prawdopodobnie po bardzo publicznym wystąpieniu rm powodującym ogromny problem, którego kopie zapasowe nie rozwiązałyby. Prawdopodobnie coś, w czym czas potrzebny na powrót do zdrowia odgrywa ogromną rolę.
Gerry
+1 Po korzystaniu z Linuksa przez 20 lat nadal uważam, że powinno istnieć coś w rodzaju kosza na śmieci rm.
Shovas,
3

Jednym z ważnych kluczowych czynników pozwalających uniknąć tego rodzaju błędów jest niezalogowanie się przy użyciu konta root. Kiedy logujesz się przy użyciu zwykłego nieuprzywilejowanego użytkownika, musisz użyć sudokażdego polecenia. Więc powinieneś być bardziej ostrożny.

Khaled
źródło
4
Nie jestem przekonany, że sudo zapobiegłoby temu. Możesz zrobić tę samą literówkę co OP, nawet jeśli wpiszesz „sudo” przed „rm”.
cjc
1
Wspomniany jako root w edycji
Valentin Nemcev
Jeśli nadal nie jesteś przekonany do używania sudoi tworzenia kopii zapasowych. Zajrzyj na tę stronę: forum.synology.com/wiki/index.php/… . Mówi o tworzeniu kosza. Mam nadzieję że to pomoże!
Khaled
1
@Khaled Używam sudo i kopii zapasowych, chcę tylko coś lepszego na ten konkretny problem
Valentin Nemcev
3

Kiedy usuwam katalog rekurencyjnie, umieszczam -ri, -fjeśli ma to zastosowanie, na końcu polecenia, np rm /foo/bar -rf. W ten sposób, jeśli przypadkowo naciśniesz Enter zbyt wcześnie, bez wpisania całej ścieżki, polecenie nie będzie rekurencyjne, więc prawdopodobnie nieszkodliwe. Jeśli uderzę Enter, próbując wpisać ukośnik /foo, napisałem rm /foozamiast rm -rf /foo.

Działa to dobrze na systemach wykorzystujących jądra GNU, ale narzędzia w niektórych innych Uniksach nie pozwalają na umieszczanie opcji na końcu w ten sposób. Na szczęście nie używam często takich systemów.

Wyzard
źródło
2

Może to być skomplikowane, ale możesz skonfigurować role w SELinux, aby nawet jeśli użytkownik rootowałby za pomocą sudo su - (lub zwykłego su), możliwość usuwania plików może być ograniczona (musisz się zalogować bezpośrednio jako root, aby usunąć akta). Jeśli używasz AppArmor, możesz zrobić coś podobnego .

Oczywiście innym rozwiązaniem byłoby upewnienie się, że masz kopie zapasowe. :)

Rilindo
źródło
2

Unikaj używania globowania . W Bash możesz ustawić noglob. Ale ponownie, kiedy przejdziesz do systemu, w którym noglobnie jest ustawiony, możesz zapomnieć o tym i postępować tak, jakby to było.

Ustaw, noclobberaby zapobiegać mvi cpniszczyć pliki.

Do usunięcia użyj przeglądarki plików. Niektóre przeglądarki plików oferują kosz na śmieci (na przykład Konqueror ).

Innym sposobem uniknięcia globowania jest: W wierszu poleceń, I echo filenamepattern >> xxx. Następnie edytuję plik za pomocą Vima lub vi, aby sprawdzić, które pliki mają zostać usunięte (uważaj na znaki wzorca nazwy pliku u partnerów plików). Następnie używam, %s/^/rm -f/aby zmienić każdy wiersz w polecenie usuwania. Źródło xxx. W ten sposób zobaczysz każdy plik, który chcesz usunąć przed zrobieniem tego.

Przenieś pliki do katalogu „poddasza” lub tarballa. Lub użyj kontroli wersji (jak powiedziałem wcześniej).

Andrej Panjkov
źródło
+1 za użycie metody podglądu plików przed ich usunięciem, jednak istnieją prostsze i bezpieczniejsze sposoby wykonania tego findpolecenia .
aculich
2

ZSH pyta mnie (domyślnie) przed wykonaniem rm -rf *.

matematyka
źródło
1

Poza chattrtym nie ma zbyt wielu zabezpieczeń, które pozwolą rootowi uruchomić takie polecenie. Dlatego odpowiednie grupy i staranne polecenia są ważne przy uruchamianiu uprzywilejowanym.

Następnym razem; wykreśl pliki, które chcesz usunąć - pomiń „f” rm -rflub użyj findi przekaż jexargs rm

cienki lód
źródło
Dobrze, że sugerujesz używanie find, ale zalecam bezpieczniejszy sposób użycia go w mojej odpowiedzi . Nie ma potrzeby używania, xargs rmponieważ wszystkie nowoczesne wersje findmają taką -deleteopcję . Ponadto, aby bezpiecznie korzystać xargs rmtrzeba także używać find -print0i xargs -0 rminaczej będziesz mieć problemy, gdy napotkasz takie rzeczy jak nazwy plików ze spacjami.
aculich
Nie chodziło mi o niuanse związane z Xargsem, ale raczej o użycie najpierw find, bez usuwania plików, a następnie kontynuowania ...
cienki
Tak, myślę, że wykrywanie plików za pomocą findjest dobrą sugestią, jednak niuanse xargssą ważne, jeśli sugerujesz ich użycie, w przeciwnym razie prowadzi to do zamieszania i frustracji podczas napotykania plików ze spacjami (których można uniknąć, używając -deleteopcji).
aculich
1

Niektóre aliasy bezpieczeństwa dla innych poleceń, aby zapobiec podobnym katastrofom, można znaleźć tutaj :

# safety features
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I'                    # 'rm -i' prompts for every file
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'

Zauważ, że wielkie litery -Iróżnią się od -i:

monit jeden raz przed usunięciem więcej niż trzech plików lub podczas usuwania rekurencyjnego. Mniej uciążliwy niż -i, a jednocześnie zapewnia ochronę przed większością błędów

Valentin Nemcev
źródło
Chociaż opcja I nie wyświetla echa tego, co zamierzasz usunąć.
Calmarius
1

Zazwyczaj używam -vflagi, aby zobaczyć, co jest usuwane i mam szansę ^Cszybko, jeśli mam najmniejsze wątpliwości. Naprawdę nie jest to sposób na uniknięcie złych rm, ale może to być przydatne w celu ograniczenia szkód na wypadek, gdyby coś poszło nie tak.

a3nm
źródło
1

Mój proces usuwania na komputerach z systemem Unix jest następujący.

  • Wpisz ls /path/to/intented/file_or_directoryw oknie terminala, a następnie naciśnij return(lub Tab, w razie potrzeby), aby wyświetlić listę plików.

Jeśli wszystko wygląda dobrze,

  • kliknij up arrowklucz, aby ponownie przynieść ls /path/to/intented/file_or_directoryz historii terminala.

  • wymienić lsz rmlub rm -rlub rm -rf, w miarę potrzeb. Osobiście nie lubię używać -fflagi.

Ten proces sprawdzania poprawności zapobiega również przedwczesnemu wykonaniu rmpolecenia, co się mi przytrafiło, zanim zacząłem śledzić ten proces.

Mohit Ranka
źródło
Podgląd plików przed ich usunięciem jest dobrym pomysłem, a istnieje jeszcze bezpieczniejszy i bardziej wyrazisty sposób, aby to zrobić, korzystając z instrukcji find opisanych w mojej odpowiedzi .
aculich
1

Jeśli nie masz teraz ochoty na zdobycie nowych nawyków, .bashrc/.profilewarto dodać kilka testów, aby sprawdzić, czy masz zamiar zrobić coś głupiego. Doszedłem do wniosku, że w funkcji Bash mogę wymyślić wzór, który może zrujnować mój dzień, i wymyśliłem to:

alias rm='set -f; myrm' #set -f turns off wildcard expansion need to do it outside of           
                        #the function so that we get the "raw" string.
myrm() {
    ARGV="$*"
    set +f #opposite of set -f
    if echo "$ARGV" | grep -e '-rf /*' \
                           -e 'another scary pattern'
    then
        echo "Do Not Operate Heavy Machinery while under the influence of this medication"
        return 1
    else
        /bin/rm $@
    fi
}

Dobrą rzeczą jest to, że to tylko Bash.

W tej formie nie jest wystarczająco ogólna, ale myślę, że ma potencjał, więc proszę zamieścić kilka pomysłów lub komentarzy.

kln
źródło
Dobrze, że próbujesz wyświetlić podgląd plików przed ich usunięciem, jednak to rozwiązanie jest zbyt skomplikowane. Zamiast tego możesz to zrobić w bardzo ogólny sposób, używając findpolecenia . Nie rozumiem też, dlaczego mówisz „dobrą rzeczą jest to, że to tylko Bash”? Zalecane jest unikanie bash-isms w skryptach .
aculich
Aby zapobiec nam od „rm -rf / *” lub „rm -rf dir / *”, gdy mamy na myśli „rm -rf ./*” i „rm -rf dir / *”, musimy wykryć wzorce „/ *” i „*” (w uproszczeniu). Ale nie możemy po prostu przekazać wszystkich argumentów wiersza poleceń przez grep w poszukiwaniu szkodliwego wzorca, ponieważ bash rozszerza argumenty wieloznaczne przed przekazaniem ich (gwiazda zostanie rozwinięta do całej zawartości folderu). Potrzebujemy „nieprzetworzonego” ciągu argumentów. To samo dzieje się z zestawem -f, zanim wywołamy funkcję „myrm”, która następnie przekazuje nieprzetworzony ciąg argumentu i grep szuka wstępnie zdefiniowanych wzorców. *
kln
Rozumiem, co próbujesz zrobić, set -fco jest równoważne set -o noglobw Bash, ale to wciąż nie tłumaczy twojego stwierdzenia, że ​​„Dobrą rzeczą jest to, że to tylko Bash”. Zamiast tego możesz całkowicie i w ogólny sposób wyeliminować problem z dowolną powłoką, nie używając rmwcale, ale raczej używając findpolecenia . Czy rzeczywiście wypróbowałeś tę sugestię, aby zobaczyć, jak wygląda ona w porównaniu z sugestią tutaj?
aculich
@aculich tylko przez bash Mam na myśli brak zależności w Pythonie lub Perlu, wszystko można zrobić w bash. Po zmianie mojego .bashrc mogę kontynuować pracę bez konieczności łamania starych nawyków. Za każdym razem, gdy wywołuję rm, bash upewni się, że nie zrobię czegoś głupiego. Muszę tylko zdefiniować pewne wzorce, o których chcę być powiadamiany. Jak „*”, który usunie wszystko z bieżącego folderu. Co jakiś czas będzie to dokładnie to, czego chcę, ale przy nieco większej interaktywności pracy można dodać do „myrm”.
kln
@aculich OK, gotcha. Nie, jeszcze tego nie próbowałem. Myślę, że wymaga znacznej zmiany w przepływie pracy. Właśnie sprawdziłem tutaj w Mac OS X moja .bash_history to 500, a 27 z tych poleceń to rm. I obecnie nie używam terminala zbyt często.
kln
1

Niestety nie mogę zostawić komentarza powyżej z powodu niewystarczającej karmy, ale chciałem ostrzec innych, że safe-rm nie jest panaceum na przypadkowe koszmary masowego usuwania.

Następujące testy zostały przetestowane na maszynie wirtualnej Linux Mint 17.1 (ostrzeżenie dla osób niezaznajomionych z tymi poleceniami: NIE ZRÓB TO! W rzeczywistości nawet osoby zaznajomione z tymi poleceniami powinny / prawdopodobnie nigdy nie zrobiłyby tego, aby uniknąć katastrofalnej utraty danych):

Wersja tekstowa (skrócona):

$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory

Wersja obrazu (pełna):

wprowadź opis zdjęcia tutaj

Miles Wolbe
źródło
1

Podoba mi się podejście systemu Windows do kosza.

Zwykle tworzę katalog o nazwie „/ tmp / recyclebin” dla wszystkiego, co muszę usunąć:

mkdir /tmp/recyclebin

I nigdy nie używaj rm -rf, zawsze używam:

mv target_folder /tmp/recyclebin

Następnie opróżniam kosz za pomocą skryptu lub ręcznie.

Basil A
źródło
0

Hehe (niesprawdzony i nieco żartobliwy!):

$ cat /usr/local/bin/saferm

#! /bin/bash

/bin/ls -- "$@"

echo "Those be the files you're about to delete."
echo "Do you want to proceed (y/N)?"

read userresponse

if [ "$userresponse" -eq "y" ]; then

  echo "Executing...."
  /bin/rm -- "$@"

fi

I wtedy:

alias rm="/usr/local/bin/saferm"

Realistycznie, powinieneś zrobić sobie przerwę przed wykonaniem tego rodzaju operacji na globu, niezależnie od tego, czy działasz jako root, przygotowując do niej „sudo” itp. Możesz uruchomić „ls” na tej samej globusie itp., ale mentalnie powinieneś zatrzymać się na chwilę, upewnić się, że wpisałeś to, co chciałeś, upewnić się, że to, czego chcesz, jest tym, czego naprawdę chcesz, itd. Przypuszczam, że jest to coś, czego nauczyłem się głównie poprzez niszczenie czegoś w pierwszym roku, ponieważ Unix SA, podobnie jak gorący palnik jest dobrym nauczycielem w mówieniu, że coś na kuchence może być gorące.

I upewnij się, że masz dobre kopie zapasowe!

cjc
źródło
Próbuję dwa razy pomyśleć, zanim zrobię niebezpieczne rzeczy, ale jakoś to nie zawsze działa, zniszczyłem coś w przeszłości z powodu takiej nieuwagi.
Valentin Nemcev,
0

Ponadto, nie jako zabezpieczenie, ale jako sposób na sprawdzenie, jakie pliki zostały usunięte przed kliknięciem ^ C, możesz użyć locatebazy danych (oczywiście tylko jeśli została zainstalowana i przetrwała rm)

Dowiedziałem się o tym z tego postu na blogu

Valentin Nemcev
źródło
0

Wystarczy użyć ZFS do przechowywania plików, których potrzebujesz, aby oprzeć się przypadkowemu usunięciu i mieć demona, który:

  • regularnie wykonuje migawki tego systemu plików
  • usuwa starsze / niepotrzebne migawki.

Jeśli pliki zostaną usunięte, nadpisane, uszkodzone, cokolwiek, po prostu przywróć system plików do klonu ostatniej dobrej migawki i gotowe.

jlliagre
źródło
0

nie tyle odpowiedź, ale wskazówka, zawsze tak rm (dir) -rfnie jest rm -rf (dir): nie idź nuklearnie do ostatniej możliwej chwili.

Pomaga złagodzić sytuacje, w których grubo naciskasz nazwę katalogu w taki sposób, że nadal jest to prawidłowe usunięcie, takie jak poślizgnięcie się i naciśnięcie klawisza Enter.

Sirex
źródło
Inteligentny, ale nie działałby na BSD rm, gdzie opcje muszą występować przed nazwami plików.
svenper
Tak. odkryłem, że ostatnio używam jabłek. Rozwiązaniem jest zainstalowanie narzędzi GNU i ustawienie aliasów do wszystkiego :) i / lub najlepiej wrzucenie jabłka do kosza na śmieci. :)
Sirex
1
gdybym mógł, zrobiłbym to w nanosekundę. To śmieci w porównaniu z linuksem.
Sirex
0

Myślę, że jest to potężna wskazówka zapobiegawcza z * skrótem rozszerzenia w powłoce:

Najpierw wpisz rm -rf *lub rm -rf your/path/*NIE, wpisz Enterklucz. (oczywiście powinieneś mieć zwyczaj dbania o to, aby nie naciskać przycisku Enter szybko / przypadkowo podczas korzystania rm -rf)

Następnie naciśnij Alt-Shift-8(ie Alt-Shift-*), aby jawnie rozwinąć symbol wieloznaczny „*” w bash. Pozwala to również uniknąć ponownego wprowadzania polecenia „rm -rf *” podczas przeglądania historii.

Na koniec, po sprawdzeniu, czy rozszerzenie ma odpowiednie pliki / katalogi, naciśnij klawisz Enter.

Gotowy.

Johnny Wong
źródło
0

Jeśli pomoże to komuś z własnej sprawy:

1. Użyj rmsafe:

Przenosi pliki do folderu „kosza” i zawsze masz szansę przywrócić je w prosty sposób mv:

$ rmsafe /path/to/important/files

Źródło: https://github.com/pendashteh/rmsafe

2. Użyj safe:

Możesz ustawić alias do rmużywania bezpiecznego:

$ alias rm="safe rm"

Teraz, jeśli uruchomisz rm /*, otrzymasz w odpowiedzi:

$ rm /*
Are you sure you want to 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]

i wierzę, że nie napiszesz y!

Źródło: https://github.com/pendashteh/safe

Alexar
źródło