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.