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?
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.
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.
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
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
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.