Por que rodar “$ sudo chmod -R 664. ”Me fez ter acesso negado em todos os diretórios afetados?

1

Eu tenho uma pasta de projeto que possui permissões confusas em todos os arquivos. Eu tive a má tendência de definir tudo como permissões octal 777 porque resolveu todos os problemas não relacionados à segurança. Em seguida, os uploads de FTP, arquivos criados por editores de texto etc. têm seu próprio conjunto de permissões, tornando tudo uma bagunça. Decidi me juntar e começar a usar as permissões da maneira que elas deveriam ser usadas.

Achei que 664 era um bom padrão para todos os meus arquivos e pastas, e apenas removia as permissões de outras pessoas em arquivos particulares e adicionava + x para arquivos executáveis.

No segundo, alterei minha pasta de projeto para 664:

$ sudo chmod -R 664.  
$ ls  
ls: não é possível abrir o diretório.: permissão negada  

O que não faz sentido para mim. Eu tenho permissões de leitura / gravação e sou o proprietário da pasta do projeto. A parte mais à esquerda da ls -lpasta do meu projeto é assim:

-rw-rw-r-- 1 codemonkey codemonkey ...
drw-rw-r-- 5 codemonkey codemonkey ...
-rw-rw-r-- 1 codemonkey codemonkey ...
-rw-rw-r-- 1 codemonkey codemonkey ...
drw-rw-r-- 3 codemonkey codemonkey ...
-rw-rw-r-- 1 codemonkey codemonkey ...
-rw-rw-r-- 1 codemonkey codemonkey ...
-rw-rw-r-- 1 codemonkey codemonkey ...
drw-rw-r-- 4 codemonkey codemonkey ...
drw-rw-r-- 5 codemonkey codemonkey ...

Presumo que isso tenha algo a ver com as permissões nos diretórios, mas o que?

Hubro
fonte

Respostas:

2

O bit de execução é necessário para percorrer um diretório * nix. Você não pode cdentrar em um diretório para o qual não tenha permissões de execução, e isso afeta vários utilitários de maneiras não óbvias, se eles precisarem de um contexto de diretório. Considerar:

$ cd /tmp
$ mkdir foo
$ echo baz > foo/bar
$ chmod a-x foo

# You can read the contents of the directory, but ls still complains. 
$ ls foo
ls: cannot access foo/bar: Permission denied
bar

# You can't read the file because you can't enter the directory.
$ cat foo/bar
cat: foo/bar: Permission denied

A razão para tudo isso é a maneira como stat () funciona. Extraído de man 2 stat:

Nenhuma permissão é necessária no arquivo em si, mas - no caso de stat () e lstat () - a permissão execute (search) é necessária em todos os diretórios no caminho que leva ao arquivo.

A linha inferior é que um recursivo chmodraramente fará o que você espera e causará estragos nas permissões de leitura e execução de diretório que podem levar a resultados inesperados como o seu. Sempre trate as permissões de diretório separadamente das permissões de arquivo para obter melhores resultados.

CodeGnome
fonte
3

Você precisa executar permissões nos diretórios.

Considerar

sudo find -type d -exec chmod +x {} +

Atualização: aqui está minha racionalização do uso, aparentemente estranho, das permissões de execução.

O Unix (e, portanto, o Linux) trata praticamente tudo como arquivos. Isso se estende a discos e a vários outros dispositivos. também inclui diretórios.

Os sistemas de arquivos Unix tradicionais têm um conjunto de permissões que se aplicam aos arquivos. Portanto, os descritores do Unix precisavam encontrar algo útil para cada bit de permissão quando aplicado a um "arquivo" que não era o seu arquivo de dados normal.

Vamos considerar diretórios. Inicialmente, parece razoável usar apenas a permissão de leitura para decidir se alguém pode acessar o diretório - por exemplo, para produzir uma lista dos arquivos nele, seus tamanhos e carimbos de data, etc.

No entanto, suponha que você queira que usuários comuns possam executar programas em / usr / local / bin, mas não que eles possam vasculhar em / usr / local para ver o que está lá. Se você tiver apenas permissão de leitura, não poderá impedir isso.

Portanto, a permissão de execução, que de outra forma seria redundante, foi usada para controlar se o seu shell pode "atravessar" um diretório, o que queremos dizer, não descobrir mais o que é necessário para poder encontrar e ler os detalhes de um subdiretório como parte de um caminho. Isso permite que você acesse o diretório / usr / local apenas na medida do necessário para ler o conteúdo de / usr / local / bin.

Portanto, + x em / usr / local significa que você pode executar "/ usr / local / bin / foo". Mas + r em / usr / local significa que você pode descobrir tudo o que está em / usr / local, incluindo quem o possui, quais permissões cada arquivo tem, qual o tamanho, etc.

O exposto acima é baseado em lembranças vagas e suposições. Pode não ser exatamente verdade, mas acredito que dá uma idéia razoável de por que "executar" significa "capaz de atravessar".

RedGrittyBrick
fonte
Isso não faz sentido, mas funcionou. Por que diabos os diretórios exigem permissões de execução?
Hubro
1
@ Codemonkey Não critique o que você não entende. De que outra forma você implementaria o controle de acesso?
Daniel Beck
Eu não estou atacando nada, só perguntando por diretórios necessidades permissões de execução: S
Hubro
1
@ Codemonkey Você entende o conceito de sistemas multiusuário, certo? Deve haver alguma maneira de proibir o acesso aos diretórios. É para isso que a execução é usada. É isso aí. Em relação à nomenclatura, bem, você não está lendo diretórios também, mas incluí-los, e você não está escrevendo-los, mas adicionar ou remover arquivos ...
Daniel Beck
Eu assumi que as permissões de leitura de diretório regulariam se você podia ver o que havia dentro dele, e as permissões de gravação regulariam a renomeação ou a exclusão. Você não pode me dizer que essa não é a suposição lógica para alguém que não verificou. De qualquer forma obrigado pela explicação
Hubro