¿Por qué no existe tal protección en el comando rm?
Ya hay tres garantías:
- El
-r
conmutador, sin el cual no se puede eliminar un directorio. - El
-i
switch, que verifica que realmente desea eliminar lo que solicitó eliminar. Alias rm
arm -i
activa esa protección a menos que agregue el-f
interruptor para apagarlo. - Propiedad de archivos, lo que impide que todos los usuarios menos
root
de eliminar el directorio raíz.
El conjunto de herramientas de Unix es como una motosierra:fue diseñado para hacer cosas muy poderosas y ser manejado por personas que entienden lo que están haciendo. Aquellos que pisan descuidadamente pueden terminar lastimándose. Esto no quiere decir que los experimentados no cometan errores, y obviamente Sun y otros sienten que los usuarios con root
necesitan ser protegidos de sí mismos.
Sin embargo, ¿no debería este caso específico ser una excepción a esa regla?
La gente ha estado preguntando por qué no podemos poner un protector de hoja sobre el rm
motosierra desde al menos la década de 1980. (Probablemente más tiempo, pero mi historia con Unix no se remonta más allá de eso). Tienes que hacerte más preguntas:
-
Dado que estamos agregando excepciones, ¿qué más debería considerarse sagrado? ¿Deberíamos evitar la eliminación recursiva de cualquier cosa en el directorio raíz para evitar errores igualmente devastadores como
rm -rf /*
? ? ¿Qué pasa con el directorio de inicio del usuario? ¿Qué pasa con/lib
? o/bin
? ¿Tendríamos que tener una versión especial derm
? para evitar estos errores en sistemas con un diseño de sistema de archivos no tradicional? -
¿Dónde ponemos la aplicación de estas prohibiciones? Solo en
rm
¿O le damos al kernel ese trabajo? Desderm
en realidad no elimina nada (hace muchas llamadas aunlink(2)
yrmdir(2)
basado en los argumentos), no habría forma de que el kernel detectara querm
realmente estaba buscando/
hasta que llegó el momento de borrarlo. Desde la única llamada armdir(2)
que alguna vez tendría éxito es cuando el directorio de destino está vacío, alcanzando ese punto con/
significaría que el sistema ya está listo.
Depende de la distribución. El Linux anterior en el que estoy ahora lo permite (creo que no lo probé :-)) y los estados en man rm
:
--no-preserve-root do not treat '/' specially (the default)
--preserve-root
fail to operate recursively on '/'
En muchas distribuciones recientes, debe agregar explícitamente --no-preserve-root
para desactivar la protección. De lo contrario, no se ejecutará.
Con respecto a Ubuntu, consulte este problema donde se analiza este comportamiento.
La historia de esta protección según Wikipedia:
Sun Microsystems presentó rm -rf /
protección en Solaris 10, lanzado por primera vez en 2005. Al ejecutar el comando, el sistema ahora informa que la eliminación de /
No se permite. Poco después, se introdujo la misma funcionalidad en la versión FreeBSD de rm
utilidad. GNU rm
se niega a ejecutar rm -rf /
si el --preserve-root
se da la opción, que ha sido la predeterminada desde que se lanzó la versión 6.4 de GNU Core Utilities en 2006.