vim reeditar como root

28

A menudo abro un archivo en vim, hago algunos cambios y cuando llega el momento de guardar el archivo es de solo lectura ... (propiedad de otro usuario). Estoy buscando consejos sobre cómo podría volver a abrir el archivo como root y mantener mis cambios sin guardarlo primero en un archivo temporal para copiarlo o volver a editarlo como root.

rkthkr
fuente

Respuestas:

42

De esta respuesta stackoverflow , por skinp

:w !sudo tee %

A menudo olvido sudo antes de editar un archivo en el que no tengo permisos de escritura. Cuando vengo a guardar ese archivo y obtengo un error de permiso, simplemente ejecuto ese comando vim para guardar el archivo sin la necesidad de guardarlo en un archivo temporal y luego volver a copiarlo.

dbr
fuente
Eso es casi todo ... Pero sería bueno tener vim reiniciado y ejecutado como root ... Este es mi favorito hasta ahora :)
rkthkr
@rkthkr, si "vim se reinicia y se ejecuta como root", no podrá guardar las modificaciones que haya realizado y perderá su historial de deshacer. Pero si eso es lo que quieres ... [Se quedaron sin caracteres.] Mira la "respuesta" que estoy a punto de escribir.
Bruno Bronosky
2
@dbr, creo que vale la pena mencionar que después de sobrescribir el archivo (con tee como sudo), aparecerá un mensaje con [O] k o [L] oad. La opción posterior borrará su historial de deshacer y restablecerá la "bandera modificada" que le permite salir sin ser advertido para guardar los cambios. La primera opción, que prefiero, preservará tu historial de deshacer, pero hará que te avisen cuando trates de salir. Tienes que usar: q! dejar de fumar en este caso. Hago esto para poder validar (por ejemplo:! Sudo /etc/init.d/httpd configtest) y revertir / reeditar si es necesario.
Bruno Bronosky
15

Por favor no me voten por esto. No recomiendo implementar esta respuesta, pero es la respuesta que pide el rkthkr.

rkthkr dijo:
Pero sería bueno tener vim reiniciado y ejecutado como root

La forma de hacerlo es con :!sudo vim %
Como mencioné a ipozgaj, un% como argumento (incluso un subargumento) se reemplaza con la ruta al búfer actual. (Es posible que se le solicite su contraseña). Termina con un nuevo proceso vim, propiedad de root, que es un proceso secundario del proceso vim original. Suena tonto, ¿verdad? Así es como se ve en ps:

~# ps afo pid,ppid,user,stat,comm
  PID  PPID USER         STAT COMMAND
16187 30478 rbronosky    Ss   bash
16510 16187 rbronosky    R+    \_ ps
30482 30478 rbronosky    Ss   bash
16244 30482 rbronosky    S+    \_ vim
16318 16244 root         S+        \_ vim

Si tiene permisos de escritura en el directorio que contiene el archivo y ha realizado modificaciones, es posible que se le advierta que existe un archivo de intercambio. Si elige [R] ecover, se reflejará la mayoría * de los cambios realizados por el proceso vim principal. (* Creo que tal vez la actualización de intercambio está programada o tiene un umbral delta. Ya he dedicado demasiado tiempo a esto y no me importa investigarlo). Cuando vaya y salga de vim, no se alarme cuando esté todavía en vim ... abriste un segundo proceso de vim. ¿Recuerda?

Ahora, con todo eso dicho ... Casi nunca haría esto. Tal vez, si no he tenido suficiente o demasiado café, y me di cuenta de que iba a necesitar editar varios archivos más como root ... Podría intentar esto. En 14 años de administración de sistemas, nunca lo he hecho. Pero, hasta que expresaste descontento con mi solución preferida (que es exactamente como la ofrecida por dbr), nunca había pensado en esto.

Bruno Bronosky
fuente
Gracias Richard! Muy informativo, te daré +1 por ello :)
rkthkr
Esta es una respuesta de muy alta calidad: ¿por qué votar en contra? +1 de mi parte también.
Mei
1
Gracias @Richard Bronosky, en mi gvim no es posible escribir la contraseña de sudo, :w !sudo tee %así que creo que esta es una buena respuesta.
Eric Fortis
1

Por lo general, lo guardo en un archivo temporal en $ HOME / tmp / apache.conf (por ejemplo) y luego

sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf

Este es un trabajo adicional para fusionar los cambios, pero valió la pena. Creo que es una buena manera entre la conveniencia y las mediciones contra cambios no deseados.

Antes de eso, pensaba en las ACL o en asignar los grupos correspondientes a los archivos, pero no funcionó con demasiada frecuencia, o bien olvidé cambiar las propiedades o estaba cambiando los archivos donde no tenía la intención de hacerlo.

Eso va solo para los archivos que no se administran hasta ahora. La solución general que utilizamos es una marioneta con un repositorio git donde las personas editan localmente archivos y prueban los cambios en los servidores apropiados, si la configuración funciona como se desea, los cambios se envían al repositorio central donde nuestro motor de configuración extrae los cambios a intervalos regulares.

servidorhorror
fuente
0

Lo que normalmente hago, no necesariamente el más rápido, pero ciertamente seguro, es hacer algo como esto (usando nsswitch.conf como ejemplo):

:w! ~/%

Salga de vim, luego haga:

sudo vim nsswitch.conf
1GdG
:r ~/%

Esto eliminará todas las líneas y leerá su versión modificada y actualizada para editarla en su lugar. Usar su directorio personal significa que no tiene que pensar si tiene acceso o no, y es más privado que / tmp. Tenga en cuenta que este es un reemplazo completo del archivo: si no desea agregar todos los cambios, tendrá que elegir.

A pesar del dolor de cabeza involucrado en cualquiera de estas respuestas, no hay razón para perder sus cambios.

Mei
fuente