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

14

Eu criei um diretório de um arquivo fdentro dele. Então, eu me dei apenas permissões de leitura nesse diretório. Entendo que isso deva significar que 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 gravar 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? Estou usando o MacOS.

Editar: com referência à resposta da @ ccorn, é relevante que eu esteja usando peixe e type lsforneça 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
wrgrs
fonte
A duplicata não responde à pergunta. Isso implica que você pode fazer o que eu demonstro que não pode. A resposta de @ ccorn é perfeita.
wrgrs
Uau, a coisa do peixe é uma peça bastante importante (inicialmente) de informações ausentes.
Stephen Kitt
Sim, você está certo, eu deveria ter adicionado, mas parece que a mesma coisa aconteceria no bash se você alias ls='ls -G', o que eu acho que muitas pessoas fazem.
wrgrs
Faz por mim. Você está no MacOS? Talvez haja outra pergunta aqui. Edit: sim, eu recebo um comportamento diferente no Linux.
wrgrs

Respostas:

8

Alguns preparativos, apenas para garantir que lsnão tente mais coisas do que deveria:

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

Demonstração da rpermissão do diretório:

$ 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 pares (nome, número de inode). Um número de inode é um número inteiro usado como índice na tabela de inodes do sistema de arquivos onde o restante dos metadados do arquivo é armazenado.

A rpermissão em um diretório permite listar os nomes, mas não acessar as informações armazenadas na tabela de inodes, ou seja, obter tipo de arquivo, comprimento, permissões de arquivo etc. ou abrir o arquivo. Para isso, você precisa da xpermissão no diretório.

É por isso que ls -l, ls -F, lscom a saída de código de cores etc falhar sem xpermissão, enquanto que um mero lsbem-sucedido.

A xpermissão só permite o acesso inode, ou seja, dada um nome explícito dentro desse diretório, xpermite olhar para cima sua inode eo acesso que os metadados do diretório entrada:

$ 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/fou listar seus metadados, a diretórios /, /a, /a/b, e /a/b/cdeve ser concedido xpermissão.

Não é novidade que a criação de entradas de diretório precisa de permissões we de x:

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

ccorn
fonte
Surpreendente. /bin/ls dmostra o conteúdo para mim. Obrigado!
wrgrs
OK, era um problema de redefinição (com -Gsaída colorida, que precisa de metadados, portanto xpermanentes). Portanto, meus preparativos com unalias lse unset CLICOLOR. Eu deveria ter adicionado unset -f lspara remover qualquer definição de função também. Editado.
Ccorn 4/10
4

Para ler um diretório, você também precisa atravessá-lo (o bit x). Portanto, no mínimo, você precisa de rx para que um diretório possa acessá-lo de qualquer maneira.

Soruk
fonte
2
Não você não; lsainda deve poder listar os arquivos no diretório, mesmo que o diretório não seja executável.
Stephen Kitt
Você pode deixar a permissão de leitura desativada. Você poderá acessar os arquivos, mas não listar o conteúdo do diretório.
Kusalananda
@ Kusalananda - bom ponto, na verdade eu uso isso de tempos em tempos.
Soruk 04/10/19
@ Stephen Kitt - Talvez DEVE, mas a implementação é que não.
Soruk 04/10/19
1
@ Soruk e assim permanece a pergunta: por que não?
Stephen Kitt