AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 407917
Accepted
humanityANDpeace
humanityANDpeace
Asked: 2017-11-30 23:21:55 +0800 CST2017-11-30 23:21:55 +0800 CST 2017-11-30 23:21:55 +0800 CST

Os subdiretórios não vazios de outro usuário estão protegidos contra exclusão no meu diretório?

  • 772

Na seguinte situaçãols -alh

total 0
drwxrwx--- 1 user http  20 Nov 30 08:08 .
drwxrws--- 1 user http 310 Nov 30 08:07 ..
drwx------ 1 http http  10 Nov 30 08:08 empty-subdir
drwx------ 1 http http  12 Nov 30 08:08 non-empty-subdir

onde existem dois subdiretórios (não pertencentes a mim), que listo como:

sudo ls empty-subdir -alh
total 0
drwx------ 1 http http 10 Nov 30 08:08 .
drwxrwx--- 1 user http 20 Nov 30 08:08 ..

sudo ls non-empty-subdir -alh
total 0
drwx------ 1 http http 12 Nov 30 08:08 .
drwxrwx--- 1 user http 20 Nov 30 08:08 ..
drwx------ 1 http http  0 Nov 30 08:08 subdir

A diferença entre os dois subdiretórios é que o não vazio non-empty-subdircontém uma pasta.

Minha pergunta é se é por design que tento rm -rfremover os subdiretórios que obtenho resultados:

$ rm empty-subdir -rf
$ rm non-empty-subdir -rf
rm: cannot remove 'non-empty-subdir': Permission denied
$ ls -alh
total 0
drwxrwx---+ 1 user http  10 Nov 30 08:14 .
drwxrws---+ 1 user http 310 Nov 30 08:07 ..
drwx------+ 1 http http  12 Nov 30 08:08 non-empty-subdir

Parece que o usuário com permissões de gravação em um diretório pode remover uma entrada de um arquivo ou um subdiretório vazio de algum outro usuário, mas não um subdiretório não vazio .

Uma resposta ideal para essa pergunta forneceria informações como:

  • uma confirmação de que o comportamento descrito é reproduzível em outras máquinas (e não meras peculiaridades da minha caixa estragada)
  • uma justificativa para explicar esse comportamento (por exemplo, existem casos de uso?)
  • uma visão geral se houver diferenças entre os sistemas (BSD, Linux....)

Atualização : Com relação ao comentário de Ipor Sircer, testei novamente o cenário, sem nenhum recurso de ACL e é o mesmo. Portanto, modifiquei a pergunta para remover os +es das listagens para não dar origem a uma ideia de que o comportamento pode estar relacionado a ACLs.

permissions rm
  • 3 3 respostas
  • 638 Views

3 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2017-12-01T01:29:56+08:002017-12-01T01:29:56+08:00

    Só é possível remover um diretório (com a rmdir()chamada do sistema) se estiver vazio.

    rm -r dirremove o diretório e todos os arquivos contidos nele, começando pelas folhas da árvore de diretórios e subindo até a raiz ( dir).

    Para remover um arquivo (com rmdir()para diretórios e unlink()para outros tipos de arquivos, ou *at()variantes), o que importa não é a permissão do arquivo em si, mas as do diretório do qual você está removendo o arquivo (cuidado com o tbit nas permissões, como para /tmp, acrescenta mais complicações a isso).

    Antes de tudo, você não está realmente removendo o arquivo , você está desvinculando-o de um diretório (e quando for o último link que você está removendo, o arquivo acaba sendo deletado por consequência), ou seja, você está modificando o diretório, então você precisa modificar (escrever) permissões para esse diretório.

    O motivo pelo qual você não pode remover non-empty-diré que não pode desvincular subdirprimeiro, pois não tem o direito de modificar non-empty-dir. Você teria o direito de desvincular non-empty-dirde seu diretório pessoal, pois tem permissão de gravação/modificação para aquele, apenas você não pode remover um diretório que não esteja vazio.

    No seu caso, conforme observado por @PeterCordes nos comentários, a rmdir()chamada do sistema falha com um ENOTEMPTYcódigo de erro (Diretório não vazio), mas como você não tem permissão de leitura para o diretório, rmnão consegue nem descobrir quais arquivos e diretórios (incluindo subdir) ele precisaria se desvincular dele para poder esvaziá-lo (não que pudesse desvinculá-los se soubesse, pois não tem permissões de gravação).

    Você também pode entrar em situações em que rm poderia remover um diretório se pudesse descobrir quais arquivos estão nele, como no caso de um diretório somente para gravação:

    $ mkdir dir
    $ touch dir/file
    $ chmod a=,u=wx dir
    $ ls -ld dir
    d-wx------ 2 me me 4096 Nov 30 19:43 dir/
    $ rm -rf dir
    rm: cannot remove 'dir': Permission denied
    

    Ainda assim, posso removê-lo, pois sei que ele contém apenas um filearquivo:

    $ rm dir/file
    $ rmdir dir
    $
    

    Observe também que com Unices modernos você pode renomear isso non-empty-dir, mas em alguns como Linux ou FreeBSD (mas não Solaris), não movê-lo para um diretório diferente, mesmo se você também tivesse permissão de gravação para esse diretório, como (eu acho que e para Linux , conforme sugerido pelo comentário para o código relevante ) isso envolveria modificação non-empty-dir(a ..entrada nele apontaria para um diretório diferente).

    Pode-se argumentar que remover your empty-dirtambém envolve remover as entradas ..e .nele, portanto, modificá-lo, mas ainda assim, o sistema permite que você faça isso.

    • 14
  2. dirkt
    2017-11-30T23:45:43+08:002017-11-30T23:45:43+08:00

    Ignorando a possível alteração por meio das ACLs, posso confirmar esse comportamento para meu sistema (sem ACLs).

    O comportamento observado é a consequência lógica de dois princípios:

    1) Os direitos de um diretório determinam quem pode alterar o diretório, ou seja, excluir entradas no diretório. Os direitos das entradas nesse diretório não desempenham nenhum papel nisso.

    2) A remoção de um arquivo requer potencialmente a remoção e limpeza das informações associadas, ou seja, inodes, listas de alocação de blocos etc. tornar-se inacessível, mas as informações associadas não teriam sido limpas.

    Portanto, você pode remover empty-subdir, porque tem o direito de gravar no diretório em que ele está. Você não pode remover non-empty-subdir, porque não tem o direito de limpar primeiro os arquivos contidos neste subdiretório.

    Não há realmente nenhuma razão ou caso de uso para isso. Alguém poderia ter construído uma limpeza recursiva de um subdiretório no kernel, mas o Unix original manteve tudo simples, e a limpeza recursiva teria sido muito complicada quando pode ser realizada com um utilitário de espaço de usuário.

    Não posso fornecer uma visão geral abrangente entre os diferentes tipos, mas esse era o comportamento no Unix original e esperaria que fosse o mesmo em todos os tipos de Unix, e ficaria surpreso se houvesse um tipo de Unix que se comportou de maneira diferente.

    • 5
  3. Sergiy Kolodyazhnyy
    2017-12-01T01:10:45+08:002017-12-01T01:10:45+08:00

    Tentei reproduzir o que você descreve e executei strace rm -rf ./nonempty. O que isso revela é o seguinte:

    unlinkat(4, "subdir", AT_REMOVEDIR)     = -1 EACCES (Permission denied)
    

    e de acordo com o unlinkatmanual (que no Linux é o mesmo unlink(2), grifo meu):

    EACCES O acesso de gravação ao diretório que contém o nome do caminho não é permitido para o UID efetivo do processo ou um dos diretórios no nome do caminho não permite a permissão de pesquisa . (Consulte também path_resolution(7).)

    Como o diretório pai, nonempty, não concede userpermissão x (pesquisa), faz sentido com base na EACCESdescrição que subdirnão pode ser removida.

    • 3

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve