Wie kann ich versehentlich / usr umbenennen?

62

Ich habe das Verzeichnis versehentlich /usrin umbenannt /usr_bak.

Ich möchte es wieder ändern, also füge ich den Pfad /usr_bak/binan $PATH, damit das System den Befehl finden kann sudo.

Aber jetzt sudo mv /usr_bak /usrgibt mir den Fehler:

sudo: error while loading shared libraries: libsudo_util.so.0: cannot open shared object file: No such file or directory

Gibt es eine Möglichkeit das benennen , /usr_bakwie /usrneben der Neuinstallation des Systems?

Yves
quelle
2
Welches Betriebssystem ist das? Ich frage mich, wie es sudoüberhaupt zur Bibliotheksbühne gekommen ist, sie ist normalerweise in /usr/bin/und hätte mit einem nicht gefundenen Fehler fehlschlagen sollen. Haben Sie auch ein Root-Passwort festgelegt?
muru
3
@muru Es ist Ubuntu. Sie haben Recht, ich habe über den Fehler not foundvor , so hängten ich den neuen Pfad /usr_bak/binzu $PATHund jetzt bekomme ich den Fehler in meinem Beitrag hier ...
Yves
2
@ user1717828 es ist kompliziert. Ich muss ein unter Ubuntu 16.04 entwickeltes Projekt unter Ubuntu 17.10 kompilieren. Also überlege ich, ob ich einfach das /usrvon Ubuntu 16.04 kopieren kann , um das /usrvon Ubuntu 17.10 zu überschreiben ...
Yves
6
Haben Sie darüber nachgedacht, das Projekt mithilfe einer VM zu kompilieren, anstatt solche drastischen Änderungen vorzunehmen?
Kevin
3
Sie können virtualbox im Headless-Modus ausführen . Es ist möglicherweise am einfachsten, einen Gast auf einem anderen Computer einzurichten oder einen vorkonfigurierten zu erwerben.
Kevin

Antworten:

109

Da Sie ein Passwort für root festgelegt haben, verwenden Sie suund busybox, standardmäßig in Ubuntu installiert. Alle subenötigten Bibliotheken befinden sich in /lib. Busybox ist eine Sammlung von Dienstprogrammen, die statisch verknüpft sind, sodass fehlende Bibliotheken kein Problem darstellen sollten. Machen:

su -c '/bin/busybox mv /usr_bak /usr'

(Während Busybox selbst auch ein suApplet hat, ist die /bin/busyboxBinärdatei nicht setuid und funktioniert daher nur, wenn sie als root ausgeführt wird.)

Wenn Sie kein root-Passwort haben, können Sie möglicherweise die Gilles-Lösung hier verwendenLD_LIBRARY_PATH , oder (Gilles sagt, dass dies mit setuid-Binärdateien wie sudo nicht funktioniert), starten Sie das GRUB-Menü neu und bearbeiten Sie es, um es init=/bin/busyboxals Kernel-Parameter zu booten und zu verschieben den Ordner zurück.

muru
quelle
73
Jetzt nicht versehentlich umbenennen /lib.
Sleblanc
5
LD_LIBRARY_PATHwürde nicht helfen, sudo auszuführen, da sudosetuid ist. Wenn sich die Bibliotheken nicht am richtigen Ort befinden, funktioniert sudo erst, wenn root es repariert.
Gilles 'SO - hör auf böse zu sein'
3
@Yves historische Anmerkung: eine kleine Sammlung von statisch gelinkte Binärdateien in alten Unix - Varianten (die viel viel älter als Linux sind) enthalten /sbinfür genau diese Art von Szenario: „Ich mache etwas Aktivität , wo Laufzeitbibliotheken um jongliert werden aber müssen noch Dateien manipulieren. " Grundsätzlich der gleiche Ansatz, bevor Busybox erfunden wurde. (Die Anzahl der auf diese Weise verfügbaren Befehle war sehr begrenzt, da diese statisch verknüpften Binärdateien Speicherplatz verschlingen.)
Ti Strga
8
@Yves Wenn Sie umbenannt haben /lib, müssten Sie wahrscheinlich neu init=/bin/busybox
starten,
3
@Yves: Booten Sie von einem USB-Stick mit einer Live-Distribution, die Ihre Dateisysteme mounten kann, und Sie sind bereit, alles zu reparieren. Sie können sogar Ersatzdateien von Paketspiegeln herunterladen, wenn Sie etwas gelöscht haben.
Peter Cordes
33

Zusätzlich zu Murus Antwort :

  • Sie hätten einen Notfall-Boot-USB-Stick verwenden können, um Ihr System zu reparieren. Wenn es sich bei Ihrem System beispielsweise um Debian oder Ubuntu handelt, starten Sie den Installations-USB-Stick im Rettungsmodus und führen Sie die entsprechenden Schritte mountund mvund aus umount.

  • im allgemeinen auch eine statische Schale mit mehreren eingebauten Befehlen installiert (vor allem mit einigen zu können , leichter , solche Fehler reparieren, ich cp, rm, mv-ähnlichen builtins) wie sash(es ist verpackt in Debian & Ubuntu und auch als Flügel-3.8. tar.gz in Quellform) und booten mit init=/bin/sashan Grub übergeben.

PS: sashist leicht fehlerhaft und nicht vollständig Posix-konform, aber dennoch sehr nützlich.

Basile Starynkevitch
quelle
Könnten Sie bitte erklären, wie eine statische Shell mit mehreren eingebauten Befehlen installiert wird? Gibt es ein Handbuch?
Yves
1
Auf Debian oder Ubuntu: apt-get install sash. Sie können aber auch sash-3.8.tar.gz herunterladen und kompilieren.
Basile Starynkevitch
Ich behalte ein Liveiso auf der Festplatte mit einem benutzerdefinierten Grub-Eintrag für Probleme wie dieses. Keine Notwendigkeit, kompliziert zu werden, booten Sie einfach ein Live-
Betriebssystem
3

Ich denke, der sicherste Weg ist, einen Neustart mit einem über USB, CD oder DVD gebooteten Betriebssystem (Debian, Ubuntu, Suse usw.) durchzuführen. Hängen Sie dann das Laufwerk mit den Problemen ein und benennen Sie es um.

Sicherer, als in ein Minenfeld zu booten, in dem / usr oder / lib fehlen.

Larry
quelle
1
Sie können eine ISO direkt von Grub / HDD booten, ohne USB / DVD usw. zu benötigen. Pretty nifty trick grub hat Call Loopback.
FreeSoftwareServers
0

Ich lief in ein ähnliches Problem , wo ich umbenannt , /usr/binum /usr/bin_bkpfür einigen Test und dann war ich (wie der Befehl die nicht das fand umbenennen nicht in der Lage sudoim Standardverzeichnis , das ist /usr/bin) und dann ging ich in das /usr/bin_bkpVerzeichnis manuell (Dateimanager ) und die meisten Funktionen (einschließlich des Umbenennens) beim Klicken mit der rechten Maustaste sind deaktiviert.

Dann habe ich den folgenden Befehl ausprobiert und das Problem behoben

$/usr/bin_bkp/sudo mv /usr/bin_bkp/ /usr/bin/

Ich habe das Sudo aus dem aktuellen Pfad aufgerufen und es hat funktioniert, jetzt ist alles wieder normal.

OS: Xubuntu 14.04

Aussenseiter
quelle
-3

Ich kann das momentan nicht ausprobieren (und bin mir nicht sicher, ob ich das möchte), aber es scheint, als müsste es funktionieren, um sich ein neues "/ usr" als harten Link (kein weicher Link) zu Ihrem " zu erstellen. / usr_bak, dann lösche "/ usr_bak"

ln /usr_bak /usr
rm /usr_bak

Durch die von "ln" ( ohne "-s" -Argument) im Dateisystem erstellte feste Verknüpfung sollten sowohl das Verzeichnis "usr" als auch das Verzeichnis "usr_bak" gleichermaßen gültige Verknüpfungen zu den betreffenden Verzeichnissen aufweisen. "rm" entfernt nur den einen Link, den Sie entfernen möchten, nicht beide. Da es immer noch einen gültigen Link zu den Inhalten gibt, sollten sie über den verbleibenden Link unter "/ usr" erreichbar bleiben.

TED
quelle
5
Ich hatte den Eindruck, dass Linux (oder zumindest Ubuntu) keine festen Links zu Verzeichnissen zulässt. ZB askubuntu.com/questions/210741/…
Chris Bouchard
4
@Chris: Richtig, Linux lässt keine Verzeichnis-Hardlinks zu (außer .und .., daher gibt die Anzahl der Links in einem Verzeichnis die Anzahl der Unterverzeichnisse der ersten Ebene an). Funktioniert auch rmnicht für Verzeichnisse, die Sie verwenden müssten rmdir. ( lnund rmarbeite an Symlinks zu Verzeichnissen, aber wir sprechen über ein tatsächliches Verzeichnis). Auch das löst das Problem nicht, weil es rootgenau so erfordert mv, wegen der Berechtigungen auf/ . Wenn Sie dies ausführen könnten, könnten Sie mvstattdessen wie eine normale Person ausgeführt werden.
Peter Cordes
2
Hardlinks zu Verzeichnissen werden auf den meisten (allen?) Unices nicht unterstützt, da es für Software, die einen rekursiven Dateisystem-Crawl durchführt, zu schwierig ist, Endlosschleifen zu erkennen. Es ist möglich, dass die Software alle besuchten Inodes verfolgt und ein Inode-fähiges Dateisystem (dh nicht FAT32 / NTFS) durchsucht. Es ist jedoch viel einfacher, nach symbolischen Links zu suchen und diese nicht zu durchlaufen. Alles, was benötigt wird, ist ein kurzer Aufruf von lstat (2), um den Dateityp zu überprüfen.
Pinguin359
2
@Pryftan, my ln(1)on Debian sagt dies für die Option -d/ -F/ --directory: " Erlaube dem Superuser, zu versuchen, Verzeichnisse fest zu verknüpfen (Hinweis: Wird wahrscheinlich aufgrund von Systemeinschränkungen fehlschlagen, auch für den Superuser)" . Sie können es also versuchen, aber Ihr Dateisystem lässt Sie wahrscheinlich nicht zu.
Toby Speight
1
@TobySpeight Ein weiterer Gedanke: Siehe auch symlink (7), der besagt: Harte Links verweisen möglicherweise nicht auf Verzeichnisse (um die Möglichkeit von Schleifen innerhalb des Dateisystembaums zu vermeiden, die viele Programme verwirren würden) und möglicherweise nicht auf Dateien auf verschiedenen Dateisystemen (weil Inode-Nummern sind zwischen Dateisystemen nicht eindeutig). Das lässt mich denken, dass der Hardlink-Versuch tatsächlich die Formulierung von etwas anderem ist, das passiert, nämlich dass die Funktion aufgerufen wird, aber genau deshalb fehlschlägt, weil es sich um ein Verzeichnis handelt. (Die Dateisystemreferenz ist das, woran ich in einem anderen Kommentar
gedacht habe