Diventando radice dall'interno di Vim


72

A volte inizio a modificare i file di configurazione /etcusando Vim, ma dimentico di usare sudoper avviare Vim. Il risultato inevitabile quindi è che dopo aver terminato le mie modifiche incontro l'avviso temuto di non avere il permesso di salvare il file.

Per lo più le modifiche sono abbastanza piccole che esco da Vim e faccio tutto di nuovo come root. Ovviamente potrei salvare in una posizione in cui posso scrivere e quindi copiarlo come root, ma è anche un po 'fastidioso.

Ma sono sicuro che esiste un modo più semplice per diventare root o usare sudodall'interno di Vim, senza dover annullare le modifiche. Se il metodo non si basasse sull'impostazione sudoper l'utente, sarebbe ancora meglio.


1
Ho preso l'abitudine di utilizzare sudoeditinvece di vimmodificare tutto l'amministratore. È un modo per non incappare più in questo problema :). +1 per risposta Gilles' .
jw013,

Queste domande e risposte alernative di SO sono utili quindi collegandole qui: Ottenere i permessi di root su un file all'interno di vi? & Come funziona il trucco vim "write with sudo"? .
slm

Risposte:


46

sudo non può cambiare l'utente effettivo di un processo esistente, crea sempre un nuovo processo che ha i privilegi elevati e la shell originale non è interessata. Questo è un aspetto fondamentale del design UNIX. Il più delle volte ho appena salvato il file in / tmp come soluzione alternativa. Se vuoi davvero salvarlo direttamente, potresti provare a utilizzare una funzionalità di Vim in cui può reindirizzare un file a un altro processo. Prova a salvare con questo comando:

:w !sudo dd of=%

Testato e funziona. Vim ti chiederà quindi di ricaricare il file, ma non è necessario: puoi semplicemente premere oper evitare di ricaricare e perdere la cronologia degli annullamenti. Puoi persino salvarlo in un comando / funzione di Vim o anche associarlo a un tasto per un facile accesso, ma lo lascerò come esercizio al lettore.


2
Questa è una soluzione interessante, ma potresti sostituire il percorso con %, che in vim sarà il percorso del file che stai modificando.
Reid

Dovresti racchiudere le %virgolette nel caso in cui il nome file contenga uno spazio.
intuito il

Inoltre: questo non ripristinerà l' 'modified'impostazione; puoi farlo manualmente con set nomodified.
intuito il

2
In realtà, se vuoi davvero stare attento, dovresti farlo exec 'w !sudo dd of=' . shellescape(expand('%'))nel caso in cui il nome del file contenga virgolette, barre rovesciate, simboli di dollaro, ecc.
intuito il

In che modo differisce dal comando Commandlinefu per plaes?

36

Salvataggio del file come root:

: w! sudo tee%


13

Chiama sudoeditper modificare i file come root.

Pensa al disagio quando chiami vimdirettamente come un avvertimento che sei troppo casual nel fare qualcosa di potenzialmente pericoloso.



3

Questo funziona anche bene:

:w !sudo sh -c "cat > %"

Questo si ispira al commento di @Nathan Long in questa risposta .

AVVISO :

"deve essere usato anziché 'perché vogliamo %essere espansi prima di passare alla shell.

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.