Ingresé a vi, hice cambios, olvidé sudo primero, ahora qué

11

Hice largos cambios en un archivo de configuración en una computadora Ubuntu Linux con el editor vi. Desafortunadamente, olvidé sudo primero, así que ahora estoy en el editor, pero no puedo guardar mis cambios debido a la falta de derechos. ¿Puedo sudar retroactivamente al usuario en ese terminal o cuál sería el mejor curso de acción a seguir?

Simón
fuente
2
Ver también stackoverflow.com/questions/1005/…
partir de ahí

Respuestas:

11

En este caso, escribo el archivo con :w /tmp/tmpfile. Luego salgo y me muevo /tmp/tmpfilea mi antiguo archivo con derechos de sudo.

Dom
fuente
esto es lo que termino haciendo, pero me gusta la respuesta de wfaulk ... ¡si solo puedo recordarlo la próxima vez que haga esto! :)
quack quijote
Espero que copie el archivo en lugar de moverlo . Mover reemplaza el modo del archivo (permisos) con viel predeterminado (que probablemente sea 666, Y junto con el inverso de su "umask"), reemplaza el propietario del archivo con su UID (era "root", ¿no?) y rompe enlaces duros.
Scott
Un par de problemas: (1) Si se supone que el archivo es confidencial y su “umask” es 22 (en lugar de 66), este procedimiento expone el contenido del archivo a otros usuarios que podrían estar monitoreando el /tmpdirectorio. (2) Si tiene usuarios verdaderamente malvados en su sistema, podrían reemplazarlo /tmp/tmpfileentre cuando lo escribe (desde vi) y cuando lo copia sobre el archivo de configuración del sistema que estaba editando. Es más seguro colocar el archivo temporal en un directorio al que solo usted tiene acceso.
Scott
40

De SO :

:w !sudo tee %

De hecho, ahora me encuentro usando esta forma para hacerlo con más frecuencia:

:%!sudo tee %

Creo que es un poco más intuitivo, ya que sé lo que :%!hace, mientras que no tengo una comprensión visceral :w !. Además, es fácil perderse el espacio muy importante entre el wy el !.

wfaulk
fuente
3
Si ayuda a su intuición, recuerde que los vicomandos pueden ser varias letras, por lo que en teoría podría haber un wfoocomando " ", por lo que si desea escribir en un archivo llamado " foo", debe decir " :w foo". Es decir, necesitas un espacio después de " :w". En cuanto a " :w !" se refiere, ya sabes lo que es " :!", ¿verdad? " :!date" Ejecuta un datecomando " ". Entonces " :w !xyz" escribe el búfer, pero en un comando en lugar de en un archivo.
Scott
Esta debería ser la respuesta aceptada, ya que la respuesta existente actual es una solución bastante larga, mientras que esta es una solución inmediata. OP?
bschlueter
@ Scott, gracias por la explicación! ¿Qué es tee y %aunque?
CodyBugstein
@CodyBugstein: Hola. (1) Hacer ping a los autores de los comentarios de seis años a menudo no lo lleva a ninguna parte, ya que las personas a veces se van y nunca regresan. Pero estoy encadenado a mi computadora; Probablemente estaré aquí para siempre. (O tal vez no.) (2) ¿Has intentado investigar? Debería ser fácil encontrar información sobre "tee". ( % puede ser más difícil). (3) Bien, te ayudaré un poco.  teees un programa que te permite escribir información en múltiples lugares. Por ejemplo, date | tee codyescribirá la fecha y hora actuales en un archivo llamado cody ... (Cont.)
Scott hace
(Cont.) ... y también a la pantalla del terminal.  date | tee cody > bugsteinescribirá la fecha y hora actuales en un archivo llamado codyy también en un archivo llamado bugstein. - ¿entiendes sudo? Le permite ejecutar un comando con los privilegios de otro usuario (generalmente root). Por ejemplo, ls /rootgeneralmente fallará porque no tiene acceso a  /root. Pero sudo ls /rootfuncionará. - Un desafortunado efecto secundario de la forma en que funciona Unix es que sudo ls /root > /root/codyfallará, porque no tiene acceso y  /root, por lo tanto, no puede escribir /root/cody. … (Continúa)
Scott hace
-2

¿No podría abrir otra terminal y cambiar temporalmente los derechos de acceso del archivo?

Terje Mikal
fuente
1
Esta es una mala idea. Probablemente no sea siempre un gran problema de seguridad, pero podría ser, y no hay soluciones más simples y mejor (como escribir en un archivo temporal, o mejor, la :w !sudo tee % solutionwfaulk publicada
DBR