Como remover um diretório não vazio que não pertence ao usuário no Linux?

9

Se um diretório "foo" pertencer ao usuário A e contiver um diretório "bar", que é de propriedade root, o usuário A pode simplesmente removê-lo com rmdir , o que é lógico, porque "foo" é gravável por usuário A.

Mas se o diretório "bar" contiver outro arquivo de propriedade da raiz, o diretório não poderá ser removido, porque os arquivos nele devem ser removidos primeiro, para que ele fique vazio. Mas "bar" em si não é gravável, por isso não é possível remover arquivos.

Existe uma maneira de contornar isso? Ou me convença do contrário porque é necessário.

    
por Alex B 11.06.2010 / 09:29

2 respostas

7

Interpretação 1: um diretório é um subespaço do sistema de arquivos. Ele pode ser subdividido em subsubspaces criando subdiretórios nele. O proprietário do diretório foo deve ter controle sobre tudo dentro do subespaço: foo/bar , foo/bar/qux , etc.

Interpretação 2: um diretório é um subespaço do sistema de arquivos. Todo diretório é anexado a algum outro diretório, chamado seu pai. O proprietário do diretório foo tem controle sobre tudo dentro do subespaço; no entanto, para um subdiretório foo/bar , o proprietário de foo tem controle sobre se bar pode ser anexado a foo , mas não sobre o que entra em bar : somente o proprietário bar tem controle sobre .

Evidências em favor da interpretação 2: como você observou, o modo como as permissões funcionam. Além disso, o fato de alguns sistemas de arquivos Unix permitirem que um diretório seja anexado a mais de um pai: isso é chamado de ter vários hard links. (Ter vários hard links é comum para arquivos regulares, mas geralmente é desencorajado ou proibido para diretórios principalmente por causa do risco de criar loops, onde um diretório é seu próprio avô N vezes removido - então você não pode obtê-lo a partir da raiz diretório, que é uma expectativa muito comum.Existe também o problema de o que fazer se um diretório tiver 0 hard links, mas não estiver vazio: como o diretório não está ligado, você deseja excluí-lo, mas o que você faz com seu diretório? conteúdo?)

Evidência em favor da interpretação 1: na prática, os diretórios têm um único pai e, assim, formam uma estrutura em árvore. E você não pode acessar foo/bar/qux a menos que tenha permissão de execução em foo , bem como bar (bem, exceto que há maneiras obscuras de ter acesso a bar sem ter acesso a foo ). Então os níveis superiores são importantes.

Em uma nota mais prática, na sua situação, o usuário A pode fazer

mkdir garbage
mv foo/bar garbage/
rmdir foo
    
por 14.07.2010 / 00:34
0

A única maneira de contornar isso seria usar um setgid ou setuid no diretório pai ou usar uma ACL.

Defina o diretório setgid com

chmod g+s foo

Defina uma ACL padrão com

setfacl -d -R -m g:group:rwx foo

Isso define como a ACL padrão nesse caminho. Você deve montar o sistema de arquivos que contém este caminho com a opção acl!

Agora me diga por que você acha que quer isso.

    
por 11.06.2010 / 10:08