¿Es posible guardar como sudo desde nano después de haber olvidado ejecutar como sudo?

50

La mayoría de las veces edito un archivo con nano, intento guardarlo y obtengo un error de permiso porque olvidé ejecutarlo como sudo. ¿Hay alguna forma rápida de convertirme en sudo sin tener que volver a abrir y volver a editar el archivo?

Kit Sunde
fuente
se ha sugerido fusionarse con esta pregunta . Básicamente el mismo problema, pero vim. Estoy considerando la fusión ... aunque también estoy considerando el hecho de que las instrucciones específicas de vim no funcionarán nano.
xenoterracide
1
@xenaterracide: creo que la pregunta vim es un caso especial de este, ya que en realidad tiene una solución y parece que el caso general no tiene ninguna. Sin embargo, tampoco estoy seguro, depende de ti. :)
Kit Sunde
Puede realizar una asignación en su .vimrc para llamar fácilmente a la función sudo tee: <pre> <code> "Permite escribir en archivos con privilegios de raíz cmap w !! w! Sudo tee%> / dev / null </pre> < / code>
jasonwryan
@xenoterracide: la respuesta de Caleb sobre Nano es útil, así que creo que deberíamos mantener esta solo sobre Nano.
Mikel
1
@mikel Decidí que la fusión no es válida. nanono lo es vim... y no nanose vimhan presentado soluciones similares a las de ellos.
xenoterracide

Respuestas:

39

No, no puede otorgarle a un programa en ejecución permisos que no tiene cuando se inicia, ese sería el agujero de seguridad conocido como 'escalada de privilegios' '.

Dos cosas que puedes hacer:

  1. Guarde en un archivo temporal en / tmp o donde sea, cierre el editor, luego descargue el contenido del archivo temporal en el archivo que estaba editando. sudo cp $TMPFILE $FILE. Tenga en cuenta que no se recomienda su uso mvpara esto debido al cambio en la propiedad del archivo y los permisos que puede causar, solo desea reemplazar el contenido del archivo, no el marcador de posición del archivo.
  2. Ponga en segundo plano el editor con Ctrl+ z, cambie la propiedad o los permisos del archivo para que pueda escribir en él, luego use fgpara volver al editor y guardar. ¡No olvides arreglar los permisos!

¹ Algunos editores realmente pueden hacer esto iniciando un nuevo proceso con diferentes permisos y pasando los datos a ese proceso para guardarlos. Consulte, por ejemplo, esta pregunta relacionada para otras soluciones en editores avanzados que permiten escribir el búfer de archivo en una tubería de proceso. Nano no tiene la capacidad de iniciar un nuevo proceso o pasar datos a otros procesos, por lo que queda fuera de esta fiesta.

Caleb
fuente
Excelente. Gracias Caleb Me encontré con este problema hace unos 30 minutos. :)
boehj
2
@Caleb Puede usar el comando tee desde vim para hacer lo que describe::w !sudo tee
@hellojesus Truco brillante. Si te interesa escribir eso como respuesta, puedo eliminarlo del mío. Me imagino que otras personas que no son usuarios de nano entran en esta situación y pueden encontrarse aquí.
Caleb
44
Se supone que esta pregunta es sobre nano. Si comenzamos a incluir respuestas sobre Vim aquí, ¿cuál es el punto de esta pregunta? Ya tenemos Rooting Becoming desde dentro de Vim para Vim.
Mikel
2
Guardar en un archivo temporal en / tmp - ¿Cómo guardar en un archivo temporal dentro de nano?
Anand Rockzz
7

Acabo de intentarlo nano, y lo que encontré más sorprendente es que ni siquiera te advierte que el archivo es de solo lectura cuando comienzas a tratar de editarlo. ( ACTUALIZACIÓN: aparentemente nano 2.2 advierte; 2.0 no. )

Aquí hay un script (básico) que hace eso.

Comprueba si puede editar el archivo y, si no puede, ejecuta "nano" como root en su lugar.

/ usr / local / bin / edit (o ~ / bin / edit )

sudo=                       # empty is false, non-empty is true
editor=nano                 # XXX check $EDITOR and $VISUAL

if test -e "$1" && test ! -w "$1"; then
    if test -t 0 && test -t 2; then
        printf "%s is not writable.  Edit with sudo? [y/n] " "$1" 1>&2
        read -n 1
        case $REPLY in
        y|Y)
            sudo=true
            ;;
        n|N)
            sudo=
            ;;
        *)
            printf "\nExpected y or n.  Exiting.\n" 1>&2
            exit 1
            ;;
        esac
    else
        printf "%s is not writable.  Fix the permissions or run \"view\" instead." "$1" 1>&2
        exit 1
    fi
fi

${sudo:+sudo} "$editor" "$1"

Y un comando que llamé viewpara que pueda evitar el aviso si sabe que no va a realizar ningún cambio.

/ usr / local / bin / view (o ~ / bin / view )

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Ya hay un programa llamado viewque forma parte de Vi / Vim, así que siéntete libre de sugerir un nombre mejor.
(Pero creo que una implementación completa de este programa haría que Vi sea viewredundante).


Versiones completas

Mikel
fuente
1
Realmente te advierte. La pregunta sería entonces qué versión está utilizando. Además, en los sistemas basados ​​en Debian, el sistema de alternativas es más adecuado para lo que sugiere.
0xC0000022L
2
Para su referencia: [ Read ... lines (Warning: No write permission) ]es lo que aparece justo encima de las dos líneas de ayuda para los accesos directos (parte inferior de la pantalla). La versión nano es 2.2.4.
0xC0000022L
Ah, no advierte en nano 2.0, que es con lo que estaba probando.
Mikel
genial resolvimos eso :)
0xC0000022L