Nota : Devido a razões de licenciamento herdadas, a maioria das distribuições GNU / Linux não inclui o programa vi original, conforme escrito por Bill Joy. Em vez disso, o comando vi é fornecido executando o Vim no modo de compatibilidade com vi. A resposta a seguir é baseada na execução do Vim com seu modo de compatibilidade com o vi.
Modificando um arquivo somente leitura
O Vim avisa o usuário se ele modificar o buffer de um arquivo somente leitura W10: Warning: Changing a readonly file
,. Se o usuário tenta escrever para esse arquivo, eles recebem a seguinte mensagem de erro, 'readonly' option is set (add ! to override)
.
Quando o diretório pai é gravável pelo usuário do Vim
O Vim, sendo útil, permite que o usuário saiba que ele pode insistir forçosamente na gravação anexando um ponto de exclamação !
ao w
comando. Se esta versão vigorosa do comando write for usada, o Vim excluirá o arquivo original (se estiver usando o Vim com a backup
opção somente Vim configurada, o arquivo original será renomeado para ser o mesmo que o arquivo de backup). Em seguida, ele abre (cria) um novo arquivo com o mesmo nome que o original e grava o conteúdo de seu buffer nesse novo arquivo. Isso pode ser observado verificando o inode do arquivo antes e depois da execução do Vim:
$ ls -l --inode t
131529 -r--r--r-- 1 anthony anthony 0 Apr 13 09:23 t
$ vi t
$ ls -l --inode t
131649 -r--r--r-- 1 anthony anthony 4 Apr 13 09:23 t
Nota: Isso também pode alterar a permissão e a propriedade do arquivo e quebrar os links (simbólicos), por exemplo, se o arquivo original pertencer a outro usuário, o novo arquivo pertencerá ao usuário que executa o Vim.
Um processo só pode fazer isso se tiver permissão de gravação para o diretório pai do arquivo. Em geral, para garantir que um programa não possa modificar um arquivo, as permissões do próprio arquivo e de seu diretório pai devem ser protegidas.
Quando o diretório pai não é gravável pelo usuário do Vim
No entanto, mesmo nesse caso, o Vim ainda faz o possível para ajudar o usuário insistente a sobrescrever o arquivo. Se o usuário do Vim tiver a propriedade do arquivo, o Vim poderá contornar a restrição de diretório pai somente leitura alterando temporariamente a permissão do arquivo (usando a chmod
chamada do sistema), gravando o buffer no arquivo, fechando o arquivo e, em seguida, alterando o permissões de volta. Aqui está um extrato das chamadas do sistema feitas durante a execução do vi através do strace strace -o ../vi.trace vi t
:
getuid() = 501
chmod("t", 0100644) = 0
open("t", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "I am good singer,\n", 18) = 18
fsync(4) = 0
close(4) = 0
chmod("t", 0100444) = 0
Nota: Isso não acontece se o usuário do Vim estiver editando um arquivo do qual não possui propriedade, pois o Vim não poderá alterar as permissões do arquivo.
Termo aditivo
Para ter certeza de que um arquivo não pode ser modificado (em um sistema GNU / Linux), execute o chattr
comando como superusuário:
sudo chattr +i filename
De man chattr
:
Um arquivo com o atributo 'i' não pode ser modificado: não pode ser excluído ou renomeado, nenhum link pode ser criado para esse arquivo e nenhum dado pode ser gravado no arquivo. Somente o superusuário ou um processo que possui o recurso CAP_LINUX_IMMUTABLE pode definir ou limpar esse atributo.