Ho cancellato / bin / rm. Come posso recuperarlo?


168

Solo per divertimento, ho pensato di usare questo comando sul mio Raspberry Pi con Raspbian in esecuzione:

sudo rm -f /bin/rm

Pensavo di poterlo reinstallare coreutils: mi sbagliavo!

apt-get install --reinstall coreutilsdà un errore da dpkg, dicendo che non è stato possibile rimuovere il pacchetto. La compilazione dalla fonte non funziona perché gli Makefileusi rm.

Come posso riavere un lavoro rm?


9
Ogni .deb è fondamentalmente un archivio che puoi decomprimere e semplicemente copiare l'eseguibile rm in / bin.
schaiba,

1
Che sistema operativo è questo? Linux? Unix? Qualcos'altro? Se Linux, quale distro? 64bit? 32?
terdon

12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(o /bin/busybox, o estrailo da un initrd)
Stéphane Chazelas,

10
Il Raspberry Pi ha il suo sistema operativo su una scheda di memoria SD, quindi puoi semplicemente estrarre il binario rm dal pacchetto su un altro computer e copiarlo nuovamente sulla scheda. In ogni caso, acrobazia divertente che hai fatto lì e molto audace da parte tua ammetterlo pubblicamente :)
Christian,

15
@ user645715 37 persone hanno trovato questa domanda divertente.
Brilliand,

Risposte:


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

E mai più.


Perché non hai usato sudo con apt-get?

Perché il downloadcomando non lo richiede:

download
download scaricherà il pacchetto binario indicato nella directory corrente.

Pertanto, a meno che non ci si trovi in ​​una directory che non è possibile scrivere, non è necessario utilizzarlo sudoe potrebbe diventare problematico in seguito poiché sarà necessario disporre delle rootautorizzazioni per rimuovere / spostare il pacchetto.


3
apt-get deve essere eseguito con sudo :)
AWippler,

31
@AWippler no, in questo caso no.
Braiam,

5
Si noti che un file eseguibile vuoto viene eseguito come uno script shell che non fa nulla. Quindi questo significa invocare /bin/sh. Sarebbe stato più semplice fare sudo ln -s true /bin/rmo anche meglio sudo ln -s busybox /bin/rmavere un lavoro rm.
Stéphane Chazelas,

1
apt-getha bisogno di sudo se non hai scaricato coreutils perché altrimenti non sarà in grado di scrivere /vardove debian salva i file scaricati.
Kristopher Ives,

3
@KristopherIves sbagliato ... apt-getscarica il pacchetto nella directory corrente sempre (sì, anche se è stato utilizzato sudo), quindi a meno che non ci si trova in una directory non si può scrivere come utente non è necessario sudo. Si prega di controllare le pagine man.
Braiam,

106

debiane i suoi derivati ​​(e probabilmente la maggior parte delle altre distribuzioni) vengono con i busyboxquali viene utilizzato nel initramfs.

busybox raggruppa la maggior parte delle utility della riga di comando in un unico eseguibile.

Puoi temporaneamente collegare simbolicamente /bin/rma /bin/busybox:

ln -s busybox /bin/rm

Per ottenere un lavoro rm(dopo di che puoi fare il tuo apt-get install --reinstall coreutils).

Lo stesso metodo può essere utilizzato per tutte le altre utilità che busyboxinclude. Tale elenco varia da una distribuzione all'altra. È possibile ottenere l'elenco con busybox --list.

Si noti tuttavia che sono versioni limitate delle utilità corrispondenti. A volte supportano le estensioni GNU, ma generalmente no e alcune non supportano nemmeno tutte le funzionalità standard / POSIX (alcune funzionalità possono essere abilitate / disabilitate in fase di compilazione).

In alternativa, puoi usare l zsh'builtin rm:

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

Il zsh/filesmodulo fornisce con alcuni comandi incorporati aggiuntivi ( rm, mv, ln, mkdir, rmdir, chown, chmod, sync). È utile in questo tipo di situazione o quando non è possibile eseguire il fork di più processi ma si ha una zshcorsa interattiva .

ksh93ha anche un certo numero di extra / optional comandi buitin, ma non rmtra di loro ( basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync). Puoi invocarli con:

command /opt/ast/bin/the-command

in una ksh93sceneggiatura.


5
Bella risposta. Mi chiedo se l'OP deve davvero reinstallare il reale rm. ;-)
joeytwiddle,

Infatti. In realtà, questo mi fa pensare di eliminare anche i coreutils ... :-)
Damon,

4
@Damon: coreutils fornisce una versione estesa dei comandi di base rispetto a busybox, quindi mentre busybox potrebbe essere sufficiente per soddisfare i requisiti SUSv3, i coreutils sono più caratteristici; ad esempio busybox ha un supporto i18n limitato.
liori,

2
@liori: stavo scherzando a metà, anche se 10-15 anni fa, probabilmente lo avrei effettivamente fatto in quella situazione (le "funzionalità" aggiunte, in particolare i18n , non sono un vantaggio secondo me - traduzioni non leggibili, e imparare a usare switch che interrompono inaspettatamente gli script su un altro computer, no grazie). Tuttavia, al giorno d'oggi, sono felice se solo un sistema Linux funziona senza problemi, senza che io tocchi nulla e senza dover spostare / eliminare / modificare file / file di sistema / configurazione. Il che purtroppo non è ancora abbastanza frequente, quindi sicuramente non toccherò qualcosa che funzioni :-)
Damon,

29

In caso apt-geto dpkgnecessità rme senza rmuna reinstallazione non è posssible, allora si può emulare rmcon perl:

cat > /bin/rm << "EOF"
#!/usr/bin/perl
foreach (@ARGV) { unlink $_ or warn "$@:$!"; }
EOF
chmod +x /bin/rm

3
Si noti che non gestisce -re il fatto che non restituisca uno stato di uscita corretto può causare problemi.
Stéphane Chazelas,

6
@StephaneChazelas è sufficiente consentire apt-get install --reinstall coreutilse riportare l'OP alla normalità.
terdon

ecco perché ho scritto "nel caso". il pacchetto coreutils non ha script. in genere gli script pre e post installazione non riescono in caso di errori se i file sono presenti o non esistono, ad esempio se devono essere rimossi. E sì, è vero che ero troppo pigro per controllare il pacchetto in anticipo.

potresti anche emulare rmcon mv(nel 'cestino')
sendmoreinfo il

14

Vorrei provare a ottenere il rmbinario corretto da un'altra macchina, e quindi usare scpo qualcosa per copiarlo sul Pi. Questo ovviamente funziona solo se scpè già installato ...

Se scpnon è disponibile, allora nc(aka netcat) sul lato mittente e bash con un /dev/tcp/HOST/PORTreindirizzamento sul lato ricevente potrebbe funzionare.

Se non si dispone di un'altra macchina Raspbian, è possibile recuperare il pacchetto coreutils (ottenere quello .debper la versione corretta) e decomprimerlo con dpkg-deb(su Debian / Ubuntu / Mint / ..., anche se non è su un Pi):

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

Se non hai un'altra macchina con dpkg, puoi estrarre il file con ar(dagli strumenti di sviluppo di binutils) e tar:

ar p coreutils*.deb data.tar.gz  | tar xzf - ./bin/rm

8
Se scpnon è disponibile, potrebbe funzionare anche nc(aka netcat) sul lato mittente e bashcon un /dev/tcp/HOST/PORTreindirizzamento sul lato ricevente.
MvG,

13

Dato che è debian (o ubuntu), c'è un modo semplice per ottenere i file:

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

Questo funziona perché apt-get ha scaricato coreutils.deb prima di provare a installarlo e dpkg-deb ha garantito di esistere su un sistema basato su debian.

Non estrarre direttamente in / tmp, cambia le autorizzazioni sulla directory principale.

Se hai intenzione di giocare, potresti voler installare il pacchetto busybox-static, che funziona anche se rompi tutto il resto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.