A menudo, mientras edito archivos de configuración, abriré uno con vi y luego, cuando vaya a guardarlo, me daré cuenta de que no escribí
sudo vi filename
¿Hay alguna forma de otorgar privilegios de vi sudo para guardar el archivo? Parece recordar haber visto algo sobre esto mientras buscaba algunas cosas sobre vi hace un tiempo, pero ahora no puedo encontrarlo.
Respuestas:
%
se reemplaza con el nombre del archivo actual, por lo que puede usar:(
vim
detectará que el archivo ha cambiado y le preguntará si desea que se vuelva a cargar. Diga sí eligiendo en[L]
lugar de Aceptar).Como acceso directo, puede definir su propio comando. Ponga lo siguiente en su
.vimrc
:Con lo anterior, puede escribir
:W<Enter>
para guardar el archivo. Desde que escribí esto, he encontrado una mejor manera (en mi opinión) de hacer esto:De esta manera, puede escribir
:w!!
y se expandirá a la línea de comando completa, dejando el cursor al final, para que pueda reemplazarlo%
con un nombre de archivo propio, si lo desea.fuente
sudo: 1 incorrect password attempt
/etc/sudoers
archivo, agregaryour_username ALL=(ALL) ALL
debajo de la línearoot ALL=(ALL) ALL
, salir y guardar.visudo
.En general, no puede cambiar la identificación de usuario efectiva del proceso vi, pero puede hacer esto:
fuente
:w !sudo tee % >/dev/null
o:w !sudo dd of=%
evite que el contenido del archivo se repita mientras se guarda el archivo.tee
y vi que es un comando de tubería Unix, e!
inserta un comando de shell. ¿La:w
escritura es estándar, que se canalizatee
?Advertencias comunes
El método más común para solucionar el problema del archivo de solo lectura es abrir una canalización al archivo actual como superusuario utilizando una implementación de
sudo tee
. Sin embargo, todas las soluciones más populares que he encontrado en Internet tienen una combinación de varias advertencias potenciales:Soluciones
Para solucionar todos estos problemas, puede usar el siguiente comando:
Estos se pueden acortar, respetuosamente:
Explicación
:
comienza el comando; necesitará escribir este carácter en modo normal para comenzar a ingresar un comando. Debe omitirse en los scripts.sil[ent]
suprime la salida del comando. En este caso, queremos detener elPress any key to continue
indicador similar que aparece después de ejecutar el:!
comando.exec[ute]
ejecuta una cadena como un comando. No podemos simplemente ejecutarlo:write
porque no procesará la llamada de función necesaria.!
representa el:!
comando: el único comando que:write
acepta. Normalmente,:write
acepta una ruta de archivo en la que escribir.:!
por sí solo ejecuta un comando en un shell (por ejemplo, usandobash -c
). Con:write
, ejecutará el comando en el shell y luego escribirá todo el archivostdin
.sudo
debería ser obvio, ya que es por eso que estás aquí. Ejecute el comando como superusuario. Hay mucha información en la red sobre cómo funciona eso.tee
tuberíasstdin
al archivo dado.:write
escribirá enstdin
, luego el superusuariotee
recibirá el contenido del archivo y escribirá el archivo. No creará un nuevo archivo, simplemente sobrescribirá el contenido, de modo que se conservarán los modos y atributos del archivo.shellescape()
escapa caracteres especiales en la ruta de archivo dada según corresponda para el shell actual. Con solo un parámetro, normalmente solo encerraría la ruta entre comillas según sea necesario. Como estamos enviando a una línea de comando de shell completa, queremos pasar un valor distinto de cero como el segundo argumento para permitir el escape de barra invertida de otros caracteres especiales que de otro modo podrían disparar el shell.@%
lee el contenido del%
registro, que contiene el nombre del archivo del búfer actual. No es necesariamente una ruta absoluta, así que asegúrese de no haber cambiado el directorio actual. En algunas soluciones, verá el símbolo comercial en omitido. Dependiendo de la ubicación,%
es una expresión válida y tiene el mismo efecto que leer el%
registro. Sin embargo, anidado dentro de otra expresión, el acceso directo generalmente no está permitido: como en este caso.>NUL
y>/dev/null
redirigirstdout
al dispositivo nulo de la plataforma. Aunque hemos silenciado el comando, no queremos que toda la sobrecarga asociada con la tuberíastdin
vuelva a vim, lo mejor es volcarlo lo antes posible.NUL
es el dispositivo nulo en DOS, MS-DOS y Windows, no es un archivo válido. A partir de las redirecciones de Windows 8 a NUL, no se genera un archivo llamado NUL. Intente crear un archivo en su escritorio llamado NUL, con o sin una extensión de archivo: no podrá hacerlo. (Hay varios otros nombres de dispositivos en Windows que vale la pena conocer).~ / .vimrc
Dependiente de la plataforma
Por supuesto, todavía no quieres memorizarlos y escribirlos cada vez. Es mucho más fácil asignar el comando apropiado a un comando de usuario más simple. Para hacer esto en POSIX, puede agregar la siguiente línea a su
~/.vimrc
archivo, creándola si aún no existe:Esto le permitirá escribir el comando: W (distingue entre mayúsculas y minúsculas) para escribir el archivo actual con permisos de superusuario, mucho más fácil.
Plataforma independiente
Utilizo un
~/.vimrc
archivo independiente de la plataforma que se sincroniza entre computadoras, así que agregué la funcionalidad multiplataforma a la mía. Aquí hay una~/.vimrc
con solo la configuración relevante:fuente
sudo
exista pero no/dev/null
, por lo que necesitaría ser más sofisticado si quisiera un verdadero soporte multiplataforma. Es más una introducción: algo para pensar. :)Si está utilizando Vim , hay un script disponible llamado sudo.vim . Si encuentra que ha abierto un archivo que necesita acceso raíz para leer, escriba
Vim reemplaza el% con el nombre del archivo actual esudo:
indica al script sudo.vim que se haga cargo de la lectura y escritura.fuente
El consejo de Ryan es generalmente bueno, sin embargo, si sigue el paso 3, no mueva el archivo temporal; Tendrá la propiedad y los permisos incorrectos. En cambio,
sudoedit
el archivo correcto y leer en el contenido (utilizando:r
o similar) del archivo temporal.Si sigue el paso 2, use
:w!
para forzar la escritura del archivo.fuente
Cuando entra en modo de inserción en un archivo que necesita acceso sudo para editar, recibe un mensaje de estado que dice
Si extraño eso, generalmente lo hago
..luego..
..o..
Probablemente haya una forma menos indirecta de hacerlo, pero funciona.
fuente
Un rápido Google parece dar este consejo:
http://ubuntuforums.org/showthread.php?t=782136
fuente
Aquí hay otro que ha aparecido desde que se respondió esta pregunta, un complemento llamado SudoEdit que proporciona las funciones SudoRead y SudoWrite, que por defecto tratarán de usar sudo primero y su si falla: http://www.vim.org/scripts/ script.php? script_id = 2709
fuente
Tengo esto en mi ~ / .bashrc:
Ahora, cada vez que necesito editar un archivo de configuración, lo abro con svim.
fuente
sudoedit
debe preferir el comando ya que no requiere ejecutar vim como root.Un truco rápido que puede considerar es hacer un chmod en el archivo que está editando, guardar con vim y luego volver a chmod a lo que era originalmente el archivo.
Por supuesto, no recomiendo este enfoque en un sistema donde le preocupa la seguridad, ya que durante unos segundos cualquiera puede leer / cambiar el archivo sin que se dé cuenta.
fuente