Bei vi angemeldet, Änderungen vorgenommen, zuerst sudo vergessen - jetzt was

11

Ich habe mit dem vi-Editor lange Änderungen an einer Konfigurationsdatei auf einem Ubuntu Linux-Computer vorgenommen. Leider habe ich zuerst sudo vergessen, daher bin ich jetzt im Editor, kann meine Änderungen jedoch aufgrund fehlender Rechte nicht speichern. Kann ich den Benutzer auf diesem Terminal rückwirkend sudo oder was wäre die beste Vorgehensweise?

Simon
quelle

Antworten:

11

In diesem Fall schreibe ich die Datei mit :w /tmp/tmpfile. Dann gehe ich raus und gehe /tmp/tmpfilezu meiner alten Datei mit Sudo-Rechten.

Dom
quelle
Das ist es, was ich am Ende mache, aber ich mag die Antwort von wfaulk . Wenn ich mich nur daran erinnern kann, wenn ich das nächste Mal mache! :)
Quacksalber Quijote
Ich hoffe , Sie kopieren die Datei nicht bewegt es. Durch das Verschieben wird der viDateimodus (Berechtigungen) durch den Standardmodus (wahrscheinlich 666, UND mit der Umkehrung Ihrer "umask") ersetzt, und der Eigentümer der Datei wird durch Ihre UID ersetzt (es war "root", nicht wahr?). und bricht harte Verbindungen.
Scott
Einige Probleme: (1) Wenn die Datei vertraulich sein soll und Ihre „Umask“ 22 (statt 66) ist, wird durch diesen Vorgang der Inhalt der Datei anderen Benutzern zugänglich gemacht, die möglicherweise das /tmpVerzeichnis überwachen . (2) Wenn Sie wirklich böse Benutzer auf Ihrem System haben, können diese Ihre /tmp/tmpfilezwischen dem Schreiben (von vi) und dem Kopieren über die von Ihnen bearbeitete Systemkonfigurationsdatei ersetzen . Es ist sicherer, die temporäre Datei in einem Verzeichnis abzulegen, auf das nur Sie Zugriff haben.
Scott
39

Von SO :

:w !sudo tee %

Ich benutze diesen Weg tatsächlich, um es jetzt häufiger zu tun:

:%!sudo tee %

Ich denke, es ist etwas intuitiver, da ich weiß, was es :%!tut, während ich kein viszerales Verständnis dafür habe :w !. Es ist auch leicht, den sehr wichtigen Raum zwischen dem wund dem zu übersehen !.

wfaulk
quelle
2
Wenn es Ihrer Intuition hilft, denken Sie daran, dass viBefehle aus mehreren Buchstaben bestehen können. Theoretisch kann es also einen " wfoo" -Befehl geben. Wenn Sie also in eine Datei mit dem Namen " foo" schreiben möchten , müssen Sie " :w foo" sagen . Dh du brauchst ein Leerzeichen nach " :w". Was " :w !" betrifft - wissen Sie, was " :!" ist, richtig? " :!date" Führt einen " date" Befehl aus. Also :w !xyzschreibt " " den Puffer, aber nicht in eine Datei , sondern in einen Befehl .
Scott
Dies sollte zur akzeptierten Antwort gemacht werden, da die aktuell vorhandene Antwort eine ziemlich lange Umgehung darstellt, während dies eine sofortige Lösung ist. OP?
bschlueter
-2

Könnten Sie nicht ein anderes Terminal öffnen und die Zugriffsrechte der Datei vorübergehend ändern?

Terje Mikal
quelle
1
Das ist eine schlechte Idee. Wahrscheinlich wird nicht immer ein großes Sicherheitsproblem sein, aber es könnte sein, und es gibt bessere und einfachere Lösungen (wie in eine temporäre Datei zu schreiben, oder besser, die :w !sudo tee % solutionwfaulk geschrieben
dbr