Aquí podría ser tu PUBLICIDAD


Obteniendo permisos de root en un archivo dentro de vi?

votos
227

A menudo, al editar archivos de configuración, abriré uno con vi y luego, cuando vaya a guardarlo, me doy cuenta de que no escribí

sudo vi filename

¿Hay alguna forma de otorgar privilegios de vi sudo para guardar el archivo? Me parece recordar haber visto algo sobre esto mientras buscaba algunas cosas sobre vi hace un rato, pero ahora no puedo encontrarlo.

Publicado el 04/08/2008 a las 04:34
fuente por usuario Paul Wicks
En otros idiomas...        العربية       

11 respuestas

votos
276

% se reemplaza por el nombre del archivo actual, por lo que puede usar:

:w !sudo tee %

( vimdetectará que el archivo ha sido cambiado y le preguntará si desea que se vuelva a cargar).

Como atajo, puede definir su propio comando. Pon lo siguiente en tu .vimrc:

command W w !sudo tee % >/dev/null

Con lo anterior, puede escribir :W<Enter>para guardar el archivo. Desde que escribí esto, he encontrado una manera más agradable (en mi opinión) para hacer esto:

cmap w!! w !sudo tee >/dev/null %

De esta forma puede escribir :w!!y se expandirá a la línea de comando completa, dejando el cursor al final, para que pueda reemplazar el %archivo con su propio nombre, si lo desea.

Respondida el 31/08/2008 a las 08:23
fuente por usuario hop


Aquí podría ser tu PUBLICIDAD


votos
29

En general, no puede cambiar la identificación de usuario efectiva del proceso vi, pero puede hacer esto:

:w !sudo tee myfile
Respondida el 04/08/2008 a las 07:52
fuente por usuario Mark Harrison

votos
13

Advertencias comunes

El método más común de conseguir alrededor del problema de archivo de sólo lectura es abrir una tubería de archivo actual como el super-usuario usando una implementación de sudo tee. Sin embargo, todas las soluciones más populares que he encontrado por Internet tienen una combinación de varias advertencias potenciales:

  • Todo el archivo se escribe en el terminal, así como el archivo. Esto puede ser lento para archivos de gran tamaño, especialmente a través de conexiones de red lentas.
  • El archivo pierde sus modos y atributos similares.
  • Las rutas de archivos con caracteres o espacios inusuales que no podrían ser manejados correctamente.

soluciones

Para conseguir alrededor de todos estos temas, puede utilizar el siguiente comando:

" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Estos se pueden acortar, con respeto:

:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Explicación

:comienza el comando; usted tendrá que escribir este personaje en el modo normal para comenzar a introducir un comando. Debe ser omitido en scripts.

sil[ent]suprime la salida del comando. En este caso, queremos detener la Press any key to continuepronta -como que aparece después de ejecutar el :!comando.

exec[ute]ejecuta una cadena como un comando. No podemos simplemente correr :writeporque no va a procesar la llamada función necesaria.

!representa el :!comando: el único comando que :writeacepta. Normalmente, :writeacepta una ruta de archivo para el que escribir. :!en su propio ejecuta un comando en una carcasa (por ejemplo, usando bash -c). Con :write, se ejecutará el comando de la cáscara y, a continuación, escribir todo el archivo a stdin.

sudodebería ser obvio, ya que es por eso que estás aquí. Ejecutar el comando como superusuario. Hay un montón de información en torno a la 'red acerca de cómo funciona.

teetuberías stdinpara el archivo dado. :writeescribirá a stdin, entonces el super-usuario teerecibirá el contenido del archivo y escribir el archivo. No va a crear un nuevo archivo - simplemente sobrescribir el contenido - por lo que será conservado modos de archivo y atributos.

shellescape()Escapa caracteres especiales de la ruta del archivo dado como apropiado para el shell actual. Con un solo parámetro, sería normalmente acaba de escribir la ruta entre comillas como sea necesario. Ya que estamos enviando a una línea de comandos shell completo, vamos a querer 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ía tropezar la cáscara.

@%lee el contenido del %registro, que contiene el nombre del archivo del búfer en uso. No es necesariamente una ruta absoluta, por lo que asegúrese de que usted no ha cambiado el directorio actual. En algunas soluciones, verá el símbolo comercial en omitirse. Dependiendo de la ubicación, %es una expresión válida, y tiene el mismo efecto que la lectura del %registro. Anidada dentro de otra expresión en el acceso directo es generalmente anulado, sin embargo: como en este caso.

>NULy >/dev/nullredirigir stdoutal dispositivo nulo de la plataforma. A pesar de que hemos hecho callar a los comandos, no queremos que toda la sobrecarga asociada con la tubería stdinde vuelta a vim - la mejor manera de deshacerse de él tan pronto como sea posible. NULes el dispositivo nulo en DOS, MS-DOS y Windows, no es un archivo válido. A partir del 8 de Windows redirecciones a NUL no resultan en un archivo llamado NUL siendo escrito. Trate de crear un archivo en el escritorio llamado NUL, con o sin una extensión de archivo: usted no será capaz de hacerlo. (Hay varios otros nombres de dispositivos de Windows que podrían ser vale la pena conocer.)

~ / .vimrc

Dependiente de la plataforma

Por supuesto, usted todavía no desea memorizar esos y escribirlos cada vez. Es mucho más fácil para asignar el comando correspondiente a un comando simple usuario. Para hacer esto en POSIX, se podría añadir la siguiente línea a su ~/.vimrcarchivo, creándolo si no existe:

command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

Esto le permitirá escribir el: W (mayúsculas y minúsculas) comando para escribir el archivo actual con permisos de superusuario - mucho más fácil.

Plataforma independiente

Yo uso una plataforma independiente ~/.vimrcde archivos que sincroniza en todos los equipos, por lo que añade funcionalidad multi-plataforma para la mía. Aquí hay un ~/.vimrcsólo con los ajustes pertinentes:

#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
"   ts:     Actual tab character stops.
"   sw:     Indentation commands shift by this much.
"   sr:     Round existing indentation when using shift commands.
"   sts:    Virtual tab stops while using tab key.
"   fdm:    Folds are manually defined in file syntax.
"   ff:     Line endings should always be <NL> (line feed #09).
"   fenc:   Should always be UTF-8; #! must be first bytes, so no BOM.


" General Commands: User Ex commands. {{{1
    command W call WriteAsSuperUser(@%)         " Write file as super-user.


" Helper Functions: Used by user Ex commands. {{{1
    function GetNullDevice() " Gets the path to the null device. {{{2
        if filewritable('/dev/null')
            return '/dev/null'
        else
            return 'NUL'
        endif
    endfunction

    function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
        exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
    endfunction


" }}}1
" EOF
Respondida el 13/10/2012 a las 07:54
fuente por usuario Zenexer

votos
10

Si está utilizando Vim , hay un script disponible llamado sudo.vim . Si encuentra que ha abierto un archivo que necesita acceso de root para leer, escriba

: e sudo:%
Vim reemplaza el% con el nombre del archivo actual e sudo:instruye al script sudo.vim para que se encargue de leer y escribir.

Respondida el 24/09/2008 a las 05:12
fuente por usuario ephemient

votos
7

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, sudoeditel archivo correcto y leer en los contenidos (usando :ro similares) del archivo temporal.

Si sigue el paso 2, use :w!para forzar que se escriba el archivo.

Respondida el 04/08/2008 a las 05:04
fuente por usuario Chris Jester-Young

votos
3

Cuando ingresa al modo de inserción en un archivo que necesita sudo access para editar, aparece un mensaje de estado que dice

-- INSERT IGNORE  -- W10: Warning: Changing a readonly file

Si extraño eso, generalmente lo hago

:w ~/edited_blah.tmp
:q

..entonces..

sudo "cat edited_blah.tmp > /etc/blah"

..o..

sudo mv edited_blah.tmp /etc/blah

Probablemente haya una manera menos indirecta de hacerlo, pero funciona.

Respondida el 12/08/2008 a las 07:37
fuente por usuario dbr

votos
1

Aquí hay otro que ha aparecido desde que se respondió a esta pregunta, un plugin llamado SudoEdit que proporciona funciones SudoRead y SudoWrite, que de manera predeterminada tratar de usar sudo primero y su si eso falla: http://www.vim.org/scripts/ script.php? SCRIPT_ID = 2709

Respondida el 29/01/2010 a las 06:21
fuente por usuario James Snyder

votos
1

Un Google rápido parece dar este consejo:

  1. No intente editar si es de solo lectura.
  2. Es posible que pueda cambiar los permisos en el archivo. (Ya sea que te permita ahorrar o no depende de la experimentación).
  3. Si todavía editó de todos modos, guárdelo en un archivo temporal y luego muévalo.

http://ubuntuforums.org/showthread.php?t=782136

Respondida el 04/08/2008 a las 04:39
fuente por usuario Ryan Fox

votos
0

Tengo esto en mi ~ / .bashrc:

alias svim='sudo vim'

Ahora, cada vez que necesito editar un archivo de configuración, simplemente lo abro con svim.

Respondida el 19/03/2009 a las 01:51
fuente por usuario pisswillis

votos
-2

Un truco rápido que puedes considerar es hacer un chmod en el archivo que estás editando, guardarlo con vim y luego regresar al archivo original.

ls -l test.file (to see the permissions of the file)
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)

Por supuesto, no recomiendo este enfoque en un sistema en el que le preocupa la seguridad, ya que durante unos segundos cualquiera puede leer / cambiar el archivo sin que se dé cuenta.

Respondida el 05/08/2008 a las 11:20
fuente por usuario num1

votos
-7

utilizar gksudo en lugar de sudo para GVim es decir,

cmap w!! w !gksudo tee >/dev/null %
Respondida el 30/11/2010 a las 07:33
fuente por usuario ryfm


Aquí podría ser tu PUBLICIDAD