Después de haber trabajado con Linux durante años, y encontrándome con algo de tiempo libre, decidí revisar algunos conceptos básicos. Así que releí las cosas sobre los permisos (sin verificar el código fuente) y sus casos especiales para carpetas, y se me ocurrió una nueva forma (al menos para mí ...) de pensar sobre los permisos de carpeta (para un usuario específico / grupo / otros): imagino una carpeta como una tabla con dos columnas, así:
filename | inode
foo | 111
bar | 222
El permiso de lectura significa que puede leer (y enumerar) la columna izquierda de la tabla, el permiso de escritura corresponde a agregar y eliminar entradas a la tabla, y el permiso de ejecución corresponde a poder traducir del nombre del archivo al inodo; es decir, puede acceder al contenido de la carpeta.
Hice algunos experimentos, y los resultados son todos consistentes con esta "visión del mundo" mía, pero una conclusión parece inevitable: que una carpeta con permisos d-w-------
es totalmente inútil. Elaboración: no puede enumerar su contenido, no puede leer ningún archivo que sepa que existe dentro (porque no puede traducir nombres a inodes), no puede eliminar o renombrar o agregar archivos, porque de nuevo eso implicaría traducción , y ni siquiera puede agregar enlaces duros (porque, supongo, eso significaría agregar un nombre y un número de inodo, lo que significa que conocería ambos, lo que a su vez, una vez más, viola el propósito de desarmar el permiso de ejecución) . Y, por supuesto, si no son los archivos dentro de una de estas carpetas, entonces usted no puede eliminar esa carpeta o bien, porque no se puede eliminar sus contenidos.
Entonces ... me gustaría hacer dos preguntas:
- ¿Es correcta esta analogía mía o es un gran error?
- Independientemente de la respuesta anterior, ¿hay alguna situación en la que sea apropiado tener una carpeta con los permisos descritos?
mkdir foo ; chmod 200 foo ; touch foo/bar
que llegue touch: cannot touch ‘foo/bar’: Permission denied
. Esto sucede incluso si ya existe foo / bar. Estoy probando en bash (Arch Linux).