Come salvare un file per il quale non ho i permessi di scrittura?


26

A volte succede che apro un file e apporto alcune modifiche come il mio utente, senza notare o "dimenticare" di notare l' [read-only]avviso nella riga di stato (ad esempio alcuni /etcfile di configurazione casuali come /etc/resolv.conf).

:w!ovviamente fallisce in questo caso perché il mio utente non ha alcun permesso di scrittura comunque. Quindi devo :w /home/filenameuscire e sudo mv ...molto a disagio.

Esiste un modo per eseguire l'escalation temporanea a root per poter salvare il file attualmente aperto? (dato che sono in sudoerso / e posso sudirettamente)?

Risposte:


24

Il trucco è utilizzare una chiamata esterna per sudo:

:w !sudo tee %

Come funziona:

  • :w !<command>viene eseguito <command>con il contenuto del buffer come stdin.
  • teeduplica stdin in un file & stdout; %si espande nel nome file corrente ..
  • Si prefigge questo sudoper le autorizzazioni di root.

Non stai davvero salvando il file con Vim, piuttosto, stai chiamando un programma esterno per sovrascrivere il contenuto del file che stai modificando. Ecco perché riceverai un avviso da Vim:

W12: Warning: File "xxx" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

Puoi trasformarlo in una funzione:

fun! SuperWrite()
        write !sudo tee %
        " Or with :silent (but that doesn't seem to work for everyone)
        "silent write !sudo tee %
        edit!
endfun

E keybind:

nnoremap <Leader>w! :call SuperWrite()<CR>

Con su, solo l'utente root può usare -cper eseguire immediatamente un comando. Non penso che tu possa usare super fare questo, ma forse c'è un trucco di cui non sono a conoscenza ...


SuperWritefunziona, ma fa eco al file. Eseguendolo, :silentpuoi inserire la password in modo invisibile.
TankorSmash,

@TankorSmash Grazie; risposta aggiornata. Non sei sicuro di cosa intendi con "inserisci la password in modo invisibile", comunque? L'aggiunta silentsembra funzionare bene?
Martin Tournoij,

Non eseguo vim con sudo, quindi potrebbe essere in gioco qui, ma quando vado a sudo tee il file, mi chiede la password di sudo. Se è silenzioso, non vedo il messaggio, ma devo ancora inserire una password.
TankorSmash,

1
Quello che vedi è la funzionalità standard di tee di eco a stdout e il file fornito. Una soluzione è reindirizzare lo stdout su / dev / null, alla: w ! tee % > /dev/null Questo farà ancora eco al risultato del comando (una sola riga), ma non all'intero contenuto del buffer.
Jon Carter,

Invece di usare e teepoi gettare via il suo output, non funzionerebbe catanche se non si desidera stampare il file?
Sdraiati Ryan il

12

Uso il seguente mapping nel mio .vimrc, che trovo utile:

cnoremap w!! w !sudo tee %

È facile da ricordare, perché wè "write", w!è "force write" ed w!!è "super-duper-force write". : P


1
Ho a lungo mappato W, ma w!!ha molto più senso, aggiornerà il mio .vimrc. Grazie
jalanb,
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.