web-dev-qa-db-fra.com

J'ai supprimé / bin / rm. Comment le récupérer?

Juste pour le plaisir, j'ai pensé utiliser cette commande sur mon Raspberry Pi exécutant Raspbian:

Sudo rm -f /bin/rm

Je pensais que je pouvais réinstaller coreutils: j'avais tort!

apt-get install --reinstall coreutils donne une erreur de dpkg, disant qu'il n'a pas pu supprimer le package. La compilation à partir de la source ne fonctionne pas car Makefile utilise rm.

Comment récupérer un rm fonctionnel?

168
user60684
Sudo touch /bin/rm && Sudo chmod +x /bin/rm
apt-get download coreutils
Sudo dpkg --unpack coreutils*

Et plus jamais.


Pourquoi n'avez-vous pas utilisé Sudo avec apt-get?

Parce que la commande download ne l'exige pas:

download
download téléchargera le paquet binaire donné dans le répertoire courant.

Donc, à moins que vous ne soyez dans un répertoire que vous ne pouvez pas écrire, vous n'avez pas besoin d'utiliser Sudo, et cela pourrait devenir problématique plus tard car vous aurez besoin des autorisations root pour supprimer/déplacer le paquet.

194
Braiam

debian et ses dérivés (et probablement la plupart des autres distributions) sont fournis avec busybox qui est utilisé dans le initramfs.

busybox regroupe la plupart des utilitaires de ligne de commande principaux dans un seul exécutable.

Vous pouvez temporairement créer un lien symbolique /bin/rm à /bin/busybox:

ln -s busybox /bin/rm

Pour obtenir un rm fonctionnel (après quoi vous pouvez faire votre apt-get install --reinstall coreutils).

Cette même méthode peut être utilisée pour tous les autres utilitaires inclus par busybox. Cette liste varie d'un déploiement à l'autre. Vous pouvez obtenir la liste avec busybox --list.

Notez cependant qu'il s'agit de versions limitées des utilitaires correspondants. Ils prennent parfois en charge GNU, mais généralement pas et certaines d'entre elles ne prennent même pas en charge toutes les fonctionnalités standard/POSIX (certaines fonctionnalités peuvent être activées/désactivées au moment de la compilation).

Alternativement, vous pouvez utiliser le rm intégré de zsh:

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

Le zsh/files le module fournit quelques commandes internes supplémentaires (rm, mv, ln, mkdir, rmdir, chown, chmod, sync). Il est utile dans ce type de situation ou lorsque vous ne pouvez pas générer d'autres processus mais que vous avez un zsh interactif en cours d'exécution.

ksh93 a également un certain nombre de commandes supplémentaires/facultatives, mais pas rm parmi elles (basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname , wc, sync). Vous pouvez les invoquer avec:

command /opt/ast/bin/the-command

dans un ksh93 script.

106
Stéphane Chazelas

Au cas où apt-get ou dpkg a besoin de rm et sans rm une réinstallation n'est pas possible, alors vous pouvez émuler rm avec Perl:

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

J'essaierais d'obtenir le binaire rm correct d'une autre machine, puis d'utiliser scp ou quelque chose pour le copier sur le Pi. Bien sûr, cela ne fonctionne que si scp est déjà installé ...

Si scp n'est pas disponible, alors nc (a.k.a. netcat) du côté de l'envoi et bash avec un /dev/tcp/Host/PORT la redirection côté réception peut également fonctionner.

Si vous n'avez pas d'autre machine Raspbian, vous pouvez récupérer le paquet coreutils (obtenir le .deb pour la bonne version), et décompressez-le avec dpkg-deb (sur Debian/Ubuntu/Mint /…, même si ce n'est pas sur un Pi):

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

Si vous n'avez pas d'autre machine avec dpkg, vous pouvez extraire le fichier avec ar (à partir des outils de développement binutils) et tar:

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

Comme il s'agit de Debian (ou Ubuntu), il existe un moyen simple d'obtenir les fichiers:

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

Cela fonctionne car apt-get a téléchargé le coreutils.deb avant d'essayer de l'installer, et dpkg-deb est garanti d'exister sur un système basé sur Debian.

Ne pas extraire directement vers/tmp, cela modifie les autorisations sur le répertoire parent.

Si vous allez jouer, vous voudrez peut-être installer le package busybox-static, qui fonctionne même si vous cassez tout le reste.

13
Dan Merillat