Por que a rm pode remover arquivos somente leitura?

91

Se eu criar um arquivo e depois alterar suas permissões para 444(somente leitura), como rmremovê-lo?

Se eu fizer isso:

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

... rmperguntará se eu quero remover o arquivo protegido contra gravação test.txt. Eu esperava que rmnão fosse possível remover esse arquivo e que eu teria que fazer o chmod +w test.txtprimeiro. Se o fizer rm -f test.txt, rmremoverá o arquivo sem perguntar, mesmo que seja somente leitura.

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

Magnus
fonte
Esclarecimento: estou executando esses comandos como meu usuário comum, não como root.
Magnus

Respostas:

104

Todas as rmnecessidades são permissão de gravação + execução no diretório pai. As permissões do próprio arquivo são irrelevantes.

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

Qualquer tentativa de acessar os dados de um arquivo requer permissão de leitura. Qualquer tentativa de modificar os dados de um arquivo requer permissão de gravação. Qualquer tentativa de executar um arquivo (um programa ou um script) requer permissão de execução ...

Como os diretórios não são usados ​​da mesma maneira que os arquivos regulares, as permissões funcionam de maneira um pouco (mas apenas um pouco) diferente. Uma tentativa de listar os arquivos em um diretório requer permissão de leitura para o diretório, mas não nos arquivos. Uma tentativa de adicionar um arquivo a um diretório, excluir um arquivo de um diretório ou renomear um arquivo exige uma permissão de gravação para o diretório, mas (talvez surpreendentemente) não para os arquivos contidos nele. A permissão de execução não se aplica aos diretórios (um diretório também não pode ser um programa). Mas esse bit de permissão é reutilizado para diretórios para outros fins.

A permissão de execução é necessária em um diretório para poder entrar nele (ou seja, tornar algum diretório seu diretório de trabalho atual).

A execução é necessária em um diretório para acessar as informações de "inode" dos arquivos contidos. Você precisa disso para procurar um diretório para ler os inodes dos arquivos. Por esse motivo, a permissão de execução em um diretório geralmente é chamada de permissão de pesquisa.

ire_and_curses
fonte
2
Então, se eu quisesse criar um diretório em que alguns arquivos não pudessem ser excluídos / alterados sem primeiro o chmod, mas outros pudessem ser livremente graváveis, isso seria impossível? Eu precisaria chmod o diretório 555, o que significaria que nenhum arquivo no diretório poderia ser criado ou modificado.
Magnus
3
@ Magnus - Obviamente, não há nada que o impeça de criar um diretório filho gravável dentro do diretório somente leitura e armazenar seus arquivos graváveis ​​nele. O diretório filho em si não pode ser excluído, mas seu conteúdo pode.
Sep_
7
Você não pode deixar um diretório grudento +tpara que as pessoas não possam mais modificar ou remover arquivos desse diretório que não são de sua propriedade, mesmo que tenham acesso de gravação ao diretório?
Shadur 19/09/12
3
@ Magnus Se você possui acesso root (incluindo o sudo), pode chattradicionar para adicionar o sinalizador imutável aos arquivos. Caso contrário, ire_and_curses está correto.
James O'Gorman
6
Não usar rm -f só funciona enquanto eu estou sóbrio ... mais, eu não tenho nenhuma idéia do que os scripts bash retardadas eu escrevo pode ou não fazer
Magnus
53

Ok, de acordo com seu comentário para ire_and_curses, o que você realmente deseja fazer é tornar alguns arquivos imutáveis. Você pode fazer isso com o chattrcomando 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 - 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 com isso é lê-lo (se as permissões unix permitirem) e (como root) chattr -iremover o bit imutável.

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

cas
fonte
3
ocasionalmente é útil. Aliás, nem mesmo o root pode modificar ou excluir um arquivo imutável (não sem remover primeiro o atributo imutável). também entre, use lsattrpara listar atributos.
cas
2
+1 - Eu tinha esquecido os atributos e estava tão ocupado respondendo à pergunta literal sobre rmisso que isso nunca me ocorreu ...
ire_and_curses 19/09/12
2
Isso é específico do sistema de arquivos e pode trazer mais problemas que ele resolve.
Stéphane Gimenez
4
@ Magnus: os possíveis problemas incluem backup (nem todos os utilitários de backup fazem backup dos atributos - na verdade, a maioria não) e restauração (se você restaurar para um diretório que já contém um arquivo imutável, alguns programas tratam da incapacidade de sobrescrever esse arquivo como um erro fatal e abortar). Além disso, você pode se confundir se esquecer que tornou um arquivo imutável e não conseguir descobrir por que não pode excluí-lo .... a mensagem de erro 'Operação não permitida' é a mesma mensagem de erro que você vê em alguns tipos de sistema de arquivos corrupção, que pode levar a uma reação potencialmente perigosa.
cas
1
Você pode copiar (cp) um arquivo imutável.
Octopus
0

Uma resposta a esta pergunta afirma que você pode excluir um arquivo do diretório apenas se ele tiver writepermissão apenas totalmente errada! apenas tente! Permita a um diretório apenas writepermissão e tente excluir, você não pode!
Para excluir um arquivo dentro de um diretório, você precisa de ambos writee de executepermissão no diretório

Agora, de volta à pergunta: para excluir um arquivo usando, rmvocê está apenas removendo suas informações de inode do diretório, ou seja, você não shreddingé do disco. Se as informações do inode do arquivo não estiverem no diretório, você não poderá acessar (também porque não poderá vê-las, pois não está listada pelo diretório pai), ou seja, será excluída para você.
Assim, para excluir um arquivo de um diretório, tudo o que você tem permissão no diretório; permissões nesse arquivo são irrelevantes

Edward Torvalds
fonte