desenv-web-rp.com

Por que a rm tem permissão para excluir um arquivo pertencente a outro usuário?

Da postagem Por que a rm pode remover arquivos somente leitura? Entendo que rm só precisa de permissão de gravação no diretório para remover o arquivo. Mas acho difícil digerir o comportamento em que podemos excluir facilmente um arquivo que possui e agrupa diferentes.

Eu tentei o seguinte

mtk: meu nome de usuário
abc: criou um novo usuário

$ ls -l file
-rw-rw-r-- 1 mtk mtk       0 Aug 31 15:40 file
$ Sudo chown abc file
$ Sudo chgrp abc file
$ ls -l file
-rw-rw-r-- 1 abc abc       0 Aug 31 15:40 file
$ rm file
$ ls -l file
<deleted>

Eu estava pensando que isso não deveria ter sido permitido. Um usuário deve poder excluir apenas arquivos de sua propriedade? Alguém pode esclarecer por que isso é permitido? e qual é a maneira de evitar isso? Posso pensar que apenas restringir a permissão de gravação do diretório pai para desabilitar exclusões surpreendidas de arquivo.

53
mtk

A razão pela qual isso é permitido está relacionada ao que a remoção de um arquivo realmente faz. Conceitualmente, o trabalho de rm é remover uma entrada de nome de um diretório. O fato de o arquivo ficar inacessível se esse for o único nome do arquivo e que o inode e o espaço ocupado pelo arquivo puderem ser recuperados nesse ponto é quase incidental. O nome da chamada do sistema que o comando rm chama, que é unlink, é até sugestivo desse fato.

E, remover uma entrada de nome de um diretório é fundamentalmente uma operação nesse diretório, para que esse diretório seja o que você precisa ter permissão para escrever.


O cenário a seguir pode torná-lo mais confortável? Suponha que haja diretórios:

/home/me    # owned and writable only by me
/home/you   # owned and writable only by you

E há um arquivo que é de minha propriedade e que possui dois links físicos:

/home/me/myfile
/home/you/myfile

Não importa como esse link rígido /home/you/myfile cheguei lá em primeiro lugar. Talvez root coloque lá.

A idéia deste exemplo é que você deve remover o link físico /home/you/myfile. Afinal, está bagunçando o diretório se. Você deve poder controlar o que existe e o que não existe dentro de /home/you. E quando você remove /home/you/myfile, observe que você realmente não excluiu o arquivo. Você removeu apenas um link para ele.


Observe que, se o bit fixo estiver definido no diretório que contém um arquivo (aparece como t em ls), então você do precisa ser o proprietário do para poder excluí-lo (a menos que você seja o proprietário do diretório). O bit adesivo geralmente é definido em /tmp.

101
Celada

Para remover um arquivo, você só precisa escrever no diretório em que o arquivo está.

Se você não gosta disso, pode definir o bit "pegajoso" via chmod +t dir se você estiver em um sistema operacional meio recente (esse recurso foi introduzido por volta de 1986 no SunOS).

Se você deseja ser mais refinado, precisa de um sistema de arquivos com uma implementação ACL moderna como o ZFS. As ACLs NFSv4 padrão baseadas em NTFS incluem suporte para permissões de exclusão específicas de arquivo por usuário e uma permissão "delete_child" para diretórios.

9
schily

A lógica é semelhante à de uma casa: o proprietário ou inquilino decide quais convidados serão expulsos, independentemente de quem é o proprietário. Além disso, o convidado despejado que é bem-vindo em outra casa (tem outro link no diretório de outra pessoa) não congelará até a morte lá fora.

0
rackandboneman