Sie glen
sind der Eigentümer des Verzeichnisses (siehe .
Datei in Ihrer Auflistung). Ein Verzeichnis ist nur eine Liste von Dateien, und Sie haben die Berechtigung, diese Liste zu ändern (z. B. Dateien hinzufügen, Dateien entfernen, Eigentümer ändern, um sie wieder zu Ihren eigenen zu machen usw.). Möglicherweise können Sie den Inhalt der Datei nicht direkt ändern , aber Sie können die Datei als Ganzes lesen und die Verknüpfung aufheben (entfernen) und anschließend neue Dateien hinzufügen. 1 Wenn Sie nur das Vorher und Nachher sehen, sieht es möglicherweise so aus, als ob die Datei geändert wurde.
Vim verwendet Auslagerungsdateien und verschiebt Dateien unter Wasser. Dies erklärt, warum scheinbar in dieselbe Datei geschrieben wird wie in Ihrer Shell, dies ist jedoch nicht dasselbe. 2
Also, was Vim macht, ist folgendes:
cat temp > .temp.swp # copy file by contents into a new glen-owned file
echo nope >> .temp.swp # or other command to alter the new file
rm temp && mv .temp.swp temp # move temporary swap file back
1 Dies ist ein wichtiger Unterschied im Umgang mit Dateiberechtigungen zwischen Windows und Unices. In Windows kann man normalerweise keine Dateien entfernen, für die Sie keine Schreibberechtigung haben.
2 Update: Wie in den Kommentaren vermerkt, macht Vim das nicht so, um den Eigentümer zu ändern, da sich die Inode-Nummer in der temp
Datei nicht ändert ( ls -li
vorher und nachher). Mit können strace
wir genau sehen, was vim
tut. Der interessante Teil ist hier:
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp") = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14) = 14
close(4) = 0
chmod("temp", 0664) = 0
Dies zeigt, dass die Verknüpfung nur aufgehoben wird , der Dateideskriptor jedoch nicht geschlossen wirdtemp
. Es überschreibt vielmehr nur den gesamten Inhalt ( more text bla\n
in meinem Fall). Ich denke, das erklärt, warum sich die Inode-Nummer nicht ändert.
ls -il
davor und danach ausführen. Wenn sichtemp
die Inode-Nummer geändert hat, wissen Sie, dass es sich um eine andere Datei mit demselben Namen handelt.Vor:
-rw-r--r-- 1 root staff 0 19 Dec 12:38 temp
nach:
-rw-r--r-- 1 glen staff 7 19 Dec 12:38 temp
Das Ziel durchbricht nicht die Berechtigungsgrenze. Schauen Sie sich die Dateiinformationen genau an, und stellen Sie fest, dass vim die ursprüngliche Datei tatsächlich gelöscht hat (da Sie die Berechtigung haben, die Datei zu entfernen, obwohl Sie ihren Inhalt nicht ändern können). Erstellen Sie dann eine eigene neue Datei ( siehe der Besitzer ist nicht mehr "root").
Und während Sie die Originaldatei in vim bearbeiten, wird gewarnt, dass Sie eine schreibgeschützte Datei ändern. Wenn Sie also den Befehl eingeben
:wq!
(die Operation erzwingen), können Sie nur die vorhandene Datei löschen und eine neue Datei mit dem gleichen Namen erstellen.Ich hoffe, das hilft.
quelle
Verwenden Sie die
-i
Optionls
, um die Inode-Nummer anzuzeigen, bei der es sich um eine eindeutige Kennung (innerhalb des Dateisystems) einer Datei oder eines anderen Objekts handelt.Sie werden sehen, dass die Datei durch ein anderes Objekt ersetzt wurde: Die Inode-Nummer wird sich wahrscheinlich ändern.
Die Anzeige derselben Inode-Nummer ist kein Beweis für irgendetwas: Eine Inode-Nummer kann recycelt werden. Wenn wir den letzten Link zu einer Datei entfernen und dann eine neue Datei erstellen, erhalten wir möglicherweise eine mit derselben Inode-Nummer. Dies kann jedoch nicht passieren, wenn die alte Datei entfernt wird, nachdem die neue erstellt wurde. Eg
mv file file.tmp; touch file; rm file.tmp
. Ich vermute, dass vim tatsächlich etwas Ähnliches tutecho new_content > tmpfile; mv tmpfile file
. Diemv
Operation wird in einenrename
Systemaufruf übersetzt , sodass die Zuweisung von Inode-Nummern davon abhängt, wie das Dateisystem eine Umbenennung durchführt, die die Verknüpfung eines Ziels aufhebt.quelle