Hinweis : Aus Gründen der älteren Lizenzierung enthalten die meisten GNU / Linux-Distributionen nicht das ursprüngliche vi-Programm, wie es von Bill Joy geschrieben wurde. Stattdessen wird der Befehl vi bereitgestellt, indem Vim im Vi-Kompatibilitätsmodus ausgeführt wird. Die folgende Antwort basiert auf dem Ausführen von Vim mit seinem Vi-Kompatibilitätsmodus.
Ändern einer schreibgeschützten Datei
Vim warnt den Benutzer, wenn er den Puffer einer schreibgeschützten Datei ändert W10: Warning: Changing a readonly file
. Wenn der Benutzer versucht , auf diese Datei zu schreiben, erhalten sie die folgende Fehlermeldung, 'readonly' option is set (add ! to override)
.
Wenn das übergeordnete Verzeichnis vom Vim-Benutzer beschrieben werden kann
Da Vim hilfreich ist, weist er den Benutzer darauf hin, dass er mit Nachdruck auf dem Schreiben bestehen kann, indem er ein Ausrufezeichen anfügt. !
an den w
Befehl angehängt wird. Wenn diese erzwungene Version des Schreibbefehls verwendet wird, löscht Vim die Originaldatei (wenn Vim mit der backup
Option Nur Vim verwendet wird , wird die Originaldatei tatsächlich so umbenannt , dass sie mit der Sicherungsdatei identisch ist). Anschließend wird eine neue Datei mit demselben Namen wie das Original geöffnet (erstellt) und der Inhalt des Puffers in diese neue Datei geschrieben. Dies kann beobachtet werden, indem der Inode der Datei vor und nach dem Ausführen von Vim überprüft wird :
$ 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
Hinweis: Dies kann auch die Berechtigung und den Besitz der Datei ändern und (symbolische) Links unterbrechen. Wenn z. B. die ursprüngliche Datei einem anderen Benutzer gehört, gehört die neue Datei dem Benutzer, der Vim ausführt.
Ein Prozess kann dies nur tun, wenn er über Schreibrechte für das übergeordnete Verzeichnis der Datei verfügt. Um sicherzustellen, dass ein Programm eine Datei nicht ändern kann, sollten im Allgemeinen die Berechtigungen sowohl für die Datei selbst als auch für das übergeordnete Verzeichnis gesichert werden.
Wenn das übergeordnete Verzeichnis vom Vim-Benutzer nicht beschreibbar ist
Selbst in diesem Fall versucht Vim dem Benutzer zu helfen, die Datei zu überschreiben. Wenn der Vim-Benutzer Eigentümer der Datei ist, kann Vim die Einschränkung des schreibgeschützten übergeordneten Verzeichnisses umgehen, indem er vorübergehend die Berechtigung der Datei ändert (mithilfe des chmod
Systemaufrufs), den Puffer in die Datei schreibt, die Datei schließt und dann die Datei ändert Berechtigungen zurück. Hier ist ein Auszug der Systemaufrufe, die ausgeführt werden, während vi durch strace läuft 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
Hinweis: Dies ist nicht der Fall, wenn der Vim-Benutzer eine Datei bearbeitet, deren Eigentümer er nicht ist, da Vim die Dateiberechtigungen nicht ändern kann.
Nachtrag
Um wirklich sicher zu sein, dass eine Datei nicht geändert werden kann (auf einem GNU / Linux-System), führen Sie die aus chattr
Befehl als Superuser aus:
sudo chattr +i filename
Von man chattr
:
Eine Datei mit dem Attribut 'i' kann nicht geändert werden: Sie kann nicht gelöscht oder umbenannt werden, es kann kein Link zu dieser Datei erstellt werden und es können keine Daten in die Datei geschrieben werden. Nur der Superuser oder ein Prozess mit der Funktion CAP_LINUX_IMMUTABLE kann dieses Attribut festlegen oder löschen.