A execução de 'ls' com '--color = auto | always' precisa de permissões de execução

0

Eu tenho estado completamente confuso por algum tempo com ls simplesmente recusando-se a trabalhar em alguns lugares, mesmo que eu tenha permissões de leitura. Depois de mexer um pouco, acontece que ls funciona bem, desde que eu execute com --color=never , mas assim que eu uso auto ou always , recebo o familiar erro Permission denied em tudo onde eu não tenho permissões de execução.

O que causa isso e como posso pará-lo, mantendo minha ls em cores?

Atualização: Ok, finalmente descobri (como de costume, diretamente depois de pedir ajuda). Você precisa executar permissões para entrar em diretórios, então cd e ls --color não funcionam em diretórios sem ele. Eu não tenho idéia porque eu ainda posso ls --color = nunca em diretórios sem ele embora. Curioso porque isso é?

    
por ahstro 11.08.2016 / 18:01

2 respostas

3

Para ver o conteúdo de um diretório (os nomes das entradas) requer apenas permissão de leitura no diretório.

Isso significa que você pode executar /bin/ls e ver todos os nomes sem problemas.

Mas para decidir com que cor os nomes devem ser exibidos, ls usa outras propriedades das entradas. Ele usa metadados do arquivo (permissões, tamanho, tipo de arquivo, etc.) Isso requer que stat() do arquivo e que exija permissão de execução no diretório para ter sucesso.

Apenas os nomes dos arquivos em um diretório: você só precisa de permissão de leitura. Para metadados sobre os arquivos em um diretório: você precisa de permissão de leitura e execução

    
por 11.08.2016 / 18:21
2

Para listar apenas os nomes das coisas em um diretório, sem se preocupar com seus tipos (etc.), apenas requer permissão de leitura no diretório.

Para atribuir a cor às coisas dentro de um diretório, ls precisa saber coisas sobre elas - tipo de entrada (outro diretório, arquivo simples, dispositivo, link simbólico, etc.), tamanho, alvo do link simbólico; encontra aqueles por vários syscalls na entrada. Isso requer o bit de permissão +x no diretório que contém esses itens. (Na verdade, dependendo da versão do kernel, você ainda pode obter algumas cores - getdents pode fornecer o nome e o tipo).

Minha versão de ls , a propósito, ainda lista o diretório depois de cuspir os erros de permissão negada (embora todas as cores). E se você quiser ver outra coisa estranha, tente -l :

$ ls -l test 2>/dev/null 
total 0
l????????? ? ? ? ?            ? badsymlink
-????????? ? ? ? ?            ? empty
p????????? ? ? ? ?            ? fifo
l????????? ? ? ? ?            ? goodsymlink
-????????? ? ? ? ?            ? notempty
    
por 11.08.2016 / 18:22