Ich öffne oft eine Datei in vim, nehme einige Änderungen vor und wenn es Zeit ist, die Datei zu speichern, ist sie schreibgeschützt .. (im Besitz eines anderen Benutzers). Ich suche nach Tipps, wie ich die Datei als Root erneut öffnen und meine Änderungen beibehalten kann, ohne sie zunächst in einer temporären Datei zu speichern, um sie zu kopieren oder als Root erneut zu bearbeiten.
28
Bitte stimmen Sie mich dafür nicht ab. Ich empfehle nicht, diese Antwort zu implementieren, aber es ist die Antwort, nach der der rkthkr fragt.
Der Weg dies zu tun ist mit
:!sudo vim %
Wie ich zu ipozgaj erwähnte, wird ein% als Argument (sogar ein Unterargument) durch den Pfad zum aktuellen Puffer ersetzt. (Möglicherweise werden Sie zur Eingabe Ihres Kennworts aufgefordert.) Sie erhalten einen neuen vim-Prozess, dessen Eigentümer root ist und der ein untergeordneter Prozess des ursprünglichen vim-Prozesses ist. Klingt doof, oder? So sieht es in ps aus:
Wenn Sie über Schreibberechtigungen für das Verzeichnis verfügen, in dem sich die Datei befindet, und Sie Änderungen daran vorgenommen haben, werden Sie möglicherweise gewarnt, dass eine Auslagerungsdatei beendet wird. Wenn Sie sich für [R] ecover entscheiden, werden die meisten * Änderungen berücksichtigt, die vom übergeordneten vim-Prozess vorgenommen wurden. (* Ich denke, dass das Swap-Update zeitlich festgelegt ist oder einen Delta-Schwellenwert hat. Ich habe bereits zu viel Zeit darauf verwendet und bin nicht darum bemüht, dies zu untersuchen.) Wenn Sie vim beenden, seien Sie nicht beunruhigt, wenn Sie es sind noch in vim ... du hast einen 2. vim-prozess eröffnet. Merken?
Nun, wenn das alles gesagt ist ... würde ich das so gut wie nie tun. Vielleicht, wenn ich nicht genug oder viel zu viel Kaffee getrunken habe und festgestellt habe, dass ich als Root mehrere weitere Dateien bearbeiten muss ... könnte ich das versuchen. In 14 Jahren, in denen ich Systeme verwaltet habe, habe ich das nie getan. Aber bis Sie mit meiner bevorzugten Lösung (die genau so ist, wie sie von dbr angeboten wird) unzufrieden waren, hatte ich noch nie darüber nachgedacht.
quelle
:w !sudo tee %
daher denke ich, dass dies eine gute Antwort ist.Normalerweise speichere ich es dann in einer temporären Datei in $ HOME / tmp / apache.conf (zum Beispiel)
Dies ist einige zusätzliche Arbeit, um die Änderungen zusammenzuführen, aber es hat sich gelohnt. Ich finde es ein guter Weg zwischen Komfort und Messungen gegen ungewollte Änderungen
Vorher habe ich über ACLs nachgedacht oder den Dateien entsprechende Gruppen zugewiesen, aber es hat nicht allzu oft geklappt. Entweder habe ich vergessen, die Eigentümer zu ändern, oder ich habe Dateien geändert, wo ich das nicht wollte.
Das gilt nur für Dateien, die bisher nicht verwaltet wurden. Die Gesamtlösung, die wir verwenden, ist Puppet mit einem Git-Repo, bei dem die Benutzer Dateien lokal bearbeiten und die Änderungen auf geeigneten Servern testen. Wenn die Konfiguration wie gewünscht funktioniert, werden die Änderungen in das zentrale Repository zurückgeschrieben, wo unsere Konfigurations-Engine in regelmäßigen Abständen Änderungen abruft.
quelle
Normalerweise mache ich - nicht unbedingt die schnellste, aber auf jeden Fall die sicherste - Folgendes (am Beispiel von nsswitch.conf):
Verlasse vim und mache:
Dies löscht alle Zeilen und liest Ihre geänderte und aktualisierte Version ein, um sie an ihrer Stelle zu bearbeiten. Wenn Sie Ihr Home-Verzeichnis verwenden, müssen Sie nicht darüber nachdenken, ob Sie Zugriff haben oder nicht - und es ist privater als / tmp. Beachten Sie, dass dies eine vollständige Ersetzung von Dateien ist: Wenn Sie nicht alle Änderungen hinzufügen möchten, müssen Sie auswählen.
Trotz der Kopfschmerzen, die mit diesen Antworten verbunden sind, gibt es keinen Grund, Ihre Änderungen zu verlieren.
quelle