Convertirse en raíz desde dentro de Vim


72

A veces empiezo a editar archivos de configuración /etcusando Vim, pero me olvido de usar sudopara iniciar Vim. El resultado inevitable es que después de terminar mis ediciones me encuentro con el temido aviso de que no tengo permiso para guardar el archivo.

En su mayoría, las ediciones son lo suficientemente pequeñas como para que salga de Vim y vuelva a hacer todo como root. Por supuesto, podría guardar en una ubicación en la que pueda escribir y luego copiar como raíz, pero eso también es algo molesto.

Pero estoy seguro de que hay una manera más fácil de convertirse en root o usar sudodesde Vim, sin tener que descartar los cambios. Si el método no dependiera de sudoestar configurado para el usuario, eso sería aún mejor.


1
Me acostumbré a usar en sudoeditlugar de vimpara toda la edición administrativa. Es una forma de nunca más tener este problema :). +1 por la respuesta de Gilles .
jw013

Estas preguntas y respuestas alernativas de SO son útiles, por lo que se vinculan a ellas aquí: ¿ Cómo obtener permisos de root en un archivo dentro de vi? & ¿Cómo funciona el truco vim "escribir con sudo"? .
slm

Respuestas:


46

sudo no puede cambiar el usuario efectivo de un proceso existente, siempre crea un nuevo proceso que tiene los privilegios elevados y el shell original no se ve afectado. Esto es fundamental en el diseño de UNIX. La mayoría de las veces solo guardo el archivo en / tmp como solución alternativa. Si realmente desea guardarlo directamente, puede intentar usar una función de Vim donde pueda canalizar un archivo a otro proceso. Intenta guardar con este comando:

:w !sudo dd of=%

Probado y funciona. Luego, Vim le pedirá que vuelva a cargar el archivo, pero no es necesario: puede presionar opara evitar recargar y perder su historial de deshacer. Incluso puede guardar esto en un comando / función Vim o incluso vincularlo a una tecla para facilitar el acceso, pero lo dejaré como un ejercicio para el lector.


2
Esa es una solución interesante, pero podría reemplazar la ruta con %, que en vim será la ruta del archivo que está editando actualmente.
Reid

Debe ajustar las %comillas en caso de que el nombre del archivo contenga un espacio.
intuido

Además: esto no restablecerá la 'modified'configuración; puedes hacerlo manualmente con set nomodified.
intuido

2
En realidad, si realmente desea tener cuidado, que debe hacer exec 'w !sudo dd of=' . shellescape(expand('%'))en caso de que el nombre de archivo contiene citas, barras invertidas, dólar-signos, etc.
intuido

¿En qué se diferencia eso del comando Commandlinefu por plaes?

36

Guardar el archivo como root:

: w! sudo tee%


13

Llame sudoeditpara editar archivos como root.

Piense en las molestias al llamar vimdirectamente como una advertencia de que está siendo demasiado casual al hacer algo potencialmente peligroso.



3

Esto también funciona bien:

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

Esto está inspirado en el comentario de @Nathan Long en esta respuesta .

AVISO :

"debe usarse en lugar de 'porque queremos %expandirnos antes de pasar a shell.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.