Guardar un fichero con vi o vim sin tener permisos de escritura

No sé a estas alturas cuantas veces me ha podido pasar pero diría que más de cientos sin temor a equivocarme. Abro un fichero para editar, digamos por ejemplo /etc/group y, cuando voy a grabar, me doy cuenta que estaba con mi usuario no privilegiado y no había abierto el editor con sudo y, por lo tanto, no me deja grabar por error de escritura.

i2c:x:137:
libvirtd:x:138:jose
kvm:x:139:
ntp:x:140:
kismet:x:141:jose
lxd:x:142:jose
E45: La opción 'readonly' está activada (añada "!" para forzar)
Pulse INTRO o escriba una orden para continuar

Y, como se trata de un tema de permisos, tampoco se soluciona utilizando el comando :w!

ibvirtd:x:138:jose
kvm:x:139:
ntp:x:140:
kismet:x:141:jose
lxd:x:142:jose
"/etc/group"
"/etc/group" E212: No se pudo abrir el archivo para escribir en él
Pulse INTRO o escriba una orden para continuar

Llegados a este punto, lo que solía hacer dependía de cuántas modificaciones había hecho en el fichero:

Si eran pocas y las recordaba, salía del editor sin guardar y volvía a abrirlo con sudo.

Si eran muchas, guardaba el fichero en un directorio temporal, adquiría permisos de root, tomaba nota de los permisos, dueño y grupo del fichero original, copiaba el fichero temporario sobre el original y finalmente, restituía permisos usuario y grupo sobre el fichero definitivo.

De una forma u otra perdía tiempo y corría el riesgo de equivocarme, además del tiempo perdido en rehacer los cambios o ejecutar la copia.

Pero ahora, he aprendido este truco para salvar el escollo. En caso que la escritura directa no sea posible, aplico el comando :w !sudo tee %.

kismet:x:141:jose
lxd:x:142:jose
:w !sudo tee %
[sudo] password for jose: 

W12: Advertencia: el archivo "/etc/group" ha cambiado y el búfer se modificó también en Vim
Véase ":help W12" para más información
"/etc/group" [Sólo lectura] 83L, 1222C
Pulse INTRO o escriba una orden para continuar

¿Pero qué ha ocurrido aquí?

El comando w con parámetros permite escribir a un fichero que, si no se ha especificado, será la salida standard.

El comando !sudo me permite ganar permisos de root (si me encuentro definido dentro del fichero /etc/sudoers y logro autenticarme adecuadamente).

El comando tee tomará la entrada standard proveniente del comando anterior y la escribirá en la salida standard y en el fichero que se especifique.

Finalmente, la expresión % es reemplazada por vim por el nombre del fichero originalmente abierto.

Puede comprobarse que efectivamente la escritura se ha realizado por el hecho que vim inmediatamente detecta que el fichero ha sido modificado externamente (por nuestro comando salvador) y nos da la opción de recargarlo incluyendo las modificaciones que ya hemos hecho.

Y ahora sí, una vez que el fichero ha sido salvado, ya es hora de salir sin grabar del editor y acordarse de abrirlo la próxima vez con los permisos correspondientes.

José Administrator
Apasionado por el software, la electrónica y la fotografía.
follow me

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *