Por que as permissões de gravação e execução estão em um diretório necessário para poder excluir arquivos? [duplicado]

5

É fácil perceber que as permissões de um arquivo não são relevantes para a capacidade de excluir esse arquivo. A capacidade de modificar a listagem de diretórios é controlada pelas permissões do diretório.

No entanto, por anos eu acreditei que o propósito da permissão de escrita era permitir modificação do diretório, e a permissão de execução era para 'pesquisar' - listar arquivos, ou mudar para o diretório .

Hoje eu descobri que não é possível rm um arquivo em um diretório a menos que ambos os bits de gravação e execução estejam configurados. Na verdade, sem executar set, a escrita parece quase inútil.

$ tree foo/
foo/
└── file_to_delete

0 directories, 1 file
$ chmod -x foo
$ ls -ld foo
drw-rw-r-- 2 ire_and_curses users 4096 Sep 18 22:08 foo/
$ rm foo/file_to_delete 
rm: cannot remove ‘foo/file_to_delete’: Permission denied
$ chmod +x foo/
$ rm foo/file_to_delete 
$ tree foo/
foo/

0 directories, 0 files
$

Acho esse comportamento bastante surpreendente. Para diretórios, qual é a razão pela qual a execução é necessária para tornar a escrita útil na prática?

    
por ire_and_curses 19.09.2015 / 07:17

1 resposta

3

Sem o bit de execução, não é possível executar stat() nos arquivos do diretório, o que significa que você não pode determinar as informações de inode desses arquivos. Para remover um arquivo, você deve saber as informações que seriam retornadas por stat() .

Uma demonstração disso:

$ ls -ld test
drw------- 2 alienth alienth 4096 Sep 18 23:45 test

$ stat test/file
stat: cannot stat ‘test/file’: Permission denied

$ strace -e newfstatat rm test/file
newfstatat(AT_FDCWD, "test/file", 0x1a3f368, AT_SYMLINK_NOFOLLOW) = -1 EACCES (Permission denied)
newfstatat(AT_FDCWD, "test/file", 0x7fff13d4f4f0, AT_SYMLINK_NOFOLLOW) = -1 EACCES (Permission denied)
rm: cannot remove ‘test/file’: Permission denied
+++ exited with 1 +++

Você também pode demonstrar isso com um simples ls -l . A informação de metadados do diretório pode ser legível e gravável para o seu usuário, mas sem executar você não pode determinar os detalhes do arquivo dentro do diretório.

$ ls -l test
ls: cannot access test/file: Permission denied
total 0
-????????? ? ? ? ?            ? file
    
por 19.09.2015 / 08:40