Utilizzo di vim per forzare la modifica di un file quando è stato aperto senza autorizzazioni


51

Uso vim per modificare un file. A volte, dimentico di avere le autorizzazioni appropriate. Corro vim e il file come file di sola lettura. Posso apportare modifiche, ma in realtà non riesco a scrivere le modifiche. Ogni tanto finisco per aprire un file e apportare modifiche, mi rendo conto di non averlo eseguito sudo, urlare a me stesso, quindi forzare l'uscita e riaprirlo come utente root.

C'è una soluzione per questo? Posso forzare le modifiche al file nonostante lo stato di sola lettura del file? Posso almeno salvare le modifiche, eseguire un diff e unire i file?


3
A questa domanda sembra che sia già stata data una risposta qui: stackoverflow.com/questions/1005/…
Autunno

Mie scuse. Non ho trovato quella risposta. Grazie.
Andor Kesselman,

3
Usa [Vim write with sudo trick] [1]: w! Sudo tee% [1]: stackoverflow.com/questions/2600783/…
Mattias Åslund

Risposte:


81

Sembra che ci siano alcuni approcci diversi, a seconda del problema attuale:

  1. Di sola lettura di vi. Se il tuo file è :set readonlypossibile
    • Utilizzare :w!per forzare la scrittura o
    • Emettere :set noreadonlye quindi utilizzare solo normale:w
  2. Un problema di autorizzazione ( sudo ): non puoi scrivere ma hai i diritti di sudo.
    • Problema: :w !sudo tee %. Questo scriverà il buffer in tee, un comando che riceve informazioni sulla pipe e può scrivere su file. E poiché tee viene eseguito con i poteri sudo, tee può modificare il file.
  3. Un problema di autorizzazione ( no sudo ): non hai i diritti per scrivere il file e non hai accesso come amministratore.
    • Utilizzare :w! ~/tempfile.extper scrivere le modifiche in un file temporaneo e quindi adottare misure per spostare il file temporaneo nella directory (inviare il file temporaneo al proprietario / amministratore della directory).

Puoi leggere di più qui:

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

scorciatoia

Poiché è spesso il caso n. 2 ( problema di autorizzazione , con sudo ), è possibile selezionare /etc/vim/vimrc(o ~/.vimrc) il seguente collegamento:

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

Quindi puoi semplicemente digitare :w!!per salvare con i poteri sudo . Non lo spiegherò qui ma i riferimenti sopra coprono molte scorciatoie.


1
E con il tuo anonimo come ho appena guadagnato il badge di negromante! Grazie! Adesso ho voglia di difendere Mordor. ;)
Dr Beco,

5

Posso pensare a due modi per farlo.

Il primo modo presuppone che tu sia il proprietario del file, ma il file è PRONTO.

Basta usare il suffisso del punto esclamativo di vi sul comando write (: w!) Per forzare la sovrascrittura del proprio file READONLY. Questo ovviamente presuppone che tu abbia il permesso di scrivere ed eseguire nella cartella corrente.

:w!

farà sì che vi sovrascriva il file READONLY originale.

Il secondo modo presuppone che qualcun altro possieda il file e si desidera salvare le modifiche in quel file.

Un modo per ottenere ciò è salvare le modifiche apportate al file originale come script ed all'interno di vi. Questo script ed può essere applicato al file originale (o altri file simili) in un momento successivo al di fuori di vi con l'editor della linea ed.

Un modo per salvare la sessione di modifica corrente come uno script ed è quello di passare il nome del file originale e il buffer vi modificato come input standard all'utilità diff con l'opzione della riga di comando --ed ovvero visualizzare le differenze come uno script ed.

Quindi, supponendo un buffer vi modificato, quindi eseguire quanto segue

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

Questo sostituisce tutte le righe nel buffer corrente (., $!) Con lo script ed generato diff (diff - file [file_originale] -) necessario per convertire il file originale nel contenuto del buffer corrente. Vogliamo quindi salvare questo script ed in un posto sicuro e applicare lo script a una versione del file originale su cui possiamo scrivere. Quindi, salva lo script in una posizione scrivibile, ad esempio la tua cartella di accesso:

:w ~/my_ed_script

Ora esci da vi e usa questo script ed per ottenere il file modificato che non poteva essere salvato in primo luogo. Ecco come eseguire ciò dal prompt della riga di comando di bash, '$':

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

Ciò che questa sequenza di comandi fa a parole è catenare lo script che abbiamo generato con diff ed echeggia il comando ed write, 'w', sull'input standard di ed. Ed applica quindi questo script alla copia scrivibile del file originale e riscrive le modifiche al buffer modificate nel file.

Quindi questo è un modo per salvare il lavoro svolto in vi in ​​un file che era stato originariamente posseduto da qualcun altro usando vi, diff ed ed.


1

Voglio solo coprire il caso in cui non ci sono permessi di scrittura dei file.

:!chmod +w %
:w!

Nel frattempo, Vim si lamenterà delle modifiche al file (a causa del cambio delle bandiere): è ovviamente sicuro ignorarle


0

Un'altra possibilità, nel caso in cui non si disponga dei privilegi di sudo, è quella di utilizzare :w /somewhere/where/i/have/permissions/foo.txte quindi gestire il problema delle autorizzazioni in un secondo momento, come per Ryan Fox .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.