Während ich Bearbeitungsdateien bearbeite, öffne ich oft eine mit vi und stelle dann beim Speichern fest, dass ich nicht eingegeben habe
sudo vi filename
Gibt es eine Möglichkeit, vi sudo-Berechtigungen zum Speichern der Datei zu erteilen? Ich erinnere mich an etwas darüber, als ich vor einiger Zeit ein paar Dinge über vi nachgeschlagen habe, aber jetzt kann ich es nicht finden.
Antworten:
%
wird durch den aktuellen Dateinamen ersetzt, daher können Sie Folgendes verwenden:(
vim
erkennt, dass die Datei geändert wurde, und fragt, ob sie neu geladen werden soll. Sagen Sie "Ja", indem Sie "[L]
OK" wählen .)Als Verknüpfung können Sie Ihren eigenen Befehl definieren. Geben Sie Folgendes in Ihre ein
.vimrc
:Mit den oben genannten können Sie eingeben
:W<Enter>
, um die Datei zu speichern. Seit ich das geschrieben habe, habe ich (meiner Meinung nach) einen schöneren Weg gefunden, dies zu tun:Auf diese Weise können Sie eingeben
:w!!
und es wird bis zur vollständigen Befehlszeile erweitert, wobei der Cursor am Ende verbleibt, sodass Sie das bei Bedarf durch%
einen eigenen Dateinamen ersetzen können .quelle
sudo: 1 incorrect password attempt
/etc/sudoers
Datei öffnen ,your_username ALL=(ALL) ALL
unter der Zeile hinzufügenroot ALL=(ALL) ALL
, beenden und speichern.visudo
.Im Allgemeinen können Sie die effektive Benutzer-ID des vi-Prozesses nicht ändern, aber Sie können dies tun:
quelle
:w !sudo tee % >/dev/null
oder:w !sudo dd of=%
vermeiden Sie, dass der Inhalt der Datei beim Speichern der Datei wiedergegeben wird.tee
und festgestellt, dass es sich um einen Unix-Pipe-Befehl handelt, und!
einen Shell-Befehl eingefügt. Ist das:w
Schreiben auf Standard out, was von weitergeleitet wirdtee
?Allgemeine Vorsichtsmaßnahmen
Die häufigste Methode, um das Problem mit schreibgeschützten Dateien zu umgehen, besteht darin, eine Pipe zur aktuellen Datei als Superuser mithilfe einer Implementierung von zu öffnen
sudo tee
. Alle gängigen Lösungen, die ich im Internet gefunden habe, haben jedoch eine Kombination aus mehreren möglichen Einschränkungen:Lösungen
Um all diese Probleme zu umgehen, können Sie den folgenden Befehl verwenden:
Diese können respektvoll gekürzt werden:
Erläuterung
:
beginnt den Befehl; Sie müssen dieses Zeichen im normalen Modus eingeben, um einen Befehl eingeben zu können. Es sollte in Skripten weggelassen werden.sil[ent]
Unterdrückt die Ausgabe des Befehls. In diesem Fall möchten wir diePress any key to continue
ähnliche Eingabeaufforderung stoppen, die nach dem Ausführen des:!
Befehls angezeigt wird .exec[ute]
führt eine Zeichenfolge als Befehl aus. Wir können nicht einfach laufen,:write
weil es den notwendigen Funktionsaufruf nicht verarbeitet.!
stellt den:!
Befehl dar: den einzigen Befehl, der:write
akzeptiert. Akzeptiert normalerweise:write
einen Dateipfad, in den geschrieben werden soll.:!
führt alleine einen Befehl in einer Shell aus (z. B. usingbash -c
). Mit:write
wird der Befehl in der Shell ausgeführt und anschließend die gesamte Datei in geschriebenstdin
.sudo
sollte offensichtlich sein, denn deshalb bist du hier. Führen Sie den Befehl als Superuser aus. Es gibt viele Informationen im Internet darüber, wie das funktioniert.tee
leitetstdin
an die angegebene Datei weiter.:write
wird schreibenstdin
, danntee
erhält der Superuser den Dateiinhalt und schreibt die Datei. Es wird keine neue Datei erstellt - überschreiben Sie einfach den Inhalt -, sodass die Dateimodi und -attribute erhalten bleiben.shellescape()
maskiert Sonderzeichen im angegebenen Dateipfad entsprechend der aktuellen Shell. Mit nur einem Parameter wird der Pfad normalerweise nach Bedarf in Anführungszeichen gesetzt. Da wir an eine vollständige Shell-Befehlszeile senden, möchten wir einen Wert ungleich Null als zweites Argument übergeben, um das Backslash-Escapezeichen anderer Sonderzeichen zu ermöglichen, die andernfalls die Shell auslösen könnten.@%
liest den Inhalt des%
Registers, das den Dateinamen des aktuellen Puffers enthält. Es ist nicht unbedingt ein absoluter Pfad. Stellen Sie daher sicher, dass Sie das aktuelle Verzeichnis nicht geändert haben. In einigen Lösungen wird das Werbesymbol weggelassen. Ist je nach Speicherort%
ein gültiger Ausdruck und hat den gleichen Effekt wie das Lesen des%
Registers. In einem anderen Ausdruck verschachtelt, ist die Verknüpfung jedoch im Allgemeinen nicht zulässig: wie in diesem Fall.>NUL
und auf das>/dev/null
Nullgerätstdout
der Plattform umleiten . Obwohl wir den Befehl zum Schweigen gebracht haben, möchten wir nicht, dass der gesamte Overhead, der mit dem Weiterleitenstdin
an vim verbunden ist, am besten so früh wie möglich ausgegeben wird.NUL
ist das Nullgerät unter DOS, MS-DOS und Windows, keine gültige Datei. Ab Windows 8 führen Umleitungen zu NUL nicht dazu, dass eine Datei mit dem Namen NUL geschrieben wird. Versuchen Sie, auf Ihrem Desktop eine Datei mit dem Namen NUL mit oder ohne Dateierweiterung zu erstellen. Dies ist nicht möglich. (Es gibt mehrere andere Gerätenamen in Windows, die es wert sein könnten, kennengelernt zu werden.)~ / .vimrc
Plattformabhängig
Natürlich möchten Sie diese immer noch nicht auswendig lernen und jedes Mal abtippen. Es ist viel einfacher, den entsprechenden Befehl einem einfacheren Benutzerbefehl zuzuordnen. Um dies unter POSIX zu tun, können Sie Ihrer
~/.vimrc
Datei die folgende Zeile hinzufügen und sie erstellen, falls sie noch nicht vorhanden ist:Auf diese Weise können Sie den Befehl: W (Groß- und Kleinschreibung beachten) eingeben, um die aktuelle Datei mit Superuser-Berechtigungen zu schreiben - viel einfacher.
Plattformunabhängig
Ich verwende eine plattformunabhängige
~/.vimrc
Datei, die computerübergreifend synchronisiert wird. Daher habe ich meine plattformübergreifende Funktionalität hinzugefügt. Hier ist eine~/.vimrc
mit nur den relevanten Einstellungen:quelle
sudo
gibt, aber nicht/dev/null
. Sie müssten also schicker werden, wenn Sie echte plattformübergreifende Unterstützung wünschen. Es ist eher eine Einführung - Denkanstöße. :)Wenn Sie Vim verwenden , steht ein Skript mit dem Namen sudo.vim zur Verfügung . Wenn Sie feststellen, dass Sie eine Datei geöffnet haben, für deren Lesen Sie Root-Zugriff benötigen, geben Sie ein
Vim ersetzt% durch den Namen der aktuellen Datei undsudo:
weist das Skript sudo.vim an, das Lesen und Schreiben zu übernehmen.quelle
Ryans Rat ist im Allgemeinen gut. Wenn Sie jedoch Schritt 3 ausführen, verschieben Sie die temporäre Datei nicht. Es wird den falschen Besitz und die falschen Berechtigungen haben. Stattdessen
sudoedit
die richtige Datei und den Inhalt (mit:r
oder ähnlichem) der temporären Datei einlesen .Wenn Sie Schritt 2 ausführen
:w!
, erzwingen Sie das Schreiben der Datei.quelle
Wenn Sie für eine Datei, für deren Bearbeitung Sie einen Sudo-Zugriff benötigen, in den Einfügemodus wechseln, wird eine Statusmeldung angezeigt
Wenn ich das vermisse, tue ich das im Allgemeinen
..dann..
..oder..
Es gibt wahrscheinlich einen weniger umständlichen Weg, aber es funktioniert.
quelle
Ein kurzer Google scheint diesen Rat zu geben:
http://ubuntuforums.org/showthread.php?t=782136
quelle
Hier ist ein weiteres Plugin, das seit Beantwortung dieser Frage aufgetaucht ist, ein Plugin namens SudoEdit, das SudoRead- und SudoWrite-Funktionen bereitstellt, die standardmäßig zuerst sudo und su verwenden, wenn dies fehlschlägt: http://www.vim.org/scripts/ script.php? script_id = 2709
quelle
Ich habe dies in meinem ~ / .bashrc:
Wenn ich jetzt eine Konfigurationsdatei bearbeiten muss, öffne ich sie einfach mit svim.
quelle
sudoedit
Befehl sollte bevorzugt werden, da vim nicht als root ausgeführt werden muss.Ein schneller Hack, den Sie in Betracht ziehen können, besteht darin, einen chmod für die zu bearbeitende Datei durchzuführen, mit vim zu speichern und dann chmod auf den ursprünglichen Zustand der Datei zurückzusetzen.
Natürlich empfehle ich diesen Ansatz nicht in einem System, in dem Sie sich Sorgen um die Sicherheit machen, da für einige Sekunden jeder die Datei lesen / ändern kann, ohne dass Sie es merken.
quelle