Eu tenho uma pasta com -wx
permissões chamadas folder1
e outra pasta dentro dela chamada folder2
com rwx
permissões.
Eu tentei excluir folder1
usando este comando:
rm -r folder1
Mas eu recebi o seguinte erro:
rm: cannot remove 'folder1': Permission denied
A razão pela qual acho que recebi esse erro é porque o rm
programa precisa primeiro obter o conteúdo de folder1
(obter os nomes dos arquivos e pastas dentro dele folder1
) para poder excluí-lo (porque você não pode excluir um arquivo ou pasta sem saber o nome que eu acho) e o rm
programa pode se excluir folder1
.
Mas como folder1
não tem read
permissão, o rm
programa não pode obter seu conteúdo e, portanto, não pode excluí-lo, e como não pode excluir seu conteúdo, não pode excluí-lo.
Estou correcto?
linux
permissions
rm
John
fonte
fonte
Respostas:
Acho que sua análise está correta: você não pode excluir o diretório, pois não está vazio, e não pode esvaziá-lo, pois não pode ver seu conteúdo.
Eu apenas tentei:
Quando escrevi "você", quis dizer qualquer programa que você possa executar. Seu
rm -r
comando primeiro vê quefolder1
é um diretório e, portanto, tenta descobrir seu conteúdo para esvaziá-lo, mas falha por perder a permissão de leitura, depois tenta excluí-lo, mas falha porque não está vazio. A "permissão negada" é enganosa; Eu acho que "Diretório não vazio" (comormdir
relatórios) seria mais apropriado.)fonte
Directory not empty
neste caso, pois não saberia que estava vazio ou não. Você ainda receberia o mesmo erro ao tentar excluir um diretório vazio no qual você não tem permissão de leitura. (Além disso, desconsidere meu comentário anterior, eu não estava usando o meu pensamento).rmdir
é capaz de relatar “Diretório não vazio”. E se você ler meu teste, verá que ele aceita remover ofolder1
diretório, sem permissão de leitura , depois de esvaziá-lo.Permission denied
quando estou tentandorm -r folder1
quando está vazio. Estou no OpenBSD, não no Linux.-r
for usado, cada entrada de diretório (exceto.
e..
) deve ser removida como se fosse um operando de arquivorm -r
. Parece que o GNUrm
simplesmente faz umrmdir()
no diretório se não for legível, porque não terá como obter o conteúdo dele.Para que a exclusão ocorra, o sistema deve ser capaz de ler o conteúdo e identificar o que deve ser excluído.
Eu tentei simular o que você está tentando:
Se tentarmos excluir sem permissões de leitura, ele falhará:
Em um rastreio para as duas tentativas, a diferença é que o conteúdo do diretório não pode ser lido (getdents):
Com permissões de leitura:
Para concluir, mesmo que você possua um diretório e ele possua o bit executável, você ainda precisará de permissões de leitura para poder ver seu conteúdo e excluir a pasta. Não é o mesmo para um arquivo.
fonte
Bem, eu não tenho reputação suficiente para comentar a resposta de ttaran7, então parece que deve ser uma resposta. Meu voto positivo também não é visível ao público, devido à baixa reputação. Eu votei nessa resposta por realmente incluir um rastreamento de chamada do sistema, em vez de apenas especulação.
Para responder à pergunta do OP: Sim, seu raciocínio estava correto: você é bloqueado pela falha ao ler o diretório
Corri um rastreio semelhante ao que eles (ttaran7) haviam feito porque suspeitava do mesmo raciocínio: a
rm
chamada falharia ao não ler o diretório e isso seria o fim disso, sem chance de reclamar sobre o diretório estar vazio. Ao examinar novamente o rastreamento que fiz, notei que foi feita uma chamada do sistema para tentar desvincular o nome do arquivo fornecido de qualquer maneira:Veja a quarta linha:
unlinkat
... que falha porque o diretório NÃO está vazio. Agora é isso que eu consideraria um comportamento inesperado, o fato de ele tentar excluir o diretório, apesar de não ter permissões de leitura.fonte