Usar vim para forzar la edición de un archivo cuando lo abrió sin permisos

51

Yo uso vim para editar un archivo. A veces, me olvido de tener los permisos adecuados. Ejecuto vim y el archivo como un archivo de solo lectura. Puedo hacer cambios, pero en realidad no puedo escribir los cambios. De vez en cuando, termino abriendo un archivo y haciéndole cambios, me doy cuenta de que no lo ejecuté en sudo, me grito a mí mismo, y luego fuerzo a salir y lo vuelvo a abrir como usuario root.

¿Hay una solución para esto? ¿Puedo forzar los cambios en el archivo a pesar del estado de solo lectura del archivo? ¿Puedo al menos guardar los cambios, ejecutar un diff y fusionar los archivos?

andor kesselman
fuente
3
Esta pregunta parece haber sido respondida aquí: stackoverflow.com/questions/1005/…
Otoño
Mis disculpas. No encontré esa respuesta. Gracias.
andor kesselman
3
Utilice el [Vim write with sudo trick] [1]: w! Sudo tee% [1]: stackoverflow.com/questions/2600783/…
Mattias Åslund

Respuestas:

81

Parece haber algunos enfoques diferentes, dependiendo de su problema actual:

  1. Readonly por vi. Si tu archivo tiene :set readonlypuedes
    • Use :w!para forzar la escritura, o
    • Emitir :set noreadonlyy luego usar normal:w
  2. Un problema de permiso ( sudo ): no puede escribir pero tiene derechos de sudo.
    • Emitir: :w !sudo tee %. Esto escribirá el búfer en tee, un comando que recibe información de tubería y puede escribir en archivos. Y como tee se ejecuta con sudo powers, tee puede modificar el archivo.
  3. Un problema de permiso ( sin sudo ): no tiene derechos para escribir el archivo y no tiene acceso de administrador.
    • Utilícelo :w! ~/tempfile.extpara escribir sus cambios en un archivo temporal y luego tome medidas para mover el archivo temporal al directorio (envíe el archivo temporal al propietario / administrador del directorio).

Puedes leer más sobre esto aquí:

  1. De StackOverflow
  2. De Geekyboy
  3. De Data Agaric

Atajo

Como suele ser el problema número 2 ( problema de permiso , con sudo ), puede acceder a su /etc/vim/vimrc(o ~/.vimrc) acceso directo siguiente:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

Luego, simplemente puede escribir :w!!para guardar con poderes sudo . No lo explicaré aquí, pero las referencias anteriores cubren muchos accesos directos.

Dr. Beco
fuente
1
¡Y con tu anónimo como si acabara de ganar la insignia de nigromante! ¡Gracias! Tengo ganas de defender a Mordor ahora. ;)
Dr Beco
5

Puedo pensar en dos formas de hacer esto.

La primera forma supone que es el propietario del archivo, pero el archivo es READONLY.

Simplemente use el sufijo de signo de exclamación de vi en el comando de escritura (: w!) Para forzar la sobrescritura de su propio archivo READONLY. Por supuesto, esto supone que tiene permiso para escribir y ejecutar en la carpeta actual.

:w!

hará que vi sobrescriba el archivo READONLY original.

La segunda forma supone que otra persona es propietaria del archivo y desea guardar los cambios en ese archivo.

Una forma de lograr esto es guardar los cambios realizados en el archivo original como un script ed desde vi. Este script ed puede aplicarse al archivo original (u otros archivos similares) en un momento posterior fuera de vi con el editor de línea ed.

Una forma de guardar la sesión de edición actual como un script ed es pasar el nombre del archivo original y el buffer vi editado como entrada estándar a la utilidad diff con el interruptor de línea de comando --ed, es decir, mostrar las diferencias como un script ed.

Entonces, suponiendo un búfer vi editado, luego realice lo siguiente

:.,$!diff --ed [original_file] -

Esto reemplaza todas las líneas en el búfer actual (., $!) Con el script ed generado por diff (diff --ed [original_file] -) necesario para convertir el archivo original en el contenido del búfer actual. Luego queremos guardar este script ed en un lugar seguro y aplicar el script a una versión del archivo original en el que podamos escribir. Por lo tanto, guarde el script en una ubicación de escritura, por ejemplo, su carpeta de inicio de sesión:

:w ~/my_ed_script

Ahora salga de vi y use este script ed para obtener el archivo editado que no se pudo guardar en primer lugar. Aquí se explica cómo lograrlo desde la línea de comandos de bash, '$':

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

Lo que esta secuencia de comandos hace en palabras es catear el script que generamos con diff y hace eco del comando ed write, 'w', en la entrada estándar de ed. Luego, Ed aplica este script a la copia editable del archivo original y escribe los cambios de búfer modificados nuevamente en el archivo.

Entonces, esa es una manera de guardar el trabajo realizado en vi en un archivo que originalmente había sido propiedad de otra persona que usa vi, diff y ed.

Billy McCloskey
fuente
1

Solo quiero cubrir el caso cuando no hay permisos de escritura de archivos.

:!chmod +w %
:w!

En el medio, vim se quejará de los cambios en el archivo (debido al cambio de banderas), obviamente es seguro ignorarlos

Yatsa
fuente
0

Otra posibilidad, para el caso en el que no tiene privilegios de sudo, es usar :w /somewhere/where/i/have/permissions/foo.txt, y luego tratar el problema de los permisos más tarde, según Ryan Fox .

Jonathan Ben-Avraham
fuente