Ich habe neulich wie immer Vim benutzt, als ich etwas Seltsames bemerkte. Folgendes habe ich getan:
~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile
Dann nahm ich eine Änderung vor und speicherte und beendete mit :wq
. Ziemlich normal. Dann jedoch:
~$ 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
Root sollte also R / W-Zugriff haben und alle anderen sollten nur gelesen haben. Bearbeiten Sie die Datei, versuchen Sie zu speichern - Sie können nicht. Genial, wie vorgesehen zu arbeiten. Wenn Sie jedoch mit speichern :w!
, ändert vim den Dateieigentum irgendwie wieder in Benutzername: Benutzergruppe und die Datei wird gespeichert. Auch wenn Sie dies tun:
~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile
Sie können immer noch mit überschreiben :w!
! Was ist los? Wie kann vim die Gesetze des Dateieigentums und der Erlaubnis wie diese brechen? Ich habe mir die Hilfeseite in vim angesehen :help :w
und Folgendes gefunden:
: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.
Ich konnte vorher nicht in eine Datei in vim schreiben, wenn ich es nicht sollte. Ich denke, das eigentliche Herz meiner Frage ist, wie ich eine Datei von vim nicht editierbar machen kann und warum sie nicht auf einer Datei basiert Systemberechtigungen, wie ich es erwarten würde, und welchen Mechanismus verwendet vim, um die Datei zu bearbeiten, die andere Editoren (gedit, nano) nicht verwenden können?
BEARBEITEN: Der Computer, auf dem ich dies ausprobiert habe, verwendet den Linux-Kernel 3.15.5-2-ARCH. Die Versionsnummer von Vim lautet 7.4.373-1 und ist die von pacman
- Ich habe sie nicht mit speziellen Optionen von Grund auf neu kompiliert.
CAP_CHOWN
ist erforderlich, um anzurufen chown(2)
. Übrigens kann ich mit vim 7.4 auf Debian reproduzieren.