Versehentlich umbenannt / bin Hilfe!

39

Ich habe hier einen Notfall-, Linux- und Bash-Anfänger und habe es versaut, ein Skript zu schreiben, um einige Dateien umzubenennen. Die Schleife aus Versehen den Pfad stieg (lief das Skript in einem Ordner in der Desktop) und umbenannt /binzu /D_bin( D_war das Präfix ich hinzugefügt) so jetzt das System nicht verwenden kann /binInhalte, also keine bash, keine mvumbenennen, nein sudo... Die Dateien in /D_binsind ok, nicht umbenannt und können kopiert und eingefügt werden, aber /binohne bash kann kein neuer Ordner erstellt werden. Das System sieht stabil aus, aber nur sehr wenige Dinge funktionieren und haben keinen Zugriff auf Dateien in Desktop.

Die anderen Ordner von /like /lib /sbin /etcscheinen auch in Ordnung zu sein, und der grafische Desktop ist immer noch da. Ich habe Angst vor einem Neustart, weil ich nicht weiß, ob es booten kann.

Gibt es eine Schale in root oder eine Art und Weise zu benennen , /D_binum wieder /bin? Brauchen Sie Hilfe, bitte, sehr wichtige Arbeit gefährdet

Mein Selbstmord-Drehbuch:

#!/bin/bash
files=~/Desktop/folder_1/*

for j in $files
do
    cd $j
    for i in 10n*  #file names starting by 10n
    do
       find * -maxdepth 0 ! -path . -exec mv {} D_{} \;
    done
    cd ..
done

:( Vielen Dank!!!!

Carlos D. Zapata
quelle
7
Sie könnten versuchen, diese Art von Dingen mit einer VM zu erlernen, sodass Sie nie viel riskieren würden.
M. Becerra
7
Um das Problem zu beheben, können Sie mit Ubuntu einen bootfähigen USB-Stick erstellen, als wollten Sie das Betriebssystem installieren und auf Ubuntu testen klicken . Von dort aus können Sie ein Terminal öffnen und den Ordner umbenennen.
M. Becerra
2
Mögliches Duplikat von "Root-Verzeichnis rekursiv
zurücksetzen"
32
/D_bin/mv -T /D_bin /binund führen Sie Ihre Skripte das nächste Mal nicht als root aus.
Jason C
5
Übrigens, wenn ich Skripts wie dieses erstelle, führe ich normalerweise einen Probelauf durch, indem das Skript potenziell zerstörerische Befehle wiedergibt, anstatt sie auszuführen und zu überprüfen, ob die Aktionen vernünftig sind. Auch: regelmäßige Backups.
Jason C

Antworten:

89

Es gibt verschiedene Möglichkeiten, dieses Problem zu beheben.

Wenn Sie Zugriff auf eine Shell (ein beliebiges offenes Terminal) haben, führen Sie Folgendes aus:

sudo /D_bin/mv -T /D_bin /bin

sudoist in /usr/binso gibt es keine Notwendigkeit, es mit absoluten Pfad auszuführen.

Die andere Sache , die Sie tun können , ist, das Hinzufügen der /D_binzu Ihrer PATHUmgebungsvariable wie folgt aus :

export PATH=$PATH:/D_bin

Wenn Sie keinen Zugriff auf eine Shell haben:

  1. Starten Sie das System neu
  2. Wenn Grub erscheint, drücken Sie e, um den Grub zu bearbeiten
  3. Fügen Sie am Ende der Zeile, die mit linux beginnt, Folgendes hinzu:

    init=/D_bin/bash
  4. drücken Sie CTRL+x

Jetzt werden Sie in eine Bash-Shell versetzt, und Sie sollten das Dateisystem als lesbar und beschreibbar neu einbinden.

/D_bin/mount -o remount,rw /

Verschieben Sie das Verzeichnis D_bin in den Ordner bin:

/D_bin/mv -T /D_bin /bin

Starten Sie dann das System neu.

Es sollte funktionieren, aber wenn nichts für Sie funktioniert hat, können Sie das System trotzdem mit einer Live-Ubuntu-Festplatte / USB booten und das Problem beheben.

Ravexina
quelle
2
Der erste hat es gelöst. Vielen Dank, hat mir den Tag gerettet. Aus Neugier, indem Sie das Skript, warum die Umbenennung erreicht / bin? Alle Ordner in Desktop haben das '_D', aber keine anderen zu Hause oder im Stammverzeichnis außer bin.
Carlos D. Zapata
9
@ CarlosD.Zapata: Wenn Sie das Verzeichnis in einer Schleife in einem Skript ändern müssen, ist es oft eine gute Idee, den Code in einem Sub-She'll auszuführen. Fügen Sie eine offene Klammer vor der ein cd "$j"(der Name sollte in doppelten Anführungszeichen stehen) und ersetzen Sie die Unfugstörung cd ..durch die passende enge Klammer. Und warum bist du als root gelaufen? Sie sollten nicht in der Lage sein, so viel Schaden anzurichten.
Jonathan Leffler
3
@ CarlosD.Zapata: Entfernen Sie nach dem Einfügen cd ..eines pwdden findBefehl aus dem Skript und führen Sie ihn als normalen Benutzer aus. Sie werden sehen, dass das Skript ausgeführt wird /, weil Sie eine CD mit dem Namen $ j erstellen, bei der es sich vermutlich um Dateien und nicht um Verzeichnisse handelt. in jeder schleife gehst du also einen schritt zurück und bist endlich drin /.
Ravexina
1
@ CarlosD.Zapata Denken Sie daran, dass es möglicherweise "angehalten" hat, /binweil es in Ordnern gearbeitet hat /bin. Ich würde diese überprüfen (wenn auch nicht als root!)
wizzwizz4
17
Es wurde wahrscheinlich auf / bin gestoppt, weil / bin der erste Ordner in / war, den es umbenannt hat (alphabetisch zuerst), und danach konnte es nicht mvmehr ausgeführt werden.
user253751
8

Um dieses Problem zu beheben, wenn Sie kein laufendes Terminal geöffnet haben, würde ich zuerst versuchen, einen "Shell-Ersatz" zu finden, den Sie anstelle von bash verwenden können. Python ist drin /usr/bin, damit sollte das noch funktionieren.

Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.call(["sudo", "/D_bin/mv", "-T", "/D_bin", "/bin"])

Wenn das nicht funktioniert, boote ich einfach direkt von einer Live-CD / USB und behebe alles in einer bekannten, vernünftigen Betriebsumgebung.

Generell würde ich Jonathan Leffler in den Kommentaren empfehlen: Niemals cd ..in Skripten verwenden, da dies leicht zu solchen Problemen führen kann. Besser nur in das $jVerzeichnis innerhalb einer Subshell cd , auf diese Weise müssen Sie sich keine Sorgen um die Rückkehr machen.

#!/bin/bash
files=~/Desktop/folder_1/*

for j in $files
do
  (
    cd "$j"
    for i in 10n*  #file names starting by 10n
    do
       find * -maxdepth 0 ! -path . -exec mv {} D_{} \;
    done
  )
done

Natürlich sollten Sie auch keine Sachen als root ausführen, es sei denn, dies ist absolut notwendig.

links herum
quelle
Ist es möglich, eine interaktive Shell wie Python auszuführen, ohne Zugriff auf eine andere Shell / ein anderes Terminal zu haben? Ich denke, die Problemumgehung sollte ein Skript erstellen, das neben dem Kennwort einen Befehl enthält, um es als root auszuführen. GUI wird den Rest erledigen, denke ich.
Ravexina
@Ravexina: nicht alles kann eine Shell brauchen . Ziemlich sicher, dass Sie den pythonProzess ausführen, benötigen Sie nur eine Terminal-Anwendung und zum Ausführen os.system("sudo ...")benötigen Sie nur einen * nix-Kernel. Vielleicht probiere ich es später in einer VM aus ...
leftaroundabout
Außerdem ist es beim cdEinfügen von Skripten in der Regel besser, cd -dorthin zurückzukehren, wo Sie sich befanden, als davon auszugehen, dass Sie ein Verzeichnis inaktiviert haben. Wenn Sie die Initiale ändern cd, cd ..werden Sie nicht dorthin zurückgebracht, wo Sie waren, sondern dorthin cd -.
Frambot
@JoeFrambach wie cd ..würde ich nicht verwenden , cd -in Skripten, nur in der Befehlszeile. cd -ist vielleicht weniger eine Garantie für Probleme als cd .., aber ich würde es immer noch nicht für sicher halten - wenn jemand weitere Verzeichnisänderungen in der Mitte hinzufügt, werden Sie unbeabsichtigt an einen anderen Ort gebracht. Während Subshells Ihnen einen klar abgegrenzten Bereich geben, in dem sich das Verzeichnis ändert und zu welchem ​​Punkt Sie zurückkehren.
Leftaroundabout
@Ravexina Ich habe es gerade ausprobiert: Python kann ja gestartet werden. Es os.systemfunktioniert nicht ohne shGegenwart, aber es subprocess.callfunktioniert.
Leftaroundabout