Stavo usando Vim l'altro giorno come al solito, quando ho notato qualcosa di strano. Ecco cosa ho fatto:
~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile
Quindi ho apportato una modifica, ho salvato e ho chiuso :wq
. Abbastanza normale Quindi, tuttavia:
~$ 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
Quindi root dovrebbe avere accesso r / w e tutti gli altri dovrebbero solo leggere. Modifica il file, prova a salvare - non puoi. Fantastico, funziona come previsto. Tuttavia, se si salva con :w!
, vim in qualche modo modifica la proprietà del file in nome utente: gruppo utenti e il file viene salvato. Anche se lo fai:
~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile
Puoi ancora sovrascrivere con :w!
! Che cosa sta succedendo? Come può vim infrangere le leggi sulla proprietà e l'autorizzazione dei file in questo modo? Ho guardato la pagina di aiuto in vim dicendo :help :w
e ho trovato questo:
: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.
Non sono stato in grado di scrivere su un file in VIM in precedenza quando non avrei dovuto, quindi immagino che il vero cuore della mia domanda sia, come posso rendere un file non modificabile da VIM e perché non è basato su file autorizzazioni di sistema, come mi aspetterei, e quale meccanismo utilizza Vim per modificare il file che altri editor (gedit, nano) non possono usare?
EDIT: Il computer su cui ho provato questo sta usando il kernel Linux 3.15.5-2-ARCH. Il numero di versione di Vim è 7.4.373-1, ed è quello installato da pacman
- Non l'ho compilato da zero con nessuna opzione speciale.
CAP_CHOWN
è necessario chiamare chown(2)
. A proposito, posso riprodurre su Debian, con vim 7.4.