vim als root neu editieren


28

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.

Antworten:


42

Aus dieser Stapelüberlaufantwort von skinp

:w !sudo tee %

Ich vergesse oft, vor dem Bearbeiten einer Datei, für die ich keine Schreibrechte habe, das Sudo zu verwenden. Wenn ich zum Speichern dieser Datei komme und einen Berechtigungsfehler erhalte, gebe ich einfach den Befehl vim aus, um die Datei zu speichern, ohne sie in einer temporären Datei speichern und dann erneut kopieren zu müssen.


Das ist fast alles. Aber es wäre schön, wenn vim neu gestartet und als root ausgeführt würde. Dies ist mein bisheriger Favorit :)
rkthkr

@rkthkr, wenn "vim neu gestartet und als root ausgeführt wird", können Sie die vorgenommenen Änderungen nicht speichern und verlieren Ihren Rückgängig-Verlauf. Aber wenn es das ist, was du willst ... [Es sind keine Zeichen mehr.] Siehe die "Antwort", die ich gleich schreiben werde.
Bruno Bronosky

2
@dbr, ich denke, es ist erwähnenswert, dass nach dem Überschreiben der Datei (mit tee als sudo) Sie mit [O] k oder [L] oad aufgefordert werden. Die spätere Option löscht Ihren Rückgängig-Verlauf und setzt das "Geänderte Flag" zurück, so dass Sie das Dialogfeld verlassen können, ohne zum Speichern von Änderungen aufgefordert zu werden. Die erstere Option, die ich bevorzuge, bewahrt Ihren Rückgängig-Verlauf, führt aber dazu, dass Sie gewarnt werden, wenn Sie versuchen, den Vorgang zu beenden. Sie müssen verwenden: q! in diesem Fall zu beenden. Ich mache das, damit ich validieren kann (z. B .:! Sudo /etc/init.d/httpd configtest) und bei Bedarf ein Rollback / Reedit durchführen kann.
Bruno Bronosky

15

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.

rkthkr sagte:
Aber es wäre schön, wenn vim neu gestartet und als root ausgeführt würde

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:

~# ps afo pid,ppid,user,stat,comm
  PID  PPID USER         STAT COMMAND
16187 30478 rbronosky    Ss   bash
16510 16187 rbronosky    R+    \_ ps
30482 30478 rbronosky    Ss   bash
16244 30482 rbronosky    S+    \_ vim
16318 16244 root         S+        \_ vim

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.


Danke Richard! Sehr informativ, ich gebe dir +1 dafür :)
Rkthkr

Dies ist eine sehr hochwertige Antwort: Warum abstimmen? +1 von mir auch.
Mei

1
Danke @Richard Bronosky, in meinem gvim ist es nicht möglich, das sudo-Passwort mit einzugeben, :w !sudo tee %daher denke ich, dass dies eine gute Antwort ist.
Eric Fortis

1

Normalerweise speichere ich es dann in einer temporären Datei in $ HOME / tmp / apache.conf (zum Beispiel)

sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf

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.


0

Normalerweise mache ich - nicht unbedingt die schnellste, aber auf jeden Fall die sicherste - Folgendes (am Beispiel von nsswitch.conf):

:w! ~/%

Verlasse vim und mache:

sudo vim nsswitch.conf
1GdG
:r ~/%

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.