Wurzel aus Vim heraus werden

72

Manchmal fange ich an, Konfigurationsdateien /etcmit Vim zu bearbeiten , vergesse aber, sudoVim mit zu starten. Das unvermeidliche Ergebnis ist dann, dass ich nach Abschluss meiner Änderungen den gefürchteten Hinweis erhalte, dass ich nicht die Berechtigung zum Speichern der Datei habe.

Meistens sind die Änderungen so klein, dass ich Vim einfach beende und das Ganze als root wieder mache. Ich könnte natürlich an einem Ort speichern, an den ich schreiben und dann als root kopieren kann, aber das ist auch etwas ärgerlich.

Aber ich bin mir sicher, dass es einen einfacheren Weg gibt, Root zu werden oder sudovon Vim aus zu verwenden, ohne die Änderungen verwerfen zu müssen. Wenn sich die Methode nicht darauf verlassen würde sudo, für den Benutzer eingerichtet zu werden, wäre dies sogar noch besser.

Verrückter Wissenschaftler
quelle
1
Ich habe mir angewöhnt, sudoeditanstatt vimfür alle Admin-Bearbeitung zu verwenden. Es ist eine Möglichkeit, nie mehr auf dieses Problem zu stoßen :). +1 für Gilles 'Antwort .
Jw013
Diese alternativen Fragen und Antworten von SO sind nützlich, also verlinken Sie sie hier: Erhalten Sie root-Berechtigungen für eine Datei innerhalb von vi? & Wie funktioniert der VIM-Trick „Mit Sudo schreiben“? .
SLM

Antworten:

46

sudo kann den effektiven Benutzer eines vorhandenen Prozesses nicht ändern. Es wird immer ein neuer Prozess mit erhöhten Rechten erstellt, und die ursprüngliche Shell bleibt davon unberührt. Dies ist eine Grundvoraussetzung für das UNIX-Design. Ich speichere die Datei meistens nur in / tmp, um das Problem zu umgehen. Wenn Sie es wirklich direkt speichern möchten, können Sie eine Funktion von Vim verwenden, mit der eine Datei an einen anderen Prozess weitergeleitet werden kann. Versuchen Sie mit diesem Befehl zu speichern:

:w !sudo dd of=%

Getestet und funktioniert. Vim fordert Sie dann auf, die Datei neu zu laden. Dies ist jedoch nicht erforderlich. Sie können einfach auf drücken o, um ein erneutes Laden und den Verlust Ihres Rückgängig-Verlaufs zu vermeiden. Sie können dies sogar in einem Vim-Befehl / einer Vim-Funktion speichern oder für einen einfachen Zugriff an eine Taste binden, aber das überlasse ich dem Leser als Übung.

penguin359
quelle
2
Das ist eine interessante Lösung, aber Sie können den Pfad durch %den Pfad der Datei ersetzen , die Sie gerade bearbeiten.
Reid
Sie sollten die %in Anführungszeichen setzen, falls der Dateiname ein Leerzeichen enthält.
Intuited
Außerdem: Hierdurch wird die 'modified'Einstellung nicht zurückgesetzt . das kannst du manuell mit machen set nomodified.
Intuited
2
Eigentlich, wenn Sie wirklich vorsichtig sein wollen, sollten Sie tun, exec 'w !sudo dd of=' . shellescape(expand('%'))falls der Dateiname Anführungszeichen, Backslashes, Dollarzeichen usw. enthält
intuited
Wie unterscheidet sich das vom Commandlinefu-Befehl von plaes?
36

Speichern der Datei als root:

: w! sudo tee%

plaes
quelle
13

Rufen Sie sudoeditauf, um Dateien als root zu bearbeiten.

Stellen Sie sich die Unannehmlichkeiten beim vimdirekten Anrufen als Warnung vor, dass Sie zu lässig sind, um etwas potenziell Gefährliches zu tun.

Gilles
quelle
8

Sie können dies in Ihre setzen .vimrc

cmap w!! %!sudo tee > /dev/null %

Sie lösen es aus, indem Sie dies tun :w!!- es wird die Datei sudo teebis zum aktuellen Dateinamen ( %) durchschieben .

Von https://stackoverflow.com/questions/95072/what-are-your-favorite-vim-tricks

Hamish Downer
quelle
Und wenn Sie weitere Tools installiert haben, verwenden Sie !sudo sponge %stattdessen einfach .
zwei
3

Das funktioniert auch gut:

:w !sudo sh -c "cat > %"

Dies wird durch den Kommentar von @ Nathan Long in dieser Antwort inspiriert .

HINWEIS :

"muss anstelle von verwendet werden, 'da wir %vor der Übergabe an Shell erweitert werden möchten .

Feihu
quelle