Eliminé / bin / rm. ¿Cómo lo recupero?

168

Solo por diversión, pensé que usaría este comando en mi Raspberry Pi con Raspbian:

sudo rm -f /bin/rm

Pensé que podría reinstalar coreutils: ¡estaba equivocado!

apt-get install --reinstall coreutilsda un error de dpkg, diciendo que no pudo eliminar el paquete. Compilar desde la fuente no funciona porque los Makefileusos rm.

¿Cómo puedo volver a trabajar rm?

usuario60684
fuente
99
Cada archivo .deb es básicamente un archivo que puedes descomprimir y simplemente copiar el ejecutable rm a / bin.
schaiba
1
¿Qué sistema operativo es este? Linux? Unix? ¿Algo más? Si es Linux, ¿qué distribución? 64bit? 32?
terdon
12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(o /bin/busybox, o extraerlo de un initrd)
Stéphane Chazelas
10
El Raspberry Pi tiene su sistema operativo en una tarjeta de memoria SD para que pueda extraer el binario rm del paquete en otra máquina y copiarlo nuevamente en la tarjeta. En cualquier caso, un truco hilarante que hiciste allí y muy valiente de tu parte para admitirlo públicamente :)
Christian
15
@ user645715 A 37 personas les pareció divertida esta pregunta.
Brilliand

Respuestas:

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

Y nunca más.


¿Por qué no usaste sudo con apt-get?

Porque el downloadcomando no lo requiere:

download
download descargará el paquete binario dado en el directorio actual.

Por lo tanto, a menos que esté en algún directorio que no pueda escribir, no necesita usarlo sudo, y podría volverse problemático más adelante ya que necesitará rootpermisos para eliminar / mover el paquete.

Braiam
fuente
3
apt-get debe ejecutarse con sudo :)
AWippler
31
@AWippler no, en este caso no.
Braiam
55
Tenga en cuenta que un archivo ejecutable vacío se ejecuta como un script de shell que no hace nada. Entonces eso significa invocar /bin/sh. Hubiera sido más sencillo que hacer una sudo ln -s true /bin/rmo incluso mejor sudo ln -s busybox /bin/rmque tener un trabajo rm.
Stéphane Chazelas
1
apt-getnecesita sudo si no ha descargado coreutils porque de lo contrario no podrá escribir en /vardonde debian guarda los archivos descargados.
Kristopher Ives
3
@KristopherIves mal ... apt-getdescarga el paquete al directorio actual siempre (sí, incluso si lo usó sudo), así que a menos que esté en un directorio no puede escribir como su usuario, no lo necesita sudo. Por favor, consulte las páginas del manual.
Braiam
106

debiany sus derivados (y probablemente la mayoría de las otras distribuciones) vienen con los busyboxque se usa en initramfs.

busybox agrupa la mayoría de las utilidades de línea de comando central en un solo ejecutable.

Puedes vincular temporalmente /bin/rma /bin/busybox:

ln -s busybox /bin/rm

Para obtener un trabajo rm(después de lo cual puede hacer su apt-get install --reinstall coreutils).

Ese mismo método se puede utilizar para todas las demás utilidades que busyboxincluye. Esa lista varía de una implementación a otra. Puedes obtener la lista con busybox --list.

Sin embargo, tenga en cuenta que son versiones limitadas de las utilidades correspondientes. A veces admiten extensiones GNU, pero generalmente no y algunas de ellas ni siquiera admitirán todas las características estándar / POSIX (algunas características se pueden habilitar / deshabilitar en tiempo de compilación).

Alternativamente, puede usar zshel rm incorporado:

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

El zsh/filesmódulo proporciona con unas pocas órdenes internas adicionales ( rm, mv, ln, mkdir, rmdir, chown, chmod, sync). Es útil en este tipo de situación o cuando no puede bifurcar más procesos pero tiene una zshejecución interactiva .

ksh93También tiene una serie de buitin adicional / opcional de comandos, pero no rmentre ellos ( basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync). Puedes invocarlos con:

command /opt/ast/bin/the-command

en un ksh93guion

Stéphane Chazelas
fuente
55
Gran respuesta. Me hace preguntarme si el OP realmente necesita reinstalar lo real rm. ;-)
joeytwiddle
En efecto. En realidad, esto me hace pensar en eliminar coreutils también ... :-)
Damon
44
@Damon: coreutils proporciona una versión extendida de los comandos básicos en comparación con busybox, por lo tanto, si bien busybox podría ser suficiente para cumplir con los requisitos de SUSv3, los coreutils tienen más funciones; por ejemplo busybox tiene soporte limitado de i18n.
liori
2
@liori: Estaba bromeando a medias, aunque hace 10-15 años, probablemente lo habría hecho en esa situación (las "características" agregadas, en particular i18n , no son una ventaja en mi opinión - traducciones ininteligibles, y aprendiendo a usar interruptores que rompen inesperadamente los scripts en otra computadora, no, gracias). Sin embargo, hoy en día, estoy contento si solo un sistema Linux se ejecuta sin problemas sin instalar nada, y sin tener que mover / eliminar / editar archivos de sistema / configuración o binarios. Lo cual, lamentablemente, todavía no es el caso con suficiente frecuencia, así que seguramente no estoy tocando algo que funciona :-)
Damon
28

En caso apt-geto dpkgnecesidades rmy sin rmuna reinstalación no es posible, puede emular rmcon perl:

cat > /bin/rm << "EOF"
#!/usr/bin/perl
foreach (@ARGV) { unlink $_ or warn "$@:$!"; }
EOF
chmod +x /bin/rm
NlightNFotis
fuente
3
Tenga en cuenta que no maneja -r, y el hecho de que no devuelve un estado de salida correcto puede causar problemas.
Stéphane Chazelas
66
@StephaneChazelas es suficiente para permitir apt-get install --reinstall coreutilsque el OP vuelva a la normalidad.
terdon
por eso escribí "por si acaso". el paquete coreutils no tiene scripts. Por lo general, los scripts previos y posteriores a la instalación fallan en los errores si los archivos existen o no, por ejemplo, si es necesario eliminarlos. Y sí, es cierto que era demasiado vago para consultar el paquete por adelantado.
también puedes emular rmcon mv(a 'papelera')
sendmoreinfo
14

Intentaría obtener el rmbinario correcto de otra máquina y luego usar scpo algo para copiarlo a la Pi. Por supuesto, esto solo funciona si scpya está instalado ...

Si scpno está disponible, entonces nc(también conocido como netcat) en el lado de envío y bash con una /dev/tcp/HOST/PORTredirección en el lado de recepción podría funcionar también.

Si no tiene otra máquina Raspbian, puede recuperar el paquete coreutils (obtenga la .debversión correcta) y descomprímalo con dpkg-deb(en Debian / Ubuntu / Mint / ..., incluso si no está en un Pi):

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

Si no tiene otra máquina con dpkg, puede extraer el archivo con ar(de las herramientas de desarrollo binutils) y tar:

ar p coreutils*.deb data.tar.gz  | tar xzf - ./bin/rm
Orquídea matemática
fuente
8
Si scpno está disponible, entonces nc(aka netcat) en el lado emisor y bashcon una /dev/tcp/HOST/PORTredirección en el lado receptor podría funcionar también.
MvG
13

Como es debian (o ubuntu), hay una manera fácil de obtener los archivos:

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

Esto funciona porque apt-get descargó el coreutils.deb antes de intentar instalarlo, y se garantizó que dpkg-deb existe en un sistema basado en Debian.

No extraiga directamente a / tmp, cambia los permisos en el directorio principal.

Si vas a jugar, quizás quieras instalar el paquete busybox-static, que funciona incluso si rompes todo lo demás.

Dan Merillat
fuente