O exemplo a seguir mostra como criar um arquivo com apenas permissões de leitura. Como podemos ver, quando tento gravar neste arquivo usando o comando echo que recebo Permission denied
,.
Mas por que, no caso de usarmos vi, não conseguimos Permission denied
? Como pode ser visto aqui, podemos gravar no arquivo, mesmo que o arquivo seja somente leitura.
O que esta acontecendo aqui? Isso é um bug do vi?
[admin@madona-machine1 ~]$ touch test-file
[admin@madona-machine1 ~]$ ls -ltr
total 0
-rw-r--r-- 1 admin admin 0 Apr 13 07:32 test-file
[admin@madona-machine1 ~]$ chmod -w test-file
[admin@madona-machine1 ~]$ ls -ltr
total 0
-r--r--r-- 1 admin admin 0 Apr 13 07:32 test-file
[admin@madona-machine1 ~]$ echo try_to_write > test-file
-bash: test-file: Permission denied
[admin@madona-machine1 ~]$ vi test-file
I am good singer,
~
~
~
~
~
~
~
"test-file" 1L, 4C written
Respostas:
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
!
aow
comando. Se esta versão vigorosa do comando write for usada, o Vim excluirá o arquivo original (se estiver usando o Vim com abackup
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: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 stracestrace -o ../vi.trace vi t
: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:De
man chattr
:fonte
A maioria, se não todas as
vi
implementações impedi-lo para gravar o arquivo se você usar um regular comando Salvar como querZZ
,:w
,:wq
ou:x
, por exemplo, comvim
:Por outro lado, se você pedir
vi
para gravar o arquivo apesar de suas permissões, usando algo como:x!
ou:wq!
, o editor estará relaxando temporariamente as permissões para permitir que o arquivo seja gravado:Nesse caso, o número do inode permanece inalterado.
Finalmente, isso não é um bug, como se você não tivesse permissão para alterar as permissões do arquivo, não poderá modificá-lo completamente
vi
.fonte