Erste Root-Rechte auf eine Datei innerhalb von vi?

stimmen
227

Oft während Konfigurationsdateien bearbeiten, werde ich eins mit vi öffnen und dann, wenn ich gehen, um es zu retten erkennen, dass ich es nicht geben

sudo vi filename

Gibt es eine Möglichkeit vi sudo-Berechtigungen zu geben, um die Datei zu speichern? Ich scheine etwas über diese während zu erinnern sehen einige Sachen über vi vor einer Weile aufzublicken, aber jetzt kann ich es nicht finden.

Veröffentlicht am 04/08/2008 um 04:34
quelle vom benutzer
In anderen Sprachen...                            


11 antworten

stimmen
276

% mit dem aktuellen Dateinamen ersetzt wird, so können Sie verwenden:

:w !sudo tee %

( vimErkennt , dass die Datei geändert wurde und fragen , ob Sie wollen es wieder geladen werden.)

Als Abkürzung können Sie Ihren eigenen Befehl definieren. Legen Sie die folgenden in Ihrem .vimrc:

command W w !sudo tee % >/dev/null

Mit dem oben können Sie geben :W<Enter>die Datei zu speichern. Da ich dieses geschrieben habe, habe ich eine schönere Art und Weise (meiner Meinung nach ) , dies zu tun gefunden:

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

Auf diese Weise können Sie geben , :w!!und es wird auf die volle Befehlszeile erweitert werden, um den Cursor am Ende verlassen, so dass Sie die ersetzen %mit einem Dateinamen Ihrer eigenen, wenn Sie möchten.

Beantwortet am 31/08/2008 um 20:23
quelle vom benutzer

stimmen
29

In der Regel können Sie nicht die effektive Benutzer-ID des vi Prozesses ändern, aber Sie können dies tun:

:w !sudo tee myfile
Beantwortet am 04/08/2008 um 07:52
quelle vom benutzer

stimmen
13

Gemeinsamer Caveats

Die gebräuchlichste Methode der rund um das schreibgeschützte Datei Problem bekommen ist ein Rohr in der aktuellen Datei als Super-User zu öffnen mit einer Implementierung von sudo tee. Doch alle der beliebtestenen Lösungen , die ich rund um das Internet gefunden habe , haben eine Kombination aus einer mehr potenziellen Einschränkungen:

  • Die gesamte Datei wird an das Terminal geschrieben, sowie die Datei. Dies kann für große Dateien, vor allem bei langsamen Netzwerkverbindungen langsam sein.
  • Die Datei verliert seine Modi und ähnliche Attribute.
  • Dateipfade mit ungewöhnlichen Zeichen oder Leerzeichen möglicherweise nicht richtig gehandhabt werden.

Lösungen

Um das zu umgehen all diese Fragen, können Sie den folgenden Befehl verwenden:

" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Diese können verkürzt werden, respektvoll:

:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Erläuterung

:beginnt der Befehl; Sie müssen dieses Zeichen im normalen Modus einen Befehl ein, um den Anfang. Es sollte in Skripten weggelassen werden.

sil[ent]unterdrückt die von der Befehlsausgabe. In diesem Fall wollen wir die stoppen Press any key to continue-ähnlichen Eingabeaufforderung , die nach dem Ausführen des erscheint :!Befehl.

exec[ute]führt eine Zeichenkette als einen Befehl. Wir können nicht nur laufen , :writeweil es nicht den notwendigen Funktionsaufruf verarbeiten.

!stellt den :!Befehl: den einzigen Befehl, der :writeakzeptiert. Normalerweise :writenimmt einen Dateipfad zu dem schreiben. :!auf seinem eigenen führt einen Befehl in einer Schale (beispielsweise unter Verwendung bash -c). Mit :write, wird es den Befehl in der Shell ausführen und dann auf die gesamte Datei schreiben stdin.

sudodenn das ist, sollte klar sein, warum Sie hier sind. Führen Sie den Befehl als Superuser. Es gibt eine Fülle von Informationen rund um die ‚net darüber, wie das funktioniert.

teeRohre stdinin die angegebene Datei. :writeschreiben wird stdin, dann wird der Super-User teewerden die Dateiinhalte empfangen und die Datei schreiben. Es wird nicht eine neue Datei erstellen - nur den Inhalt überschreiben - so Dateimodi und Attribute beibehalten werden.

shellescape()entweicht in dem gegebenen Dateipfad als geeignet für den aktuell Shell Sonderzeichen. Mit nur einem Parameter, würde es in der Regel umschließen nur den Pfad in Anführungszeichen, falls erforderlich. Da wir zu einer vollständigen Shell-Befehlszeile senden, werden wir einen Wert ungleich Null als zweites Argument übergeben wollen Backslash-escaping anderer Sonderzeichen zu ermöglichen, die sonst die Shell stolpern könnten.

@%liest den Inhalt des %Registers, der die aktuelle Puffer des Dateinamen enthält. Es ist nicht unbedingt ein absoluter Pfad, so sicherzustellen , dass Sie nicht das aktuelle Verzeichnis geändert haben. In einigen Lösungen, sehen Sie das kommerzielle-at - Symbol verzichtet. Je nach Standort, %ist ein gültiger Ausdruck, und hat die gleiche Wirkung wie das %Leseregister. Geschachtelt innerhalb eines anderen Ausdrucks wird die Verknüpfung im allgemeinen nicht zulässig, aber: wie in diesem Fall.

>NULund >/dev/nullUmleitung stdoutauf die Null - Device-Plattform. Auch wenn wir den Befehl zum Schweigen gebracht haben, wollen wir nicht alle des Overhead , der mit Rohrleitungen stdinzurück zu vim - am besten so früh wie möglich zu entleeren. NUList das Null - Gerät auf DOS, MS-DOS und Windows, nicht eine gültige Datei. Ab Windows 8 Umleitungen zu NUL führen nicht in einer Datei mit dem Namen NUL geschrieben werden. Versuchen Sie, eine Datei auf Ihrem Desktop zu schaffen namens NUL, mit oder ohne Dateierweiterung: Sie werden nicht in der Lage , dies zu tun. (Es gibt mehrere andere Gerätenamen in Windows , die immer wert sein könnte wissen.)

~ / .vimrc

Plattformabhängige

Natürlich wollen Sie noch nicht sie diejenigen , und geben Sie jedes Mal speichern aus. Es ist viel einfacher , den entsprechenden Befehl zu einem einfacheren Benutzerbefehl abzubilden. Um dies zu tun auf POSIX, können Sie die folgende Zeile zu Ihrer hinzufügen ~/.vimrcDatei, es zu schaffen , wenn es nicht bereits vorhanden ist :

command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

Dies ermöglicht es Ihnen, die Typ: W (case-sensitive) anweisen, die aktuelle Datei mit Superuser-Berechtigungen zu schreiben - viel einfacher.

Plattformunabhängig

Ich benutze eine plattformunabhängige ~/.vimrcDatei , die auf mehreren Computern synchronisiert, so dass ich hinzugefügt Mine Multi-Plattform - Funktionalität. Ist hier ein ~/.vimrcnur mit den gewünschten Einstellungen vor :

#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
"   ts:     Actual tab character stops.
"   sw:     Indentation commands shift by this much.
"   sr:     Round existing indentation when using shift commands.
"   sts:    Virtual tab stops while using tab key.
"   fdm:    Folds are manually defined in file syntax.
"   ff:     Line endings should always be <NL> (line feed #09).
"   fenc:   Should always be UTF-8; #! must be first bytes, so no BOM.


" General Commands: User Ex commands. {{{1
    command W call WriteAsSuperUser(@%)         " Write file as super-user.


" Helper Functions: Used by user Ex commands. {{{1
    function GetNullDevice() " Gets the path to the null device. {{{2
        if filewritable('/dev/null')
            return '/dev/null'
        else
            return 'NUL'
        endif
    endfunction

    function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
        exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
    endfunction


" }}}1
" EOF
Beantwortet am 13/10/2012 um 07:54
quelle vom benutzer

stimmen
10

Wenn Sie mit Vim gibt es ein Skript zur Verfügung namens sudo.vim . Wenn Sie feststellen , dass Sie eine Datei geöffnet haben , die Sie Root - Zugriff lesen müssen, geben Sie

: E sudo:%
Vim ersetzt das% mit dem Namen der aktuellen Datei, und sudo:weist den sudo.vim Skript zum Lesen zu übernehmen und Schreiben.

Beantwortet am 24/09/2008 um 05:12
quelle vom benutzer

stimmen
7

Ryans Rat ist im Allgemeinen gut, jedoch, wenn folgenden Schritt 3 nicht die temporäre Datei bewegen; es wird die falschen Eigentümer und Berechtigungen hat. Stattdessen sudoeditdie richtige Datei und in den Inhalten (unter Verwendung lesen :roder dergleichen) der temporären Datei.

Wenn folgenden Schritt 2 Verwenden Sie :w!die Datei zu zwingen , geschrieben werden.

Beantwortet am 04/08/2008 um 05:04
quelle vom benutzer

stimmen
3

Wenn Sie in den Einfügemodus auf einer Datei gehen Sie sudo Zugang bearbeiten müssen, erhalten Sie eine Statusmeldung,

-- INSERT IGNORE  -- W10: Warning: Changing a readonly file

Wenn ich vermisse, dass im Allgemeinen ich tun

:w ~/edited_blah.tmp
:q

..dann..

sudo "cat edited_blah.tmp > /etc/blah"

..oder..

sudo mv edited_blah.tmp /etc/blah

Es ist wahrscheinlich eine weniger Umwegen, es zu tun, aber es funktioniert.

Beantwortet am 12/08/2008 um 19:37
quelle vom benutzer

stimmen
1

Hier ist eine andere, die erschienen sind , da diese Frage beantwortet wurde, ein Plugin namens sudoedit die SudoRead und SudoWrite Funktionen zur Verfügung stellt, die standardmäßig versuchen , sudo zu verwenden ersten und su wenn das fehlschlägt: http://www.vim.org/scripts/ script.php? script_id = 2709

Beantwortet am 29/01/2010 um 18:21
quelle vom benutzer

stimmen
1

Eine schnelle Google scheint, diesen Rat zu geben:

  1. Versuchen Sie nicht, zu bearbeiten, wenn es schreibgeschützt ist.
  2. Sie könnten in der Lage sein, die Berechtigungen für die Datei zu ändern. (Ob oder nicht, wird es lassen Sie ist sparen Sie bis zu Experimentieren.)
  3. Wenn Sie trotzdem noch bearbeitet, in eine temporäre Datei speichern und dann verschieben.

http://ubuntuforums.org/showthread.php?t=782136

Beantwortet am 04/08/2008 um 04:39
quelle vom benutzer

stimmen
0

Ich habe dies in meiner ~ / .bashrc:

alias svim='sudo vim'

Nun, wenn ich brauche eine Config-Datei bearbeiten ich es nur mit svim öffnen.

Beantwortet am 19/03/2009 um 13:51
quelle vom benutzer

stimmen
-2

Eine schnelle Hack Sie betrachten können, macht einen chmod auf die Datei, die Sie bearbeiten, mit vim speichern und dann chmod zurück zu dem, was die Datei ursprünglich war.

ls -l test.file (to see the permissions of the file)
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)

Natürlich empfehle ich diesen Ansatz nicht in einem System, in dem Sie über die Sicherheit besorgt sind, wie für ein paar Sekunden kann man die Datei lesen / ändern, ohne dass Sie es merken.

Beantwortet am 05/08/2008 um 23:20
quelle vom benutzer

stimmen
-7

verwenden gksudo statt sudo für GVim dh

cmap w!! w !gksudo tee >/dev/null %
Beantwortet am 30/11/2010 um 07:33
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more