Por que não consigo listar um diretório com permissões de leitura?

14

Eu criei um diretório d e um arquivo f dentro dele. Eu me dei apenas permissões de leitura naquele diretório. Eu entendo isso deve significar que eu posso listar os arquivos (por exemplo, aqui ), mas não posso.

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>

Se eu alterar as permissões para escrever e executar, posso ver o arquivo.

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

Por que isso? Eu estou usando o MacOS.

Editar: com referência à resposta do @ccorn, é relevante que eu esteja usando fish e type ls dê o seguinte:

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
    
por wrgrs 04.10.2017 / 09:51

2 respostas

6

Algumas preparações, apenas para garantir que ls não tente mais coisas do que deveria:

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

Demonstração da permissão do diretório r :

$ 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

Nos sistemas de arquivos Unix tradicionais, um diretório era simplesmente uma lista de (nome, inode número) pares. Um número de inode é um inteiro usado como índice no sistema de arquivos tabela de inodes onde o restante dos metadados do arquivo é armazenado.

A permissão r em um diretório permite listar os nomes, mas não para acessar as informações armazenadas na tabela de inode, isto é, obtendo o tipo de arquivo, tamanho do arquivo, permissões de arquivo etc ou abrindo o arquivo. Para isso, você precisa da permissão x no diretório.

É por isso que ls -l , ls -F , ls com saída codificada por cores etc. falha sem x permissão, enquanto um mero ls é bem-sucedido.

A permissão x sozinha permite acesso ao inode, ou seja, dado um nome dentro desse diretório, x permite procurar seu inode e acessar os metadados dessa entrada de diretório:

$ 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

Portanto, para abrir um arquivo /a/b/c/f ou listar seus metadados, os diretórios / , /a , /a/b e /a/b/c devem receber a permissão x .

Não é novidade que criar entradas de diretório precisa de w e x permissions:

$ 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
$

A Wikipedia tem uma breve visão geral em um artigo sobre permissões do sistema de arquivos .

    
por 04.10.2017 / 15:42
4

Para ler um diretório, você também precisa ser capaz de percorrê-lo (o bit x). Então, no mínimo, você precisa do r-x para um diretório ser capaz de acessá-lo de qualquer forma.

    
por 04.10.2017 / 09:58