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?
linux
vim
terminal
permissions
andor kesselman
quelle
quelle
Antworten:
Abhängig von Ihrem aktuellen Problem scheint es einige unterschiedliche Ansätze zu geben:
:set readonly
, können Sie:w!
, um das Schreiben zu erzwingen, oder:set noreadonly
und dann einfach normal benutzen:w
:w !sudo tee %
. Dadurch wird der Puffer intee
einen 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.:w! ~/tempfile.ext
Sie 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:
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.quelle
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.
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
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:
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 '$':
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.
quelle
Ich möchte nur auf den Fall eingehen, dass keine Dateischreibberechtigungen vorhanden sind.
Zwischendurch beschwert sich vim über Änderungen in der Datei (aufgrund von Änderungen der Flags) - es ist offensichtlich sicher, sie zu ignorieren
quelle
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 .quelle