¿Por qué rm puede eliminar archivos de solo lectura?

93

Si creo un archivo y luego cambio sus permisos a 444(solo lectura), ¿cómo rmpuede eliminarlo?

Si hago esto:

echo test > test.txt
chmod 444 test.txt
rm test.txt

... rmme preguntará si deseo eliminar el archivo protegido contra escritura test.txt. Hubiera esperado que rmno se pueda eliminar dicho archivo y que tendría que hacer chmod +w test.txtprimero. Si lo hago rm -f test.txta continuación, rmse eliminará el archivo sin siquiera preguntar, a pesar de que se de sólo lectura.

¿Alguien puede aclarar? Estoy usando Ubuntu 12.04 / bash.

Magnus
fuente
Aclaración: estoy ejecutando estos comandos como mi usuario habitual, no como root.
Magnus

Respuestas:

104

Todas las rmnecesidades son permisos de escritura + ejecución en el directorio padre. Los permisos del archivo en sí son irrelevantes.

Aquí hay una referencia que explica el modelo de permisos más claramente de lo que podría:

Cualquier intento de acceder a los datos de un archivo requiere permiso de lectura. Cualquier intento de modificar los datos de un archivo requiere permiso de escritura. Cualquier intento de ejecutar un archivo (un programa o un script) requiere permiso de ejecución ...

Debido a que los directorios no se usan de la misma manera que los archivos normales, los permisos funcionan de manera diferente (pero solo ligeramente) Un intento de listar los archivos en un directorio requiere permiso de lectura para el directorio, pero no en los archivos dentro. Un intento de agregar un archivo a un directorio, eliminar un archivo de un directorio, o cambiar el nombre de un archivo, todos requieren permiso de escritura para el directorio, pero (quizás sorprendentemente) no para los archivos dentro. El permiso de ejecución no se aplica a los directorios (un directorio no puede ser también un programa). Pero ese bit de permiso se reutiliza para directorios para otros fines.

Se necesita permiso de ejecución en un directorio para poder crear un CD en él (es decir, hacer que algún directorio sea su directorio de trabajo actual).

Se necesita ejecutar en un directorio para acceder a la información de "inodo" de los archivos que contiene. Necesita esto para buscar en un directorio para leer los inodos de los archivos dentro. Por esta razón, el permiso de ejecución en un directorio a menudo se denomina permiso de búsqueda.

ire_and_curses
fuente
2
Entonces, si quisiera crear un directorio donde algunos archivos no pudieran eliminarse / modificarse sin hacer chmod primero, pero otros pudieran escribirse libremente, ¿eso sería imposible? Tendría que cambiar el directorio 555, lo que significaría que no se podrían crear ni modificar archivos en el directorio.
Magnus
3
@Magnus: por supuesto, no hay nada que le impida hacer un directorio secundario de escritura dentro del directorio de solo lectura y almacenar sus archivos de escritura dentro de ese. El directorio secundario en sí no se puede eliminar, pero su contenido sí.
ire_and_curses
77
¿No puede hacer que un directorio permanezca fijo +tpara que las personas ya no puedan modificar o eliminar archivos en ese directorio que no son de su propiedad, incluso si tienen acceso de escritura al directorio?
Shadur
3
@Magnus Si tiene acceso de root (incluido sudo), puede usar chattrpara agregar la marca inmutable a los archivos. Si no, entonces ire_and_curses es bastante correcto.
James O'Gorman
66
No usar rm -f sólo funciona siempre y cuando estoy sobrio ... además, no tengo idea de lo que los scripts bash con retraso escribo puede o no puede hacer
Magnus
53

Ok, de acuerdo con tu comentario a ire_and_curses, lo que realmente quieres hacer es hacer que algunos archivos sean inmutables. Puedes hacer eso con el chattrcomando. Por ejemplo:

p.ej

$ cd /tmp
$ touch immutable-file
$ sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

No puede hacer nada en un archivo inmutable: no puede eliminarlo, editarlo, sobrescribirlo, cambiarle el nombre, cambiarlo o mostrarlo, ni nada más. Lo único que puede hacer con él es leerlo (si los permisos de Unix lo permiten) y (como root) chattr -ieliminar el bit inmutable.

No todos los sistemas de archivos admiten todos los atributos. AFAIK, inmutable es compatible con todos los sistemas de archivos de Linux comunes (incluidos ext2 / 3/4 y xfs. Zfsonlinux no admite atributos en este momento)

cas
fuente
3
De vez en cuando es útil. Por cierto, ni siquiera la raíz puede modificar o eliminar un archivo inmutable (no sin eliminar primero el atributo inmutable). también por cierto, use lsattrpara enumerar atributos.
cas
2
1 - Me había olvidado de atributos, y estaba tan ocupada respondiendo a la pregunta literal acerca rmde que esto nunca se me ocurrió ...
ire_and_curses
2
Esto es específico del sistema de archivos y esto podría traerle más problemas que resuelve.
Stéphane Gimenez
44
@Magnus: los posibles problemas incluyen la copia de seguridad (no todas las utilidades de copia de seguridad harán una copia de seguridad de los atributos; de hecho, la mayoría no) y restaurarán (si restaura a un directorio que ya contiene un archivo inmutable, algunos programas tratarán la imposibilidad de sobrescribir ese archivo como un error fatal y abortar). También puede causar confusión si olvida que hizo un archivo inmutable y no puede entender por qué no puede eliminarlo ... el mensaje de error 'Operación no permitida' es el mismo mensaje de error que ve con algunos tipos de sistema de archivos corrupción, que puede conducir a una reacción exagerada potencialmente peligrosa.
cas
1
Usted puede copiar (cp) un archivo inmutable.
Pulpo
0

¡Una respuesta a esta pregunta afirma que puede eliminar un archivo del directorio solo si tiene solo writepermiso, es totalmente incorrecto! ¡solo inténtalo! Otorgue writepermiso a un directorio e intente eliminarlo, ¡no puede!
Para eliminar un archivo dentro de un directorio necesita ambos writey executepermiso en el directorio

Ahora volvamos a la pregunta: para eliminar un archivo usando rmsimplemente está eliminando su información de inodo del directorio, es decir, no shreddinglo está del disco. Si la información del archivo de inodo no está en el directorio, no puede acceder (también porque no puede verlo ya que no está en la lista de su directorio principal), es decir, se elimina por usted.
Por lo tanto, para eliminar un archivo de un directorio, todo lo que necesita es permiso en el directorio; los permisos en ese archivo son irrelevantes

Edward Torvalds
fuente