Verwenden von vim, um das Bearbeiten einer Datei beim Öffnen ohne Berechtigungen zu erzwingen


51

Ich benutze vim, um eine Datei zu bearbeiten. Manchmal vergesse ich, die entsprechenden Berechtigungen zu haben. Ich führe vim und die Datei als schreibgeschützte Datei aus. Ich kann Änderungen vornehmen, aber ich kann die Änderungen nicht schreiben. Hin und wieder öffne ich eine Datei und ändere sie, stelle fest, dass ich sie nicht in sudo ausgeführt habe, schreie vor mich hin und erzwinge dann das Beenden und öffne sie erneut als Root.

Gibt es eine Problemumgehung dafür? Kann ich die Änderungen an der Datei erzwingen, obwohl die Datei schreibgeschützt ist? Kann ich zumindest die Änderungen speichern, ein Diff ausführen und die Dateien zusammenführen?


3
Diese Frage scheint hier bereits beantwortet worden zu sein: stackoverflow.com/questions/1005/…
Autumnal

Entschuldigen Sie. Ich habe diese Antwort nicht gefunden. Danke.
Andor Kesselman

3
Verwenden Sie den [Vim Write mit Sudo-Trick] [1]: w! Sudo tee% [1]: stackoverflow.com/questions/2600783/…
Mattias Åslund

Antworten:


81

Abhängig von Ihrem aktuellen Problem scheint es einige unterschiedliche Ansätze zu geben:

  1. Readonly von vi. Wenn Ihre Datei hat :set readonly, können Sie
    • Verwenden Sie :w!, um das Schreiben zu erzwingen, oder
    • Problem :set noreadonlyund dann einfach normal benutzen:w
  2. Ein Berechtigungsproblem ( sudo ): Sie können nicht schreiben, haben aber sudo-Rechte.
    • Ausgabe: :w !sudo tee %. Dadurch wird der Puffer in teeeinen Befehl geschrieben, der Pipe- Informationen empfängt und in Dateien schreiben kann. Und da tee mit Sudo-Kräften ausgeführt wird, kann tee die Datei ändern.
  3. Ein Berechtigungsproblem ( kein Sudo ): Sie haben keine Rechte zum Schreiben der Datei und keinen Administratorzugriff.
    • Verwenden :w! ~/tempfile.extSie diese Option , um Ihre Änderungen in eine temporäre Datei zu schreiben und dann Maßnahmen zu ergreifen, um die temporäre Datei in das Verzeichnis zu verschieben (senden Sie die temporäre Datei an den Verzeichnisbesitzer / admin).

Hier können Sie mehr darüber lesen:

  1. Aus StackOverflow
  2. Von Geekyboy
  3. Aus Datenpilz

Abkürzung

Wie es oft der Fall ist Problem # 2 ( Berechtigungsproblem , mit sudo ), können Sie zu Ihrer /etc/vim/vimrc(oder ~/.vimrc) folgenden Verknüpfung:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

Dann können Sie einfach :w!!mit sudo powers speichern . Ich werde es hier nicht erklären, aber die obigen Referenzen decken viele Abkürzungen ab.


1
Und mit deinem anonymen Like habe ich mir gerade das Nekromantenabzeichen verdient! Vielen Dank! Ich habe jetzt Lust, Mordor zu verteidigen. ;)
Dr. Beco

5

Ich kann mir zwei Möglichkeiten vorstellen, dies zu tun.

Der erste Weg geht davon aus, dass Sie die Datei besitzen, aber die Datei ist READONLY.

Verwenden Sie einfach das Ausrufezeichen-Suffix von vi für den Schreibbefehl (: w!), Um das Überschreiben Ihrer eigenen READONLY-Datei zu erzwingen. Dies setzt natürlich voraus, dass Sie die Berechtigung zum Schreiben und Ausführen im aktuellen Ordner haben.

:w!

bewirkt, dass vi die ursprüngliche READONLY-Datei überschreibt.

Die zweite Möglichkeit setzt voraus, dass jemand anderes Eigentümer der Datei ist und Sie Ihre Änderungen in dieser Datei speichern möchten.

Eine Möglichkeit, dies zu erreichen, besteht darin, die an der Originaldatei vorgenommenen Änderungen in vi als Ed-Skript zu speichern. Dieses ed-Skript kann zu einem späteren Zeitpunkt außerhalb von vi mit dem ed-Zeileneditor auf die Originaldatei (oder andere ähnliche Dateien) angewendet werden.

Eine Möglichkeit, die aktuelle Editiersitzung als Editierskript zu speichern, besteht darin, den ursprünglichen Dateinamen und den bearbeiteten Vi-Puffer als Standardeingabe an das Dienstprogramm diff mit der Befehlszeilenoption --ed zu übergeben, dh Unterschiede als Editierskript anzuzeigen.

Gehen Sie also unter der Annahme eines bearbeiteten vi-Puffers wie folgt vor

:.,$!diff --ed [original_file] -

Dadurch werden alle Zeilen im aktuellen Puffer (., $!) Durch das diff-generierte ed-Skript (diffed [original_file] -) ersetzt, das zum Konvertieren der Originaldatei in den Inhalt des aktuellen Puffers erforderlich ist. Anschließend möchten wir dieses ed-Skript an einem sicheren Ort speichern und das Skript auf eine Version der Originaldatei anwenden, in die wir schreiben können. Speichern Sie das Skript an einem beschreibbaren Ort, beispielsweise in Ihrem Anmeldeordner:

:w ~/my_ed_script

Beenden Sie nun vi und verwenden Sie dieses ed-Skript, um die bearbeitete Datei abzurufen, die überhaupt nicht gespeichert werden konnte. So erreichen Sie das über die Bash-Eingabeaufforderung '$':

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

Diese Befehlssequenz verwendet Worte, um das mit diff generierte Skript zu verketten und gibt den Befehl ed write 'w' an die Standardeingabe von ed weiter. Anschließend wendet Ed dieses Skript auf die beschreibbare Kopie der Originaldatei an und schreibt die geänderten Pufferänderungen zurück in die Datei.

Auf diese Weise können Sie die in vi ausgeführten Arbeiten in einer Datei speichern, die ursprünglich jemand anderem gehört hatte, der vi, diff und ed verwendet.


1

Ich möchte nur auf den Fall eingehen, dass keine Dateischreibberechtigungen vorhanden sind.

:!chmod +w %
:w!

Zwischendurch beschwert sich vim über Änderungen in der Datei (aufgrund von Änderungen der Flags) - es ist offensichtlich sicher, sie zu ignorieren


0

Eine andere Möglichkeit für den Fall, dass Sie nicht über Sudo-Berechtigungen verfügen, besteht darin :w /somewhere/where/i/have/permissions/foo.txt, das Problem mit den Berechtigungen später gemäß Ryan Fox zu behandeln .

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.