GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden von vim, um die Bearbeitung einer Datei zu erzwingen, wenn Sie sie ohne Berechtigungen geöffnet haben

Es scheint verschiedene Ansätze zu geben, abhängig von Ihrem aktuellen Problem:

  1. Schreibgeschützt von vi. Wenn Ihre Datei :set readonly enthält du kannst
    • Verwenden Sie :w! um das Schreiben zu erzwingen, oder
    • Ausgabe :set noreadonly und dann einfach den normalen :w verwenden
  2. Eine Erlaubnis Problem (sudo ):Sie können nicht schreiben, aber Sie haben sudo-Rechte.
    • Problem::w !sudo tee % . Dadurch wird der Puffer in tee geschrieben , ein Befehl, der pipe empfängt Informationen und kann in Dateien schreiben. Und da tee mit sudo-Kräften ausgeführt wird, kann tee die Datei ändern.
  3. Eine Erlaubnis Problem (kein sudo ):Sie haben keine Rechte zum Schreiben der Datei und Sie haben keinen Administratorzugriff.
    • Verwenden Sie :w! ~/tempfile.ext 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 Eigentümer/Administrator des Verzeichnisses).

Hier können Sie mehr darüber lesen:

  1. Von StackOverflow
  2. Von Geekyboy
  3. Von Data Agaric

Verknüpfung

Wie so oft ist Problem Nr. 2 (Erlaubnis Problem, mit sudo ), können Sie zu Ihrem /etc/vim/vimrc (oder ~/.vimrc ) das folgende Kürzel:

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

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


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

Bei der ersten Methode wird davon ausgegangen, dass Sie der Eigentümer der Datei sind, die Datei jedoch schreibgeschützt ist.

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.

Bei der zweiten Möglichkeit wird davon ausgegangen, dass jemand anderes die Datei besitzt und Sie Ihre Änderungen an dieser Datei speichern möchten.

Eine Möglichkeit, dies zu erreichen, besteht darin, die an der Originaldatei vorgenommenen Änderungen als ed-Skript innerhalb von vi 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 Bearbeitungssitzung als Ed-Skript zu speichern, besteht darin, den ursprünglichen Dateinamen und den bearbeiteten vi-Puffer als Standardeingabe an das Diff-Dienstprogramm mit dem Befehlszeilenschalter --ed zu übergeben, d.h. Unterschiede als Ed-Skript anzuzeigen.

Gehen Sie also von einem bearbeiteten vi-Puffer aus und führen Sie Folgendes aus

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

Dadurch werden alle Zeilen im aktuellen Puffer (.,$!) durch das von Diff generierte ed-Skript (diff --ed [original_file] -) ersetzt, das zum Konvertieren der Originaldatei in den Inhalt des aktuellen Puffers erforderlich ist. Wir möchten dieses ed-Skript dann an einem sicheren Ort speichern und das Skript auf eine Version der Originaldatei anwenden, in die wir schreiben können. Speichern Sie das Skript also 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 zu erhalten, die überhaupt nicht gespeichert werden konnte. So erreichen Sie dies über die Bash-Befehlszeileneingabeaufforderung „$“:

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

Was diese Befehlssequenz in Worten ausführt, ist, das von uns generierte Skript mit diff zu verketten und den ed-Write-Befehl „w“ an die Standardeingabe von ed zurückzugeben. Ed wendet dieses Skript dann auf die beschreibbare Kopie der Originaldatei an und schreibt diese geänderten Pufferänderungen zurück in die Datei.

Das ist also eine Möglichkeit, mit vi, diff und ed. in vi ausgeführte Arbeiten in einer Datei zu speichern, die ursprünglich jemand anderem gehört hatte.


Linux
  1. Das Apache-Zugriffsprotokoll legt automatisch Berechtigungen fest

  2. temporärer Dateispeicherort bei Verwendung von tmpfile() in C

  3. Wohin gehen Metadaten, wenn Sie eine Datei speichern?

  4. So bearbeiten Sie eine Excel-Datei (xlsx) mit der Linux-Shell

  5. Wie entferne ich eine Datei ohne rm?

Linux-Dateiberechtigungen:Alles, was Sie wissen müssen

So bearbeiten Sie mehrere Dateien mit dem Vim-Editor

Vim-Tipps – Bearbeiten Sie Remote-Dateien mit Vim unter Linux

So bearbeiten Sie eine Datei, ohne ihre Zeitstempel in Linux zu ändern

So ändern Sie Dateiberechtigungen mit FileZilla

So bearbeiten Sie Binärdateien auf Unix-Systemen