Wczoraj popełniłem błąd, który przypadkowo usunął 1800 GB mojego serwera plików

27

Uruchomiłem to polecenie wczoraj, pomyślałem na maszynie testowej, ale był to serwer plików podłączony przez SSH.

sudo rm -rf /tmp/* !(lost+found)

Mój emulator terminala to Konsole. Mój system to Debian 7.

Pytanie:

Czy to polecenie usunęło inne pliki niż pliki w / tmp?

coś tam coś tam
źródło
Czy to możliwe, że system plików / home nie jest zamontowany?
Emmanuel
@Emmanuel Potwierdziłem, że pliki zostały utracone.
somethingSomething
1
Twoja historia nie pokazuje żadnych błędów usuwania. Zabiłeś wiele procesów systemu operacyjnego, wykonując „kill $ (lsof / usr ...)”. Wpływ na system plików współdzielący deamon mógł zostać naruszony. Czy próbowałeś zrestartować usługi lub zrestartować filtr?
Emmanuel,
1
@somethingSomething Konsole nie jest powłoką, jest domyślnym emulatorem terminali KDE. Spróbuj wpisać kilka znaków w terminalu, jak dsgsadfsfi naciśnij Enter. Zobacz wynik. Jeśli tak bash: dsgsadfsf: command not found, to twoja skorupa jest bash.
Gabor Farkas
5
Mam nadzieję, że masz dobre kopie zapasowe. Jeśli chcesz podjąć próbę odzyskania, przestań korzystać z tego systemu, dopóki nie będziesz w stanie utworzyć kopii dysku na poziomie bajtów, na której chcesz eksperymentować. Wszelkie zapisy w danym systemie plików zaostrzą szkody.
CVn

Odpowiedzi:

43

Prawidłowa składnia w bash jest następująca:

rm /tmp/!(lost+found)

Jak @goldilocks napisał w komentarzach, oryginalny komenda powoduje ekspansję na zapytania (usuwa wszystkie pliki w /tmpfolderze, a następnie idzie dalej, i usuwa wszystkie pliki w bieżącym katalogu roboczym, w przypadku homefolderu).

Możesz spróbować sprawdzić, czy możesz odzyskać część swoich danych. Jest to kwestia o odzyskiwanie danych Linux tutaj .

Gabor Farkas
źródło
28
Ach, więc jest to zasadniczo kolejny przypadek słynnego „brakującego miejsca w moim wierszu poleceń, który zniszczył wszystkie moje dane” - tak jak w rm -rf / tmp^^
Martin von Wittich
8
Nie mogę wystarczająco podkreślić, że paranoja sysadmin nie jest bezpodstawna. :) Zawsze wykonuj kopię zapasową najcenniejszych danych w miejscu, w którym możesz pisać tylko jako root.
Gabor Farkas
9
Wolę wykonać kopię zapasową na oddzielnym dysku twardym lub serwerze, którego nie można nawet zapisać w katalogu głównym w normalnych okolicznościach. Użyto OP sudo, więc normalny folder, który można zapisać tylko w katalogu głównym, niekoniecznie pomógłby.
Martin von Wittich,
Dobrze, że nie zwracałem wystarczającej uwagi na OP. Serwer może być kosztowny, jednak oddzielny dysk jest wystarczający. Użyłem osobnej partycji, która domyślnie była odmontowana. Prosty i brudny, ale skuteczny.
Gabor Farkas
1
@simonzack może zmniejszyć ryzyko wypadków poprzez zamontowanie go w konsekwencji, to mi wystarczy :)
Gabor Farkas
26

W !(lost+found)twoim rmrozkazie był prawdopodobnie fatalny błąd:

1978  rm -rf /tmp/* !(lost+found)
1979  sudo rm -rf /tmp/* !(lost+found)

Nie wiem dokładnie, co bashsię z tym dzieje, ale poniższe polecenie wypisuje wszystko w moim, /tmp/a także w moim bieżącym katalogu (który jest obecnie ~):

echo /tmp/* !(lost+found)
Martin von Wittich
źródło
Jest !(folder)to część polecenia, które raz uruchomiłem, które usunęło wszystkie oprócz folder.
somethingSomething
3
To brzmi jak coś, co może współpracować z zsh; bash Nie sądzę. Rozumiem, !lost+found: event not foundjak !jest używany do pobierania poleceń z historii.
wurtel
9
Yikes! „Nie wiem, co dokładnie robi bash” -> wykonuje rozszerzenie. Zgadnij, co to jest „wszystko oprócz tego”? cd /; echo !(lost+found)> _ <
goldilocks
13
Należy pamiętać, że !(foo)działa w bash jako „wszyscy oprócz foo” tylko wtedy, gdy extglobjest ustawiona opcja. Co więcej, OP nie określił, jakiej powłoki używa, więc naprawdę trudno zgadnąć, co dokładnie rm !(lost+found)zrobiła komenda w jego przypadku.
jimmij
5
Świetna uwaga, chociaż OP stwierdził, że używa Debiana 7, który ma bashdomyślną powłokę. Najprawdopodobniej tego nie zmienił. Ponadto w Debianie 7 extglobopcja jest truedomyślnie ustawiona (właśnie to sprawdziłem).
Gabor Farkas