Ich habe / bin / rm gelöscht. Wie kann ich es wiederherstellen?

168

Aus Spaß dachte ich, ich würde diesen Befehl auf meinem Raspberry Pi verwenden, auf dem Raspbian ausgeführt wird:

sudo rm -f /bin/rm

Ich dachte, ich könnte einfach neu installieren coreutils: Ich habe mich geirrt!

apt-get install --reinstall coreutilsgibt einen Fehler aus dpkg, der besagt, dass das Paket nicht entfernt werden konnte. Das Kompilieren aus dem Quellcode funktioniert nicht, da die MakefileVerwendung rm.

Wie kann ich eine Arbeit rmzurückbekommen?

user60684
quelle
9
Jedes .deb ist im Grunde genommen ein Archiv, das Sie entpacken und einfach nach / bin kopieren können.
Schaiba
1
Welches Betriebssystem ist das? Linux? Unix? Etwas anderes? Wenn Linux, welche Distribution? 64bit? 32?
Terdon
12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(oder /bin/busybox, oder extrahieren Sie es aus einem initrd)
Stéphane Chazelas
10
Der Raspberry Pi verfügt über ein Betriebssystem auf einer SD-Speicherkarte, sodass Sie die rm-Binärdatei einfach aus dem Paket eines anderen Computers extrahieren und auf die Karte kopieren können. Auf jeden Fall, witzige Stunt, die Sie dort gezogen und sehr mutig von Ihnen, es öffentlich zuzugeben :)
Christian
15
@ user645715 37 Personen fanden diese Frage amüsant.
Brilliand

Antworten:

194
sudo touch /bin/rm && sudo chmod +x /bin/rm
apt-get download coreutils
sudo dpkg --unpack coreutils*

Und niemals wieder.


Warum hast du sudo nicht mit apt-get benutzt?

Weil der downloadBefehl es nicht erfordert:

download
download lädt das angegebene Binärpaket in das aktuelle Verzeichnis herunter .

Wenn Sie sich also nicht in einem Verzeichnis befinden, das Sie nicht schreiben können, müssen Sie es nicht verwenden sudo, und es könnte später problematisch werden, da Sie rootBerechtigungen zum Entfernen / Verschieben des Pakets benötigen .

Braiam
quelle
3
apt-get muss mit sudo ausgeführt werden :)
AWippler
31
@AWippler nein, in diesem Fall nein.
Braiam
5
Beachten Sie, dass eine leere ausführbare Datei als Shell-Skript ausgeführt wird, das nichts tut. Das heißt also anrufen /bin/sh. Es wäre einfacher gewesen, eine Arbeit zu haben sudo ln -s true /bin/rmoder noch besser . sudo ln -s busybox /bin/rmrm
Stéphane Chazelas
1
apt-getbenötigt sudo, wenn Sie coreutils nicht heruntergeladen haben, da es sonst nicht in der Lage ist, dahin zu schreiben, /varwo debian die heruntergeladenen Dateien speichert.
Kristopher Ives
3
@KristopherIves falsch ... apt-getlädt das Paket in das aktuelle Verzeichnis immer (ja, auch wenn Sie verwendet sudo), so , wenn Sie in einem Verzeichnis befinden , können Sie nicht als Benutzer schreiben Sie nicht benötigen sudo. Bitte überprüfen Sie die Manpages.
Braiam
106

debianund seine Derivate (und wahrscheinlich die meisten anderen Distributionen), mit busyboxdenen in der verwendet wird initramfs.

busybox bündelt die meisten zentralen Befehlszeilendienstprogramme in einer einzigen ausführbaren Datei.

Sie können vorübergehend einen Symlink erstellen /bin/rmzu /bin/busybox:

ln -s busybox /bin/rm

Um eine Arbeit zu bekommen rm(danach kannst du deine machen apt-get install --reinstall coreutils).

Dieselbe Methode kann für alle anderen enthaltenen Dienstprogramme verwendet werden busybox. Diese Liste ist von Bereitstellung zu Bereitstellung unterschiedlich. Die Liste erhalten Sie mit busybox --list.

Beachten Sie jedoch, dass es sich um eingeschränkte Versionen der entsprechenden Dienstprogramme handelt. Sie unterstützen manchmal GNU-Erweiterungen, aber im Allgemeinen nicht und einige von ihnen unterstützen nicht einmal alle Standard- / POSIX-Funktionen (einige Funktionen können zur Kompilierungszeit aktiviert / deaktiviert werden).

Alternativ können Sie auch zshdas eingebaute rm verwenden:

#! /bin/zsh
zmodload zsh/files
rm "$@"

Das zsh/filesModul stellt mit einigen zusätzlichen eingebauten Befehlen ( rm, mv, ln, mkdir, rmdir, chown, chmod, sync). Dies ist in solchen Situationen hilfreich, oder wenn Sie keine weiteren Prozesse verzweigen können, aber eine interaktive zshAusführung haben.

ksh93hat auch eine Reihe von zusätzlichen / optionalen Befehlen buitin, aber nicht rmunter ihnen ( basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync). Sie können sie aufrufen mit:

command /opt/ast/bin/the-command

in einem ksh93Skript.

Stéphane Chazelas
quelle
5
Gute Antwort. Ich frage mich, ob das OP das echte rmüberhaupt neu installieren muss . ;-)
joeytwiddle
Tatsächlich. Das bringt mich dazu, über das Löschen von Coreutils nachzudenken ... :-)
Damon
4
@Damon: coreutils bietet eine erweiterte Version der Grundbefehle im Vergleich zu busybox. Obwohl busybox ausreicht, um die SUSv3-Anforderungen zu erfüllen, sind coreutils eher zweckdienlich. Die i18n-Unterstützung von busybox ist beispielsweise eingeschränkt.
Liori
2
@liori: Ich habe nur einen Scherz gemacht, obwohl ich es vor 10-15 Jahren wahrscheinlich in dieser Situation getan hätte (die hinzugefügten "Features", insbesondere i18n , sind meiner Meinung nach kein Vorteil - unverständliche Übersetzungen und das Erlernen der Verwendung von Schaltern, die Skripte auf einem anderen Computer unerwartet beschädigen (nein danke). Heutzutage bin ich jedoch froh, wenn nur ein Linux-System wie installiert reibungslos funktioniert, ohne dass ich etwas anfasse und ohne System- / Konfigurationsdateien oder Binärdateien verschieben / löschen / bearbeiten zu müssen. Was leider immer noch nicht oft genug der Fall ist, so dass ich mit Sicherheit nichts anfasse, was funktioniert :-)
Damon
29

Für den Fall , apt-getoder dpkgBedürfnisse rmund ohne rmeine Neuinstallation nicht posssible ist, dann können Sie emulieren rmmit perl:

cat > /bin/rm << "EOF"
#!/usr/bin/perl
foreach (@ARGV) { unlink $_ or warn "$@:$!"; }
EOF
chmod +x /bin/rm
NlightNFotis
quelle
3
Beachten Sie, dass dies nicht funktioniert -rund die Tatsache, dass kein korrekter Beendigungsstatus zurückgegeben wird, zu Problemen führen kann.
Stéphane Chazelas
6
@StephaneChazelas es reicht aus apt-get install --reinstall coreutils, das OP wieder normal zu machen.
Terdon
deshalb habe ich "für den fall" geschrieben. Das Paket coreutils hat keine Skripte. In der Regel schlagen die Skripts vor und nach der Installation bei Fehlern fehl, wenn Dateien vorhanden sind oder nicht, z. B. wenn sie entfernt werden müssen. Und ja, es stimmt, ich war zu faul, um das Paket im Voraus zu überprüfen.
Sie könnten auch emulieren rmmit mv(zu "Papierkorb")
sendmoreinfo
14

Ich würde versuchen, die richtige rmBinärdatei von einem anderen Computer zu erhalten und dann scpoder etwas zu verwenden, um es auf den Pi zu kopieren. Dies funktioniert natürlich nur, wenn scpbereits installiert ist ...

Ist dies scpnicht der ncFall, /dev/tcp/HOST/PORTfunktionieren möglicherweise auch Netcat auf der sendenden Seite und Bash mit einer Umleitung auf der empfangenden Seite.

Wenn Sie keine andere Raspbian-Maschine haben, können Sie das Paket coreutils abrufen (die .debfür die richtige Version) und mit dpkg-deb(unter Debian / Ubuntu / Mint /… ) entpacken , auch wenn es nicht auf einem Pi installiert ist:

dpkg-deb --fsys-tarfile coreutils*.deb | tar xf - ./bin/rm

Wenn Sie keine andere Maschine mit dpkg haben, können Sie die Datei mit ar(aus den binutils-Entwicklungstools) und tar extrahieren :

ar p coreutils*.deb data.tar.gz  | tar xzf - ./bin/rm
MathematicalOrchid
quelle
8
Wenn dies scpnicht verfügbar ist, funktioniert nc(auch bekannt als netcat) auf der sendenden Seite und bashmit einer /dev/tcp/HOST/PORTUmleitung auf der empfangenden Seite möglicherweise auch.
MvG
13

Da es sich um Debian (oder Ubuntu) handelt, gibt es eine einfache Möglichkeit, die Dateien abzurufen:

mkdir /tmp/coreutils
sudo dpkg-deb --extract /var/cache/apt/archives/coreutils_ [tab complete for correct version].deb /tmp/coreutils
sudo cp /tmp/coreutils/bin/rm /bin

Dies funktioniert, weil apt-get die Datei coreutils.deb heruntergeladen hat, bevor versucht wurde, sie zu installieren, und dpkg-deb garantiert auf einem Debian-basierten System vorhanden ist.

Extrahieren Sie nicht direkt nach / tmp, da dadurch die Berechtigungen für das übergeordnete Verzeichnis geändert werden.

Wenn Sie herumspielen wollen, möchten Sie vielleicht das Paket busybox-static installieren, das auch dann funktioniert, wenn Sie alles andere kaputt machen.

Dan Merillat
quelle