Come posso eseguire un comando sudo che richiede l'inserimento della password in background?


29

Di recente ho disabilitato sudola capacità di memorizzazione nella cache di autenticazione in modo che ora mi richieda una password ogni volta.

E sebbene questo sia utile per la sicurezza, ha causato un leggero problema per il quale non sono stato in grado di trovare una soluzione, non sono in grado di eseguire comandi che seguono le linee di:

sudo <command> &

In passato avrei eseguito un sudocomando prima, avrebbe memorizzato nella cache la mia password e mi avrebbe permesso di eseguire sudocomandi senza prompt per i prossimi minuti, e quindi mi avrebbe permesso di eseguire il comando.
Ma quando lo eseguo ora in quanto non c'è prima la memorizzazione nella cache e poiché avvia immediatamente un nuovo thread e sudonon mi richiede nemmeno una password, non riesco a eseguirlo in questo modo.

Quindi, a meno che non lo esegua sudo -iprima, non sono in grado di eseguire un comando in questo formato che sta diventando piuttosto fastidioso.
Quindi mi chiedevo se c'è un modo per aggirare questo ed eseguire ancora programmi e comandi in questo modo?

Sto eseguendo Ubuntu GNOME 15.10 con GNOME 3.18, e in particolare il programma che voglio eseguire in questo modo è etherapese questo fa alcuna differenza, ma mi piacerebbe davvero che la soluzione funzionasse per tutti i programmi e comandi.


3
@kossince &non è davvero ricercabile, lo sto cambiando in … sudo command in the background.
Muru,

@muru Se invece puoi fare in modo che i motori di ricerca più famosi cerchino caratteri speciali. : P
kos,

1
@kos saresti sorpreso . : D
muru,

Risposte:


56

Invece di eseguire sudoin background, dire sudodi eseguire il comando in background. A partire dalman 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.

Per esempio:

sudo -b sleep 10

Un altro modo sarebbe semplicemente usare una shell per eseguire il comando:

sudo sh -c 'sleep 10 &'

Un'altra opzione sarebbe quella di specificare un programma grafico per ottenere la password e inviarlo sudo comunque in background:

-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.

I programmi Askpass sono in genere utilizzati per SSH. Uno di questi è fornito dal ssh-askpass-gnomepacchetto, che è installato di default, almeno su Ubuntu 15.10.

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

11

Se sei disposto a impostare timestamp_timeoutalmeno qualcosa come 0.02(1,2 secondi, direi sicuro come 0) in /etc/sudoers(necessario nel tuo caso, ma con le impostazioni predefinite o con timestamp_timeoutimpostato su qualsiasi cosa, tranne 0uno, puoi semplicemente fare quanto segue) , potresti impostare un alias come questo ~/.bashrc, che non ti chiederà di ricordare di fare qualcosa prima di eseguire il comando e che ti consentirà di mantenere il controllo del processo .:

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

Il trucco qui è il punto e virgola, che farà analizzare Bash sudo -vprima e separatamente, autenticando l'utente e limitando la potenziale parte di background al [ $? ] && sudocomando, che controllerà se ha sudo -vavuto successo e verrà eseguito di sudonuovo (potenzialmente in background) nel caso lo fosse.

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &

Non sudo -vestendere il caching delle credenziali anche se la cache è disabilitato? E, IIRC <affinché gli alias si espandano, lo spazio dovrebbe essere alla fine del comando, non all'inizio.
Muru,

@muru RIght Ho dimenticato che si è timestamp_timeoutimpostato 0. E sì, ho completamente incasinato la cosa dell'espansione dell'alias, in realtà l'alias non dovrebbe espandersi. Grazie.
kos

Non alias sudo='sudo -v && sudo'sarebbe altrettanto buono?
G-Man dice "Ripristina Monica" il

@ G-Man No, questo funziona perché ;Bash analizza sudo -vprima e separatamente; l'uso di &&Bash analizzerebbe immediatamente sia come comando singolo sia in background.
kos,

8

Non puoi. Il &invia il comando per lo sfondo immediatamente. Cioè, una sottostruttura viene creata in background e il comando viene eseguito lì. Quando quel comando emette un prompt, come nel caso disudo , il prompt viene visualizzato in background e non lo si vede mai.

L'unico modo per aggirare ciò è riportare il comando in primo piano, fornire la password e rispedirla in background. Per esempio:

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

Ora, inserisci la tua password, premi Entere poi premiCtrlZ per rispedirlo in background e bgper dirgli di continuare a correre.

Un approccio più semplice sarebbe quello di non usare mai &e, invece, inviare manualmente i lavori in backgroundCtrlZ e bgdopo averli lanciati.

Infine, potresti considerare di impostare il timeout della password di sudo su qualcosa come 1 o 2 secondi. Ciò ti darebbe comunque abbastanza sicurezza (a meno che tu non stia provando a proteggerti da Flash) e ti consenta di eseguire comandi come quello previsto.


Flash ha rubato la mia torta al cioccolato così ... ; P

2
In questa era di vulnerabilità e malware di Adobe che infetta il firmware, è garantito diffidare di Flash.
Damian Yerrick,


In una nota a margine, è davvero possibile impostare il timeout su secondi? Il valore di man sudoersdice timestamp_timeoutdeve specificare i minuti con una possibile parte frazionaria (che tra l'altro fa un sudoerrore se provo a specificarne uno, non so perché).
kos,

2
@kos sembra sì. 2.5funziona bene qui (Arch, sudoversione 1.8.15).
terdon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.