¿Por qué es posible eliminar todo el sistema de archivos?

24

Después de cometer el infame error de eliminar todo mi sistema de archivos sudo rm -rf /*, recuperarme del terrible daño que había hecho y hacer frente al hecho de que solo perdí 6 años de mi vida útil, comencé a preguntarme por qué es posible hacerlo, y qué se puede hacer para evitar que ocurra este error.

Una solución que me sugirieron es revocar el acceso a la raíz desde mi cuenta, pero eso es inconveniente, porque muchos comandos requieren acceso a la raíz y cuando tienes que ejecutar unas pocas docenas de comandos todos los días, eso se vuelve molesto.

Hacer una copia de seguridad de su sistema es el camino obvio. Pero la restauración de una copia de seguridad también requiere un tiempo de inactividad y, dependiendo de su sistema, ese tiempo de inactividad podría ser de días o semanas, lo que podría ser inaceptable en algunos casos.

Mi pregunta es: ¿por qué no implementar una confirmación cuando el usuario intenta eliminar su sistema de archivos? Entonces, cuando realmente quieres hacer eso, simplemente presionas Y o enter, y si no lo haces, al menos no lo pierdes todo.

Mister_Fix
fuente
20
"¿Por qué es posible hacer eso?" ¿Por qué no debería ser posible? Hay razones perfectamente buenas para eliminar el contenido de una jerarquía de directorios, y hay muchos subconjuntos de los /que sería casi tan malo eliminar ( /etc/por ejemplo). Simplemente no es el trabajo de rmdecidir qué directorios pueden o no pueden eliminarse fácilmente.
chepner
2
El título dice "¿Por qué es posible eliminar el sistema?" mientras que la pregunta en sí pregunta "Mi pregunta es: ¿Por qué no implementar una confirmación cuando el usuario intenta eliminar su sistema de archivos?". Entonces esto hace que la pregunta no sea clara. ¿Cuál es su pregunta real para que al menos sepamos qué responder? Edite su publicación para aclarar
Sergiy Kolodyazhnyy
3
¿Cuál es realmente la pregunta aquí? Puedo ver tres: (1) ¿Por qué es posible? (2) ¿Cómo evitar hacerlo ?, y (3) ¿Por qué no implementar una confirmación? - No son la misma pregunta, la primera pide razonamiento, la segunda herramientas. (El tercero está relacionado con el segundo, pero aún no es lo mismo. Una confirmación no es la única forma de evitar algo).
ilkkachu
10
Si no está pidiendo una aclaración del autor de la pregunta, no haga ningún comentario . Veo muchos comentarios de autocomplacimiento aquí, explicando cómo es culpa del OP por no saber lo que significan las banderas, o por no tener una copia de seguridad o lo que sea. Estoy muy feliz de saber que muchos de nuestros usuarios son lo suficientemente sabios como para tener copias de seguridad y no ejecutar comandos que no entienden. Eso es absolutamente genial para ellos, pero fundamentalmente inútil para el OP que, presumiblemente, también ha aprendido esta lección por ahora. Así que dejemos de disfrutar nuestra propia brillantez y simplemente respondamos la pregunta.
Terdon

Respuestas:

16

rmEs una herramienta de sistema de bajo nivel. Estas herramientas se crean de la manera más simple posible, ya que deben estar presentes en cualquier sistema. rmse espera que tenga un comportamiento bien conocido, especialmente con respecto a las solicitudes de confirmación para que pueda usarse en scripts.

rm /*No sería posible agregar un caso especial para solicitar , ya que el comando rm no lo ve de esta forma. El *shell expande el comodín antes de pasarlo rm, por lo que el comando real que necesita un caso especial sería algo así rm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz. Agregar el código para verificar este caso (que probablemente será diferente en Linux diferentes) sería un desafío complejo además de ser propenso a errores sutiles. El Linux estándar rmtiene una protección predeterminada contra la destrucción del sistema al negarse a eliminar /sin la --no-preserve-rootopción.

De manera predeterminada, hay tres protecciones contra la eliminación de su sistema de esta manera:

  1. Permisos: los usuarios habituales no podrán eliminar archivos importantes. Pasaste esto por alto con sudo
  2. Directorios: de forma predeterminada, rm no eliminará directorios. Omitiste esto con la bandera -r
  3. Archivos protegidos contra escritura: de forma predeterminada, rm solicitará confirmación antes de eliminar un archivo protegido contra escritura (esto no habría detenido todo el daño, pero podría haber proporcionado un aviso antes de que el sistema se volviera irrecuperable). Omitiste esta protección con la bandera -f

Para eliminar todo el contenido de una carpeta, en lugar de ejecutarlo rm /path/to/folder/*, hágalo rm -rf /path/to/folder, mkdir /path/to/folderya que esto activará la --preserve-rootprotección y eliminará los archivos de puntos de la carpeta

Rhellen
fuente
3
"se espera que rm tenga un comportamiento bien conocido" y, de hecho, es una de las herramientas especificadas por el estándar POSIX. "El shell comodín expande he * antes de pasarlo a rm" Exactamente, por lo que agregar comprobaciones para todo tipo de parámetros, que pueden ser enlaces simbólicos a directorios y archivos reales /, requeriría muchas combinaciones y consideraciones, por lo que no es práctico. Y volviendo a la idea de los estándares, agregar tales controles rompería el comportamiento constante
Sergiy Kolodyazhnyy
Esa es exactamente la razón por la que safe-rmhay un contenedor rm: de esta manera puede verificar cada argumento (en lugar de la línea de comando aleatoria completa), verificar que no esté en la lista negra configurable y solo luego llamar rmcon los argumentos verificados. Eso no es muy complejo ni propenso a errores.
postre
59

Meet safe-rmInstalar safe-rm, el "contenedor alrededor del rmcomando para evitar eliminaciones accidentales":

safe-rm evita la eliminación accidental de archivos importantes al reemplazarlos rmcon un contenedor que verifica los argumentos dados contra una lista negra configurable de archivos y directorios que nunca deben eliminarse.

Los usuarios que intenten eliminar uno de estos archivos o directorios protegidos no podrán hacerlo y se les mostrará un mensaje de advertencia. ( man safe-rm)

Si el enlace de instalación anterior no funciona, simplemente utilícelo sudo apt install safe-rm. La configuración predeterminada ya contiene los directorios del sistema, intentemos, rm /*por ejemplo:

$ rm /*
safe-rm: skipping /bin
safe-rm: skipping /boot
safe-rm: skipping /dev
safe-rm: skipping /etc
safe-rm: skipping /home
safe-rm: skipping /lib
safe-rm: skipping /proc
safe-rm: skipping /root
safe-rm: skipping /sbin
safe-rm: skipping /sys
safe-rm: skipping /usr
safe-rm: skipping /var
…

Como puede ver, esto evitará que elimine /home, donde supongo que sus archivos personales están almacenados. Sin embargo, no evita que elimines ~ninguno de sus subdirectorios si intentas eliminarlos directamente. Para agregar el ~/precious_photosdirectorio simplemente agregue su ruta absoluta con la tilde resuelta en safe-rmel archivo de configuración de /etc/safe-rm.conf, por ejemplo:

echo /home/dessert/precious_photos | sudo tee -a /etc/safe-rm.conf

Para los casos en los que se ejecuta rmsin sudo1 y la -fbandera, es una buena idea agregar unaalias para su shell que haga que rmla -ibandera sea la predeterminada. De esta manera, se rmsolicitan todos los archivos antes de eliminarlos:

alias rm='rm -i'

Una marca igualmente útil es -Ique solo advierte "una vez antes de eliminar más de tres archivos, o cuando se elimina de forma recursiva", que es "menos intrusivo que -i, a la vez que brinda protección contra la mayoría de los errores":

alias rm='rm -I'

El peligro general de estos alias es que usted se acostumbra fácilmente a confiar en ellos para salvarlo, lo que puede ser contraproducente cuando se utiliza un entorno diferente.


1: sudoIgnora los alias , se puede evitar que al definir alias sudo='sudo 'aunque

postre
fuente
25

La confirmación ya está allí, el problema está -fen el comando, es decir --force; Cuando el usuario fuerza una operación, se supone que sabe lo que está haciendo (obviamente, siempre puede aparecer un error).

Un ejemplo:

 rm -r ./*
 rm: remove write-protected regular file './mozilla_mvaschetto0/WEBMASTER-04.DOC'? N
 rm: cannot remove './mozilla_mvaschetto0': Directory not empty
 rm: descend into write-protected directory './pulse-PKdhtXMmr18n'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-bolt.service-rZWMCb'? n
 rm: descend into write-protected directory './systemd-private-     890f5b31987b4910a579d1c49930a591-colord.service-4ZBnUf'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-fwupd.service-vAxdbk'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-minissdpd.service-9G8GrR'? 
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-ModemManager.service-s43zUX'? nn
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-rtkit-daemon.service-cfMePv'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-systemd-timesyncd.service-oXT4pr'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-upower.service-L0k9rT'? n

Es diferente con la --forceopción: no obtendré ninguna confirmación y los archivos se eliminarán.

El problema es conocer el comando y sus parámetros, navegar más en el mande un comando (también si el comando se encuentra en un tutorial) para ver ejemplos: la primera vez que vi el comando tar xzf some.tar.gzme pregunto, "¿qué xzfsignifica? "

Luego leí la página de manual de alquitrán y la descubrí.

AtomiX84
fuente
No creo que sea relevante aquí. En el punto en que rm primero solicita un archivo protegido contra escritura o lo que sea, es posible que ya haya eliminado un montón de archivos importantes.
Jonas Schäfer
1
Entonces, personalmente, siempre pensé que -fera necesario eliminar las carpetas. Incluso abrí un mensaje para confirmar y quejarme, pero aprendí que solo -res necesario. Supongo que se rm -rfha convertido en la norma ya que es muy útil en un script (no desea que el script falle solo porque está tratando de eliminar cosas que no existen), por lo que lo ve a menudo, pero supongo que necesitamos estar alerta sobre el uso rm -rcomo nuestro "valor predeterminado" cuando se encuentra en un shell (es comprensible que no haya supuestos "predeterminados" que no comprenda, especialmente con sudo, pero las personas serán personas y al menos esto es más seguro).
Capitán Man
2
Rmdir es la forma más segura de eliminar una carpeta
AtomiX84
rmno solicita confirmación por defecto, solo le pide directorios y archivos protegidos contra escritura. Si ejecutó ese comando en su máquina, probablemente eliminó muchos de sus propios archivos. Si necesita rmsolicitar confirmación, debe pasar el -iparámetro. Por ejemplo:rm -ir ./*
Dan
8

Ejecutar sin copias de seguridad significa que debe tener mucho cuidado para nunca cometer errores. Y espero que su hardware nunca falle. (Incluso RAID no puede salvarlo de la corrupción del sistema de archivos causada por una RAM defectuosa). Ese es su primer problema. (Lo que supongo que ya te has dado cuenta y harás copias de seguridad en el futuro).


Pero hay cosas que puede hacer para reducir la probabilidad de errores como este:

  • alias rm='rm -I'para solicitar si se eliminan más de 3 cosas.
  • alias mv y cp to mv -iand cp -i(muchos casos de uso normales para estos no implican sobrescribir un archivo de destino).
  • alias sudo='sudo 'para hacer expansión de alias en el primer argumento parasudo

Me parece rm -Imucho más útil que rm -i. Por lo general, no se avisa durante el uso normal, por lo que se le indica cuando no esperaba que sea una advertencia mucho más notable / mejor. Con -i(antes de descubrir -I), me acostumbré a escribir \rmpara deshabilitar la expansión de alias, después de estar seguro de haber escrito el comando correctamente.

No querrás tener el hábito de depender de ti rm -io de -Ialias para salvarte . Es su línea de seguridad que espera que nunca se use. Si realmente quiero seleccionar interactivamente qué coincidencias eliminar, o no estoy seguro de si mi glob podría coincidir con algunos archivos adicionales, escribo manualmente rm -i .../*whatever*. (También es un buen hábito en caso de que alguna vez se encuentre en un entorno sin sus alias).

Defiéndete de los dedos gordos Enterescribiendo ls -d /*foo*primero , luego con la flecha hacia arriba y cámbialo a rm -rdespués de que hayas terminado de escribir. Por lo tanto, la línea de comando nunca contiene rm -rf ~/comandos peligrosos similares en ningún momento. Solo lo "arma" al cambiar lsa rmcontrol-a, alt-d para ir al inicio de la línea y agregar el -ro -fdespués de que haya terminado de escribir la ~/some/sub/dir/parte del comando.

Dependiendo de lo que esté eliminando, ejecute el ls -dprimero, o no si eso no agregaría nada a lo que ve con la finalización de la pestaña. Puede comenzar con rm(sin -ro -rf) por lo que es solo control-a / control-right (o alt + f) / space / -r.

(Acostúmbrate a las potentes combinaciones de teclas de edición de bash / readline para moverte rápidamente, como las flechas de control o alt + f / b para moverte por palabras y matar palabras enteras con alt + retroceso o alt + d, o control-w. Y controla -u para matar al principio de la línea. Y control- / para deshacer una edición si va un paso demasiado lejos. Y, por supuesto, el historial de flechas hacia arriba que puede buscar con control-r / control-s.)

Evite a -rfmenos que realmente lo necesite para silenciar las indicaciones sobre la eliminación de archivos de solo lectura.

Tómese más tiempo para pensar antes de presionar la tecla de retorno en un sudocomando. Especialmente si no tiene copias de seguridad completas, o ahora sería un mal momento para tener que restaurar desde ellas.

Peter Cordes
fuente
6

Bueno, la respuesta corta es no ejecutar dicho comando.

La larga historia es que es parte de la personalización. Esencialmente hay dos factores en juego aquí. Uno es el hecho de que eres libre de modificar todos los archivos.

El segundo es que el comando rm ofrece el útil azúcar sintáctico para eliminar todos los archivos de una carpeta.

Efectivamente, esto podría reformularse como un principio simple de las máquinas Unix. Todo es un archivo . Para mejorar las cosas, hay controles de acceso, pero estos se anulan por el uso de

sudo

Supongo que podría agregar un alias o una función para asegurarse de que esto nunca se pueda ejecutar.

Haozeke
fuente
4

Si el uso del espacio de archivos de su sistema no es inmenso (y en estos días 'inmenso' significa 'cientos de gigabytes o más'), cree algunas instancias de máquinas virtuales y siempre trabaje dentro de una. La recuperación solo implicaría usar una instancia de respaldo.

O podrías crear una cárcel chroot y trabajar dentro de ella. Aún necesitaría algo de recuperación si se destruyera, pero eso sería más fácil con un sistema en ejecución (cerrado) para trabajar.

Loren Rosen
fuente
Esta es probablemente la respuesta más efectiva, ya que puede proteger contra cualquier daño, incluso los scripts de terceros. Solo tendría que preocuparse por el malware real.
PyRulez
Pensó en otro ángulo. Vale la pena preguntarse por qué necesita hacer eliminaciones recursivas en primer lugar. Tal vez lo que realmente se necesita son algunos scripts para eliminar un proyecto, etc.
Loren Rosen
"Vale la pena preguntarse por qué necesita hacer eliminaciones recursivas en primer lugar". Bueno, el hecho de que no haya un comando incorporado no significa que aún no pueda cometer un error. Los scripts de terceros pueden eliminar archivos uno por uno de algún directorio. Y hay otras formas de descifrar el sistema que solo tocan un archivo. Sin embargo, reemplazar rmcon safe-rmayuda, al menos.
PyRulez
Mi noción con el guión era que tendría una noción incorporada de un 'proyecto' o similar. Quizás tendría un archivo vacío en la raíz del proyecto llamado .project_root, o, si el sistema de archivos lo admite, un atributo en el directorio mismo. Luego, el script subiría al árbol de archivos en busca de la raíz del proyecto y se quejaría de que el directorio actual no estaba en un proyecto. O, si todos los proyectos viven en el mismo lugar, la secuencia de comandos podría requerir que nombre un proyecto. Todavía podría eliminar el proyecto incorrecto, pero no destruir todo el sistema.
Loren Rosen
... también, una variante de chrootsería usar algo como Docker (que creo que realmente usa chrootdebajo de las cubiertas). Para otros archivos que solo necesita leer, monte un sistema de archivos de solo lectura.
Loren Rosen
3

rmes un comando de Unix muy antiguo y probablemente no fue diseñado teniendo en cuenta la facilidad de uso. Intenta hacer exactamente lo que se le pide, cuando tiene los permisos. Una trampa para muchos usuarios nuevos es que con frecuencia ven el código sudoy no piensan mucho en usarlo. Funciones que modifican directamente los archivos como rm, dd, chroot, etc. requieren un cuidado extremo en uso.

Hoy en día me gusta usar trash(sin sudo) de trash-cli . Funciona como la Papelera de reciclaje de Windows, ya que puede recuperar fácilmente archivos borrados accidentalmente. Ubuntu ya tiene una carpeta Papelera y funcionalidad de mover a basura integrada en Archivos.

Incluso entonces puede cometer errores, así que asegúrese de hacer copias de seguridad de todo su sistema de archivos.

qwr
fuente