Eu estava usando o Vim outro dia, como de costume, quando notei algo estranho. Aqui está o que eu fiz:
~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile
Então fiz uma alteração, salvei e saí com :wq
. Bastante normal. Então, no entanto:
~$ sudo chown root:root testfile
~$ sudo chmod 644 testfile
~$ sudo -k
~$ ls -l | grep testfile
-rw-r--r-- root root 0 Jul 23 10:02 testfile
~$ vim testfile
Portanto, o root deve ter acesso r / w e todo mundo deve ter lido apenas. Edite o arquivo, tente salvar - você não pode. Incrível, funcionando como pretendido. No entanto, se você salvar com :w!
, o vim alterará de alguma forma a propriedade do arquivo de volta para nome de usuário: usergroup e o arquivo será salvo. Mesmo se você fizer isso:
~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile
Você ainda pode substituir com :w!
! O que está acontecendo? Como o vim pode violar as leis de propriedade e permissão de arquivos assim? Olhei para a página de ajuda no vim dizendo :help :w
e encontrei o seguinte:
:w[rite]! [++opt] Like ":write", but forcefully write when 'readonly' is set or there is another reason why writing was refused.
Note: This may change the permission and ownership of the file and break (symbolic) links. Add the 'W' flage to 'cpoptions' to avoid this.
Eu não consegui gravar em um arquivo no vim anteriormente quando não deveria, então acho que o verdadeiro cerne da minha pergunta é: como posso tornar um arquivo não-editável pelo vim e por que não é baseado em arquivo permissões de sistema, como eu esperaria, e qual mecanismo o vim está usando para editar o arquivo que outros editores (gedit, nano) não podem usar?
EDIT: O computador em que tentei usar o kernel do Linux 3.15.5-2-ARCH. O número da versão do Vim é 7.4.373-1 e é o instalado por pacman
- eu não o compilei do zero com nenhuma opção especial.
CAP_CHOWN
é necessário ligar chown(2)
. A propósito, eu posso reproduzir no Debian, com o vim 7.4.