Bin und andere Ordner verschoben! Wie bekomme ich sie zurück?

13

Ich habe versehentlich alle Ordner vom Stammverzeichnis in einen Unterordner verschoben. ( /bin, /etc, /home, /lib, /usr... alles bewegt) die einzigen, die nicht verschoben wurden, da sie in Gebrauch waren, sind /bak, /boot, /dev, /proc, /sys.

Nun, jeder Befehl, den ich auszuführen versuche, wird einfach nicht passieren. Ich bekomme ständig "Keine solche Datei oder Verzeichnis".

Ich bin über ssh und ftp verbunden, kann aber keine Dateien über ftp verschieben, da die direkte SU-Anmeldung deaktiviert ist. Ich habe auch Zugriff auf den eigentlichen Server, wenn ich etwas direkt von dort aus tun muss.

Ich gehe davon aus, dass ich eine Konfigurationsdatei bearbeiten müsste, um zu bestimmen, wo sich der /binOrdner befindet, und das würde mir helfen, wieder auf die Datei zuzugreifen kann nicht einmal ausgeführt werden chmod, um Berechtigungen zu ändern).

Gibt es einen anderen Ausweg als die Neuinstallation?

Ich arbeite an einer alten Version von CentOS.

Ich bin extrem neu in der Welt von Linux, daher diese Aktion und die Frage ...

Menelaos
quelle
Obwohl dies keine Lösung für Ihr Problem ist, empfehle ich Folgendes zu lesen: lug.wsu.edu/node/414 Ähnliche Situation, aber er hat / bin tatsächlich gelöscht.
Stribika

Antworten:

33

Wenn Sie noch eine Root-Shell haben, haben Sie möglicherweise die Möglichkeit, Ihr System zu reparieren. Lassen Sie uns sagen , dass Sie alle gemeinsame Verzeichnisse verschoben ( /bin, /etc, /lib, /sbin, /usr- das sind diejenigen , die Erholung erschweren könnte) unter /oops.

Sie können den mvBefehl nicht direkt ausgeben , selbst wenn Sie den vollständigen Pfad angeben /oops/bin/mv. Das liegt daran, dass mves dynamisch verknüpft ist . Da Sie das /libVerzeichnis verschoben haben , mvkann es nicht ausgeführt werden, da die Bibliotheken, die Teil des Codes sind, nicht gefunden werden können. Tatsächlich ist es sogar noch schlimmer: mvDer dynamische Loader kann nicht gefunden werden /lib/ld-linux.so.2(der Name kann je nach Architektur und Unix-Variante variieren, und das Verzeichnis kann ein anderer Name sein wie /lib32oder /lib64). Daher müssen Sie, bis Sie das /libVerzeichnis zurück verschoben haben , den Linker explizit aufrufen und den Pfad zu den verschobenen Bibliotheken angeben. Hier ist der Befehl, der auf Debian Squeeze i386 getestet wurde.

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/i386-linux-gnu
/oops/lib/ld-linux.so.2 /oops/bin/mv /oops/* /

Möglicherweise müssen Sie dies für andere Distributionen oder Architekturen etwas anpassen. Zum Beispiel für CentOS unter x86_64:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib64
/oops/lib64/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /

Wenn Sie etwas vermasselt haben /lib, ist es hilfreich, einen statisch verknüpften Werkzeugkasten herumliegen zu lassen. Einige Distributionen (ich kenne CentOS nicht) bieten eine statisch verknüpfte Kopie von Busybox . Es gibt auch Sash , eine eigenständige Shell mit vielen eingebauten Befehlen. Wenn Sie eine davon haben, können Sie von dort aus Ihre Wiederherstellung durchführen. Wenn Sie sie noch nicht installiert haben, ist es zu spät.

# mkdir /oops
# mv /lib /bin /oops
# sash
Stand-alone shell (version 3.7)
> -mv /oops/* /
> exit

Wenn Sie keine Root-Shell mehr haben, aber immer noch einen SSH-Daemon haben, der überwacht, und Sie sich direkt als Root über ssh anmelden können und über eine dieser statisch verknüpften Toolboxen verfügen, können Sie möglicherweise ssh ausführen kann funktionieren, wenn Sie umgezogen sind /libund /bin, aber nicht /etc.

ssh [email protected] /oops/bin/sash
[email protected]'s password:
Stand-alone shell (version 3.7)
> -mv /oops/* /

Einige Administratoren richten für diese Art von Problemen ein alternatives Konto mit einer statisch verknüpften Shell ein oder lassen das Root-Konto eine statisch verknüpfte Shell verwenden.

Wenn Sie keine Root-Shell haben und keine Vorkehrungen getroffen haben, müssen Sie von einer Linux-Live-CD / USB-Festplatte booten (jede muss neu genug sein, um auf Ihre Festplatten und Dateisysteme zugreifen zu können) und Verschieben Sie die Dateien zurück.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Vielen Dank, Gilles. Sie haben einige sehr nützliche Informationen darüber geliefert, worauf ich in Zukunft achten sollte.
Menelaos
Vielen Dank, Gilles! Das hat mich gerettet. Ich habe eine Bearbeitung für 64-Bit-Linux-Env hinzugefügt. In meinem Fall 64-Bit-CentOS 7
CompEng88
@ ComputerEngineer88 Danke, aber wenn Sie Änderungen vornehmen, fügen Sie bitte keine "EDIT" -Markierungen hinzu oder fügen Sie sie am Ende des Beitrags hinzu, wo sie nicht hingehören. Behalten Sie den Textfluss bei. Beiträge haben einen Bearbeitungsverlauf, wenn die Benutzer wissen möchten, was der Beitrag zuvor enthielt. Wenn die Leute den Beitrag normal lesen, ist es ihnen egal, dass etwas später hinzugefügt wurde.
Gilles 'SO- hör auf böse zu sein'
"Ja wirklich?" Ich konzentriere mich immer auf die Bearbeitungen. Bedeutet, dass etwas Neues gelernt wurde und für mich das Wichtigste ist. Trotzdem - solange die Menschen davon profitieren!
CompEng88
@ ComputerEngineer88 Ich hatte den gleichen Reflex, als ich anfing, Stack Overflow zu verwenden. Tatsächlich ist ein Stack Exchange-Beitrag einem Wikipedia-Artikel in vielerlei Hinsicht näher als einem Beitrag in einem Diskussionsforum. Sie erwarten, dass Benutzer Forumbeiträge bald nach dem Posten lesen. Daher ist es sinnvoll, einen sichtbaren Hinweis darauf zu haben, ob sie bearbeitet wurden. Aber lassen Sie sich sagen , jemand dieses Thema im Jahr 2027 sieht: sie würden es egal , ob ein Absatz dort seit 2011 gewesen oder hatte im Jahr 2019 hinzugefügt worden
Gilles ‚SO- Anschlag, die bösen‘
11

Sie können wahrscheinlich ohne Neustart wiederherstellen. Starten Sie also erst neu, wenn Sie einige andere Dinge ausprobiert haben, da dies nicht funktioniert. Wenn Ihre SSH-Sitzung noch geöffnet ist, versuchen Sie Folgendes:

  • Woher Programme ausgeführt werden, wird mit der Variablen $ PATH festgelegt. Sie können dem Pfad Ihren neuen Lagerort hinzufügen, indem Sie ausführen export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin". Möglicherweise müssen Sie auch die entsprechenden sbin- Verzeichnisse hinzufügen . Sie können Programme auch manuell über ihren vollständigen Pfad /path/to/mv [from] [to]ausführen. Dies sollte beispielsweise auch dann funktionieren, wenn sich mv an einem anderen Ort befindet. Der schwierige Teil ist, dass die meisten Befehle auf allgemeine Bibliotheken zugreifen möchten und Sie sagen, dass sie /libverschoben wurden, sodass Sie eine Variable festlegen müssen, für die auch dies gilt.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib

  • Sobald Sie einige grundlegende Befehle ausführen können, verschieben Sie das Zeug zurück! mv /path/to/subfolder/* /wäre in ordnung! Sobald alles wieder an seinem Platz ist, sollte sich das System normal verhalten.

Wenn dies fehlschlägt, sollten Sie durch Starten einer beliebigen Live-CD und Aktivieren des Laufwerks die Ordner dorthin verschieben können, wo sie hingehören. Sie müssen Ihre distros livecd weder neu installieren noch verwenden. Sie müssen lediglich das Laufwerk einbinden und die Ordner wieder an den richtigen Speicherort auf der Festplatte verschieben. Viele Linux-basierte Rettungsdisketten haben sich darauf spezialisiert, Ihnen nur ein paar grundlegende Konsolentools für diese Art der Reparatur zur Verfügung zu stellen.

Caleb
quelle
Die Arbeit mit SSH ist fehlgeschlagen, daher habe ich eine Live-CD heruntergeladen und versuche, die Dinge zum Laufen zu bringen. Ich bin im Grub und versuche, das Laufwerk zu mounten, aber es lässt mich nicht, weil der Kernel nicht geladen ist. und nicht in der Lage zu sein, den genauen Pfad der vorhandenen Pfade zu sehen, macht dies eindeutig schwierig ...
Menelaos
1
Booten Sie, um zu leben, hängen Sie Ihre Festplatte ein, bringen Sie die Dinge an ihren richtigen Ort zurück, starten Sie Ihr System neu ... und viel Glück.
Caleb
2
Es ist nicht genug einzustellen LD_LIBRARY_PATH, Sie müssen auch den Dynamic Loader explizit aufrufen, z LD_LIBRARY_PATH=/newpath/to/lib /newpath/to/lib/ld-linux.so.2 /newpath/to/bin/mv.
Gilles 'SO- hör auf böse zu sein'
4

Sie sollten in der Lage sein, den Computer mit einer Installations-CD im Einzelbenutzermodus neu zu starten, das Root-Dateisystem bereitzustellen und die Dateien unter Linux zurück zu verschieben. Ich kenne nicht viel Centos, aber es ist wie RHEL, also sollte das funktionieren.

Jamess
quelle
Ich lade es herunter, während wir sprechen. Macht es einen Unterschied, ob es sich um die Live-CD oder die gesamte Installations-DVD handelt?
Menelaos
@Menelaos: Sie möchten nicht installieren, Sie möchten etwas, das Sie für diese Lösung live ausführen können. Einige Installationsdisketten haben Live-Versionen, andere möchten nicht sofort installiert werden. Einige haben "Rettungs" -Modi, die Sie eigentlich wollen, aber es gibt auch dedizierte Linux-Rettungsdisketten. Es muss nicht Ihre Distribution sein, es muss nur etwas sein, das ein Linux-Dateisystem mounten und die Ordner zurück verschieben kann. Siehe meine Antwort.
Caleb
Unter sysresccd.org finden Sie eine der Rettungs-CDs, wenn Sie möchten. Es verfügt über eine umfangreiche Dokumentation zur Verwendung. Es kann in diesem Forum und außerhalb meiner verfügbaren Zeit schwierig sein, zu helfen, dieses Problem zu lösen. Ansonsten sollten Centos-CDs helfen. Die neueste Live-CD funktioniert möglicherweise oder funktioniert möglicherweise nicht. Wenn Sie also diese Art von Problemen berücksichtigen, sollten Sie immer ein Installationsmedium bzw. eine ISO-Datei der von Ihnen installierten Version verwenden. Erstellen Sie auch eine Sicherung ganzer Dateisysteme.
Jamess
2

Vielen Dank an Gilles, 5 Jahre später und deine Beiträge haben meinen Tag gerettet, wenn nicht sogar meine Woche.

Ich wollte den Inhalt eines Unterordners in den aktuellen Ordner verschieben, aber stattdessen mv sub/* .habe mv sub /* .ich alles in den aktuellen Ordner verschoben. Zum Glück habe ich diese Antwort gefunden und konnte meine Maschine relativ einfach reparieren. Ich musste die Befehle jedoch leicht anpassen, da ich auf einem x86_64-Computer arbeite, auf dem Ubuntu 16.04 ausgeführt wird. Ich möchte die Anweisungen hier lassen, falls jemand Probleme hat:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/x86_64-linux-gnu
/oops/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /
Ktipr
quelle
0

Ich möchte ein paar weitere Befehle hinzufügen, nachdem Sie die Antwort von Ktipr für moderne Systeme (x86_64-Computer unter Unix) angewendet haben. Ich konnte die Verzeichnisse "etc" nicht mit mv verschieben, da sie einen Fehler aufwiesen

Error : Directory not empty

also musste ich benutzen

rsync -a source_file target_location

um sicherzustellen, dass ich alles wieder in Ordnung bringen konnte. Wenn Sie es noch nicht installiert haben, müssen Sie es zuerst installieren.

Rishabh Gupta
quelle