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.
fuente
/
que sería casi tan malo eliminar (/etc/
por ejemplo). Simplemente no es el trabajo derm
decidir qué directorios pueden o no pueden eliminarse fácilmente.Respuestas:
rm
Es 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.rm
se 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 pasarlorm
, 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ándarrm
tiene una protección predeterminada contra la destrucción del sistema al negarse a eliminar/
sin la--no-preserve-root
opción.De manera predeterminada, hay tres protecciones contra la eliminación de su sistema de esta manera:
Para eliminar todo el contenido de una carpeta, en lugar de ejecutarlo
rm /path/to/folder/*
, hágalorm -rf /path/to/folder
,mkdir /path/to/folder
ya que esto activará la--preserve-root
protección y eliminará los archivos de puntos de la carpetafuente
/
, 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 constantesafe-rm
hay un contenedorrm
: 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 llamarrm
con los argumentos verificados. Eso no es muy complejo ni propenso a errores.Meet
safe-rm
, el "contenedor alrededor delrm
comando para evitar eliminaciones accidentales":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: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_photos
directorio simplemente agregue su ruta absoluta con la tilde resuelta ensafe-rm
el archivo de configuración de/etc/safe-rm.conf
, por ejemplo:Para los casos en los que se ejecuta
rm
sinsudo
1 y la-f
bandera, es una buena idea agregar unaalias
para su shell que haga querm
la-i
bandera sea la predeterminada. De esta manera, serm
solicitan todos los archivos antes de eliminarlos:Una marca igualmente útil es
-I
que 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":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:
sudo
Ignora los alias , se puede evitar que al definiralias sudo='sudo '
aunquefuente
La confirmación ya está allí, el problema está
-f
en 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:
Es diferente con la
--force
opció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
man
de un comando (también si el comando se encuentra en un tutorial) para ver ejemplos: la primera vez que vi el comandotar xzf some.tar.gz
me pregunto, "¿quéxzf
significa? "Luego leí la página de manual de alquitrán y la descubrí.
fuente
-f
era necesario eliminar las carpetas. Incluso abrí un mensaje para confirmar y quejarme, pero aprendí que solo-r
es necesario. Supongo que serm -rf
ha 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 usorm -r
como 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).rm
no 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 necesitarm
solicitar confirmación, debe pasar el-i
parámetro. Por ejemplo:rm -ir ./*
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:
rm='rm -I'
para solicitar si se eliminan más de 3 cosas.mv -i
andcp -i
(muchos casos de uso normales para estos no implican sobrescribir un archivo de destino).sudo='sudo '
para hacer expansión de alias en el primer argumento parasudo
Me parece
rm -I
mucho más útil querm -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\rm
para 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 -i
o de-I
alias 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 manualmenterm -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 arm -r
después de que hayas terminado de escribir. Por lo tanto, la línea de comando nunca contienerm -rf ~/
comandos peligrosos similares en ningún momento. Solo lo "arma" al cambiarls
arm
control-a, alt-d para ir al inicio de la línea y agregar el-r
o-f
después de que haya terminado de escribir la~/some/sub/dir/
parte del comando.Dependiendo de lo que esté eliminando, ejecute el
ls -d
primero, o no si eso no agregaría nada a lo que ve con la finalización de la pestaña. Puede comenzar conrm
(sin-r
o-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
-rf
menos 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
sudo
comando. Especialmente si no tiene copias de seguridad completas, o ahora sería un mal momento para tener que restaurar desde ellas.fuente
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
Supongo que podría agregar un alias o una función para asegurarse de que esto nunca se pueda ejecutar.
fuente
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.
fuente
rm
consafe-rm
ayuda, al menos..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.chroot
sería usar algo como Docker (que creo que realmente usachroot
debajo de las cubiertas). Para otros archivos que solo necesita leer, monte un sistema de archivos de solo lectura.rm
es 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ódigosudo
y no piensan mucho en usarlo. Funciones que modifican directamente los archivos comorm
,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.
fuente