¿Por qué no puedo enumerar un directorio con permisos de lectura?

14

Creé un directorio dy un archivo fdentro de él. Luego me di solo permisos de lectura en ese directorio. Entiendo que esto debería significar que puedo enumerar los archivos (por ejemplo, aquí ), pero no puedo.

will@wrmpb /p/t/permissions> ls -al
total 0
drwxr-xr-x   3 will  wheel  102  4 Oct 08:30 .
drwxrwxrwt  16 root  wheel  544  4 Oct 08:30 ..
dr--------   3 will  wheel  102  4 Oct 08:42 d
will@wrmpb /p/t/permissions> ls d
will@wrmpb /p/t/permissions>

Si cambio los permisos para escribir y ejecutar, puedo ver el archivo.

will@wrmpb /p/t/permissions> chmod 500 d
will@wrmpb /p/t/permissions> ls d
f
will@wrmpb /p/t/permissions> 

¿Por qué es esto? Estoy usando MacOS.

Editar: con referencia a la respuesta de @ ccorn, es relevante que esté usando fish y type lsda lo siguiente:

will@wrmpb /p/t/permissions> type ls
ls is a function with definition
function ls --description 'List contents of directory'
    command ls -G $argv
end
wrgrs
fuente
El duplicado no responde la pregunta. Implica que puedes hacer lo que yo demuestro que no puedes. La respuesta de @ ccorn es perfecta.
wrgrs
Wow, lo de Fish es una pieza bastante importante de información (inicialmente) faltante.
Stephen Kitt
Sí, tienes razón, debería haberlo agregado, pero parece que lo mismo sucedería en bash si tú alias ls='ls -G', lo que creo que mucha gente hace.
wrgrs
Lo hace por mi. ¿Estás en MacOS? Tal vez hay otra pregunta aquí. Editar: sí, tengo un comportamiento diferente en Linux.
wrgrs

Respuestas:

8

Algunos preparativos, solo para asegurarse de que lsno intente más cosas de las que debería:

$ unalias ls 2>/dev/null
$ unset -f ls
$ unset CLICOLOR

Demostración del rpermiso de directorio:

$ ls -ld d
dr--------  3 ccorn  ccorn  102  4 Okt 14:35 d
$ ls d
f
$ ls -l d
ls: f: Permission denied
$ ls -F d
ls: f: Permission denied

En los sistemas de archivos Unix tradicionales, un directorio era simplemente una lista de pares (nombre, número de inodo). Un número de inodo es un número entero utilizado como índice en la tabla de inodo del sistema de archivos donde se almacena el resto de los metadatos del archivo.

El rpermiso en un directorio permite enumerar los nombres en él, pero no acceder a la información almacenada en la tabla de inodo, es decir, obtener el tipo de archivo, la longitud del archivo, los permisos del archivo, etc., o abrir el archivo. Para eso necesitas el xpermiso en el directorio.

Esta es la razón ls -l, ls -F, lscon la salida de un código de colores, etc fallar sin xpermiso, mientras que una mera lstiene éxito.

El xpermiso solo permite el acceso de inodo, es decir, dado un nombre explícito dentro de ese directorio, xpermite buscar su inodo y acceder a los metadatos de esa entrada de directorio:

$ chmod 100 d
$ ls -l d/f
-rw-r--r--  1 ccorn  ccorn  0  4 Okt 14:35 d/f
$ ls d
ls: d: Permission denied

Por lo tanto, para abrir un archivo /a/b/c/fo una lista de sus metadatos, los directorios /, /a, /a/b, y /a/b/cse deben conceder xpermiso.

Como era de esperar, la creación de entradas de directorio necesita ambos wy xpermisos:

$ chmod 100 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 200 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 300 d
$ touch d/g
$

Wikipedia tiene una breve descripción en un artículo sobre permisos del sistema de archivos .

ccorn
fuente
Increíble. /bin/ls dMuestra los contenidos para mí. ¡Gracias!
wrgrs
OK, entonces fue un problema de redefinición (con -Gsalida coloreada, que necesita metadatos, por lo tanto, xpermisos). Por eso mis preparativos con unalias lsy unset CLICOLOR. Debería haber agregado unset -f lspara eliminar cualquier definición de función también. Editado
ccorn
4

Para leer un directorio también necesita poder atravesarlo (el bit x). Entonces, como mínimo, necesita rx para que un directorio pueda acceder a él de cualquier manera.

Soruk
fuente
2
No, tu no; lsdebería poder enumerar los archivos en el directorio, incluso si el directorio no es ejecutable.
Stephen Kitt
Puede dejar el permiso de lectura desactivado. Entonces podrá acceder a los archivos pero no listar el contenido del directorio.
Kusalananda
@Kusalananda: buen punto, de hecho, uso esto de vez en cuando.
Soruk
@Stephen Kitt: tal vez DEBERÍA, pero la implementación es que no lo hace.
Soruk
1
@Soruk y la pregunta sigue siendo: ¿por qué no?
Stephen Kitt