Por que o rm remove arquivos somente para leitura?

86

Se eu criar um arquivo e depois alterar suas permissões para 444 (somente leitura), por que rm pode removê-lo?

Se eu fizer isso:

echo test > test.txt
chmod 444 test.txt
rm test.txt

... rm perguntará se desejo remover o arquivo protegido contra gravação test.txt . Eu teria esperado que rm não possa remover esse arquivo e que eu teria que fazer um chmod +w test.txt primeiro. Se eu fizer rm -f test.txt , então rm removerá o arquivo sem perguntar, mesmo que seja somente leitura.

Alguém pode esclarecer? Estou usando o Ubuntu 12.04 / bash.

    
por Magnus 19.09.2012 / 10:39

3 respostas

97

Todas as rm needs são write + permissão de execução no diretório pai. As permissões do arquivo em si são irrelevantes.

Aqui está uma referência que explica o modelo de permissões mais claramente do que eu poderia:

Any attempt to access a file's data requires read permission. Any attempt to modify a file's data requires write permission. Any attempt to execute a file (a program or a script) requires execute permission...

Because directories are not used in the same way as regular files, the permissions work slightly (but only slightly) differently. An attempt to list the files in a directory requires read permission for the directory, but not on the files within. An attempt to add a file to a directory, delete a file from a directory, or to rename a file, all require write permission for the directory, but (perhaps surprisingly) not for the files within. Execute permission doesn't apply to directories (a directory can't also be a program). But that permission bit is reused for directories for other purposes.

Execute permission is needed on a directory to be able to cd into it (that is, to make some directory your current working directory).

Execute is needed on a directory to access the "inode" information of the files within. You need this to search a directory to read the inodes of the files within. For this reason the execute permission on a directory is often called search permission instead.

    
por 19.09.2012 / 10:45
50

Ok, de acordo com seu comentário para ire_and_curses, o que você realmente quer fazer é tornar alguns arquivos imutáveis. Você pode fazer isso com o comando chattr . Por exemplo:

por exemplo,

$ cd /tmp
$ touch immutable-file
$ sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file 'immutable-file'? y
rm: cannot remove 'immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move 'immutable-file' to 'someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

Você não pode fazer nada em um arquivo imutável - você não pode excluí-lo, editá-lo, substituí-lo, renomeá-lo, chmod ou chown, ou qualquer outra coisa. A única coisa que você pode fazer é ler (se as permissões unix permitirem) e (como root) chattr -i remover o bit imutável.

Nem todos os sistemas de arquivos suportam todos os atributos. O AFAIK, imutável, é suportado por todos os sistemas de arquivos linux comuns (incluindo ext2 / 3/4 e xfs. O zfsonlinux não suporta atributos no momento)

    
por 19.09.2012 / 11:03
0

Uma resposta a esta pergunta afirma que você pode excluir um arquivo do diretório somente se ele tiver apenas write permissão está totalmente errada! apenas tente! Dê um diretório apenas write permission e tente excluir, você não pode!
Para excluir um arquivo dentro de um diretório, você precisa das permissões write e execute no diretório

Agora, voltemos à pergunta: para excluir um arquivo usando rm , você está apenas removendo suas informações de inode do diretório, ou seja, você não está shredding it do disco. Se inode informações de arquivo não está no diretório que você não pode acessar (também porque você não pode vê-lo, uma vez que não é listado por seu diretório pai), ou seja, ele é excluído para você. Assim, para excluir um arquivo de um diretório, tudo o que você é permissão no diretório; permissões nesse arquivo são irrelevantes

    
por 18.09.2015 / 12:51