Ich habe letzte Nacht einen Fehler gemacht, der unbeabsichtigt 1800GB von meinem File-Server gelöscht hat

27

Ich habe diesen Befehl gestern ausgeführt, dachte ich auf einem Testcomputer, aber es war ein Dateiserver, der über SSH verbunden war.

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

Mein Terminalemulator ist Konsole. Mein System ist Debian 7.

Frage:

Hat dieser Befehl andere Dateien als die Dateien in / tmp gelöscht?

etwas etwas
quelle
Könnte es sein, dass das / home-Dateisystem nicht gemountet ist?
Emmanuel
@ Emmanuel Ich habe bestätigt, dass die Dateien verloren gehen.
somethingSomething
1
In Ihrem Verlauf werden keine Löschfehler angezeigt. Sie haben viele Betriebssystemprozesse beendet, während Sie "kill $ (lsof / usr ...)" ausgeführt haben. Möglicherweise ist der Dateisystemfreigabedeamon betroffen. Haben Sie versucht, die Dienste neu zu starten oder den Filer neu zu starten?
Emmanuel
1
@somethingSomething Konsole ist keine Shell, sondern der Standard-Terminalemulator von KDE. Versuchen Sie, einige Zeichen in das Terminal dsgsadfsfeinzugeben , und drücken Sie die Eingabetaste. Sehen Sie das Ergebnis. Wenn ja bash: dsgsadfsf: command not found, dann ist Ihre Muschel bash.
Gabor Farkas
5
Ich hoffe du hast gute Backups. Wenn Sie versuchen, eine Wiederherstellung durchzuführen, beenden Sie die Verwendung dieses Systems, bis Sie eine Kopie des Laufwerks auf Byte-Ebene erstellen können, auf dem Sie experimentieren können. Alle Schreibvorgänge in das betreffende Dateisystem verschlimmern den Schaden.
ein Lebenslauf vom

Antworten:

43

Die korrekte Syntax in der Bash lautet wie folgt:

rm /tmp/!(lost+found)

Wie @goldilocks in den Kommentaren schrieb , erweitert der ursprüngliche Befehl die Abfrage (er löscht alle Dateien im /tmpOrdner, fährt dann fort und löscht alle Dateien im aktuellen Arbeitsordner, in Ihrem Fall im homeOrdner).

Sie können versuchen zu überprüfen, ob Sie einige Ihrer Daten wiederherstellen können. Es ist eine Frage , über Linux Data Recovery hier .

Gabor Farkas
quelle
28
Ah, es ist also im Wesentlichen ein weiterer Fall des berühmten "fehlenden Leerzeichens in meiner Befehlszeile, das alle meine Daten zerstört hat" - genau wie in rm -rf / tmp^^
Martin von Wittich,
8
Ich kann nicht genug betonen, dass Sysadmin-Paranoia nicht grundlos ist. :) Sichern Sie Ihre wertvollsten Daten immer an einem Ort, an dem Sie nur als Root schreiben können.
Gabor Farkas
9
Ich möchte lieber auf einer separaten Festplatte oder einem separaten Server sichern, die bzw. der unter normalen Umständen nicht einmal für Root geschrieben werden kann. OP verwendet sudo, daher hätte ein normaler Ordner, der nur für root beschreibbar ist, nicht unbedingt geholfen.
Martin von Wittich
Guter Punkt, ich habe dem OP nicht genug Aufmerksamkeit geschenkt. Ein Server kann teuer sein, eine separate Festplatte ist jedoch ausreichend. Ich habe eine separate Partition verwendet, die standardmäßig nicht gemountet war. Einfach und dreckig, aber effektiv.
Gabor Farkas
1
@simonzack es kann die Wahrscheinlichkeit von Unfällen verringern, indem es folglich montiert wird, es ist genug für mich :)
Gabor Farkas
26

Das !(lost+found)in Ihrem rmBefehl war wahrscheinlich der fatale Fehler:

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

Ich weiß nicht genau, was damit gemacht bashwird, aber dieser Befehl unten gibt alles in meinem /tmp/und auch in meinem aktuellen Verzeichnis aus (welches sich aktuell befindet ~):

echo /tmp/* !(lost+found)
Martin von Wittich
quelle
Das !(folder)ist Teil eines Befehls, den ich mal ausgeführt habe, der alle außer löschte folder.
somethingSomething
3
Das klingt nach etwas, das mit zsh funktionieren könnte. Bash, ich glaube nicht. Ich erhalte !lost+found: event not foundas !, um Befehle aus dem Verlauf abzurufen.
Wurtel
9
Huch! "Ich weiß nicht genau, was bash damit macht" -> es führt eine Erweiterung durch. Ratet mal, was "alles außer diesem" ist? cd /; echo !(lost+found)> _ <
Goldlöckchen
13
Bitte beachten Sie, dass !(foo)bash nur dann als "all except foo" funktioniert, wenn die extglobOption gesetzt ist. Außerdem hat OP nicht angegeben, welche Shell er verwendet, und es ist sehr schwer zu erraten, was genau der rm !(lost+found)Befehl in seinem Fall getan hat.
13.
5
Großartige Bemerkung, obwohl OP angab, dass er Debian 7 verwendet, das bashals Standard-Shell hat. Er hat das höchstwahrscheinlich nicht geändert. Außerdem ist in Debian 7 die extglobOption truestandardmäßig auf gesetzt (ich habe dies gerade angekreuzt).
Gabor Farkas