¿Cómo ejecuto un comando sudo que necesita ingresar una contraseña en segundo plano?

29

Recientemente he desactivado sudola capacidad de almacenamiento en caché de autenticación para que ahora me solicite una contraseña cada vez.

Y aunque esto es bueno para la seguridad, ha causado un pequeño problema para el que no he podido encontrar una solución, no puedo ejecutar comandos que van en la línea de:

sudo <command> &

En el pasado, habría ejecutado un sudocomando antes, habría almacenado en caché mi contraseña y me habría permitido ejecutar sudocomandos sin solicitud durante los próximos minutos, y por lo tanto me permitiría ejecutar el comando.
Pero cuando lo ejecuto ahora, ya que no hay almacenamiento en caché de antemano y cuando comienza un nuevo hilo inmediatamente y sudoni siquiera me pide una contraseña, no puedo ejecutarlo de esta manera.

Entonces, a menos que lo ejecute sudo -iantes, no puedo ejecutar un comando en este formato que se está volviendo bastante molesto.
Entonces, me preguntaba si hay alguna forma de evitar esto y aún ejecutar programas y comandos de esta manera.

Estoy ejecutando Ubuntu GNOME 15.10 con GNOME 3.18, y específicamente el programa que quiero ejecutar de esta manera es etherapesi eso hace alguna diferencia, pero realmente me gustaría que la solución funcione para todos los programas y comandos.

muru
fuente
3
@kossince &no se puede buscar realmente, estoy cambiando eso a … sudo command in the background.
muru
@muru Si puedes hacer que los motores de búsqueda populares busquen caracteres especiales en su lugar. : P
kos
1
@kos te sorprenderías . : D
muru

Respuestas:

56

En lugar de ejecutar sudoen segundo plano, diga sudoque ejecute el comando en segundo plano. De man sudo:

-b, --background
     Run the given command in the background.  Note that it is not
     possible to use shell job control to manipulate background
     processes started by sudo.  Most interactive commands will
     fail to work properly in background mode.

Por ejemplo:

sudo -b sleep 10

Otra forma sería usar un shell para ejecutar el comando:

sudo sh -c 'sleep 10 &'

Otra opción sería especificar un programa gráfico para obtener la contraseña y enviarla sudoal fondo de todos modos:

-A, --askpass
     Normally, if sudo requires a password, it will read it from
     the user's terminal.  If the -A (askpass) option is
     specified, a (possibly graphical) helper program is executed
     to read the user's password and output the password to the
     standard output.  If the SUDO_ASKPASS environment variable is
     set, it specifies the path to the helper program.  Otherwise,
     if sudo.conf(5) contains a line specifying the askpass
     program, that value will be used.  For example:

         # Path to askpass helper program
         Path askpass /usr/X11R6/bin/ssh-askpass

     If no askpass program is available, sudo will exit with an
     error.

Los programas Askpass generalmente se usan para SSH. Uno de ellos es proporcionado por el ssh-askpass-gnomepaquete, que se instala por defecto, al menos en Ubuntu 15.10.

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &
muru
fuente
11

Si está dispuesto a configurar timestamp_timeoutal menos algo como 0.02(1.2 segundos, diría que es tan seguro como 0) en /etc/sudoers(necesario en su caso, pero con la configuración predeterminada o con timestamp_timeoutcualquier cosa, pero 0uno puede hacer lo siguiente) , puede establecer un alias como este ~/.bashrc, que no requerirá que recuerde hacer algo antes de ejecutar el comando y que le permitirá mantener el control del proceso .:

alias sudo='sudo -v; [ $? ] && sudo'

El truco aquí es el punto y coma, que hará que Bash analice sudo -vprimero y por separado, autenticando al usuario, y limitará la parte de fondo potencial al [ $? ] && sudocomando, que verificará si sudo -vfue exitoso y se ejecutará sudonuevamente (potencialmente en segundo plano) en caso de que lo fuera.

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &
kos
fuente
¿ sudo -vExtiende el almacenamiento en caché de credenciales incluso si el almacenamiento en caché está desactivado? Y, IIRC <para expandir los alias, el espacio debe estar al final del comando, no al principio.
muru
@muru RIght Olvidé que se ha timestamp_timeoutpuesto a 0. Y sí, me equivoqué por completo con la expansión del alias, en realidad el alias no debería expandirse. Gracias.
kos
¿No alias sudo='sudo -v && sudo'sería tan bueno?
G-Man dice 'Restablece a Mónica' el
@ G-Man No, esto funciona porque ;Bash analiza sudo -vprimero y por separado; el uso de &&Bash analizaría tanto como un solo comando y el fondo de forma inmediata.
kos
8

No puedes El &envía el comando al fondo de inmediato. Es decir, se crea una subshell en segundo plano y el comando se ejecuta allí. Cuando ese comando emite un mensaje, como es el caso sudo, el mensaje se muestra en segundo plano y nunca lo ve.

La única forma de evitarlo es devolver el comando al primer plano, proporcionar la contraseña y enviarla de nuevo al fondo. Por ejemplo:

$ sudo command &
$ fg
sudo command
[sudo] password for terdon: 

Ahora, ingrese su contraseña, presione Entery luego presione CtrlZpara enviarla de nuevo al fondo y bgdecirle que continúe ejecutándose.

Un enfoque más simple sería nunca usar &y, en su lugar, enviar trabajos al fondo manualmente con CtrlZy bgdespués de iniciarlos.

Finalmente, es posible que desee considerar configurar el tiempo de espera de la contraseña de sudo en algo como 1 o 2 segundos. Eso aún le daría suficiente seguridad (a menos que esté tratando de protegerse contra Flash) y le permita ejecutar comandos como ese como se esperaba.

terdon
fuente
Flash ha estado robando mi pastel de chocolate, así que ... ; P
2
En esta era de vulnerabilidades de Adobe y malware que infecta el firmware, se justifica desconfiar de Flash.
Damian Yerrick
En una nota al margen, ¿es realmente posible establecer el tiempo de espera en segundos? El valor de man sudoersdice timestamp_timeoutdebe especificar minutos con una posible parte fraccionaria (que por cierto genera un sudoerror si intento especificar uno, no estoy seguro de por qué).
kos
2
@kos parece que sí. 2.5funciona bien aquí (Arch, sudoversión 1.8.15).
terdon