Comment exécuter une commande sudo nécessitant une entrée de mot de passe en arrière-plan?

29

J'ai récemment désactivé sudola capacité de mise en cache de l'authentification de sorte qu'il me demande maintenant un mot de passe à chaque fois.

Et bien que cela soit bon pour la sécurité, cela a causé un léger problème pour lequel je n'ai pas pu trouver de solution, je ne suis pas en mesure d'exécuter des commandes qui vont dans le sens de:

sudo <command> &

Dans le passé, j'aurais exécuté une sudocommande avant cela, il aurait mis en cache mon mot de passe et m'aurait permis d'exécuter des sudocommandes sans invite pendant les prochaines minutes, et donc cela me permettrait d'exécuter la commande.
Mais lorsque je l'exécute maintenant car il n'y a pas de mise en cache avant et qu'il démarre un nouveau thread immédiatement et sudone me demande même pas de mot de passe, je ne peux pas l'exécuter de cette façon.

Donc, à moins que je ne l'exécute sudo -iavant, je ne peux pas exécuter une commande dans ce format qui devient plutôt ennuyeux.
Je me demandais donc s'il y avait un moyen de contourner ce problème et d'exécuter des programmes et des commandes de cette manière?

J'utilise Ubuntu GNOME 15.10 avec GNOME 3.18, et en particulier le programme que je veux exécuter de cette manière est etherapesi cela fait une différence, mais j'aimerais vraiment que la solution fonctionne pour tous les programmes et commandes.

muru
la source
3
@kossince &n'est pas vraiment consultable, je change cela en … sudo command in the background.
muru
@muru Si vous pouvez faire en sorte que les moteurs de recherche populaires recherchent plutôt des caractères spéciaux. : P
kos
1
@kos vous seriez surpris . : D
muru

Réponses:

56

Au lieu de s'exécuter sudoen arrière-plan, dites sudod'exécuter la commande en arrière-plan. 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.

Par exemple:

sudo -b sleep 10

Une autre façon serait d'utiliser simplement un shell pour exécuter la commande:

sudo sh -c 'sleep 10 &'

Une autre option serait de spécifier un programme graphique pour obtenir le mot de passe et de l'envoyer sudoen arrière-plan quand même:

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

Les programmes Askpass sont généralement utilisés pour SSH. L'un d'eux est fourni par le ssh-askpass-gnomepackage, qui est installé par défaut, au moins sur Ubuntu 15.10.

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

Si vous êtes prêt à définir timestamp_timeoutau moins quelque chose comme 0.02(1,2 secondes, je dirais tout aussi sûr que 0) dans /etc/sudoers(nécessaire dans votre cas, mais avec les paramètres par défaut ou avec timestamp_timeoutn'importe quoi mais 0on peut simplement faire ce qui suit) , vous pouvez définir un alias comme celui-ci dans ~/.bashrc, qui ne vous obligera pas à vous souvenir de faire quelque chose avant d'exécuter la commande et qui vous permettra de garder le contrôle du processus .:

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

L'astuce ici est le point-virgule, qui fera analyser Bash en sudo -vpremier et séparément, authentifiant l'utilisateur, et limitera la partie d'arrière-plan potentielle à la [ $? ] && sudocommande, qui vérifiera si elle sudo -va réussi et s'exécutera à sudonouveau (éventuellement en arrière-plan) au cas où elle le serait.

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &
kos
la source
sudo -vN'étendre la mise en cache des titres de compétences , même si la mise en cache est désactivé? Et, IIRC <pour que les alias se développent, l'espace doit être à la fin de la commande, pas au début.
muru
@muru RIght J'ai oublié qu'il s'est timestamp_timeoutmis à 0. Et oui, j'ai complètement gâché avec la chose d'extension d'alias, en fait l'alias ne devrait pas s'étendre. Merci.
kos
Ce ne serait pas alias sudo='sudo -v && sudo'aussi bon?
G-Man dit `` Réintègre Monica ''
@ G-Man Non, cela fonctionne parce que ;Bash analyse d' sudo -vabord et séparément; l'utilisation de &&Bash analyserait à la fois une seule commande et l'arrière-plan immédiatement.
kos
8

Tu ne peux pas. L' &envoie la commande à l'arrière-plan immédiatement. Autrement dit, un sous-shell est créé en arrière-plan et la commande y est exécutée. Lorsque cette commande émet une invite, comme c'est le cas sudo, l'invite s'affiche en arrière-plan et vous ne la voyez jamais.

La seule solution consiste à ramener la commande au premier plan, à fournir le mot de passe et à le renvoyer à l'arrière-plan. Par exemple:

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

Maintenant, entrez votre mot de passe, appuyez sur Enterpuis sur CtrlZpour le renvoyer à l'arrière-plan et bglui dire de continuer à fonctionner.

Une approche plus simple consisterait à ne jamais utiliser &et, au lieu de cela, à envoyer des travaux en arrière-plan manuellement avec CtrlZet bgaprès leur lancement.

Enfin, vous voudrez peut-être envisager de définir le délai d'expiration du mot de passe de sudo sur quelque chose comme 1 ou 2 secondes. Cela vous donnerait quand même suffisamment de sécurité (sauf si vous essayez de vous prémunir contre le Flash) et vous permettrait d'exécuter des commandes comme celle-ci comme prévu.

terdon
la source
Le Flash a volé mon gâteau au chocolat alors ... ; P
2
À l'ère des vulnérabilités Adobe et des logiciels malveillants qui infectent le micrologiciel, il faut se méfier du Flash.
Damian Yerrick
Soit dit en passant, est-il réellement possible de régler le délai d'attente en secondes? man sudoersdit que timestamp_timeoutla valeur doit spécifier les minutes avec une partie fractionnaire possible (ce qui, soit dit en passant, fait une sudoerreur si j'essaye d'en spécifier une, je ne sais pas pourquoi).
kos
2
@kos sonne oui. 2.5fonctionne très bien ici (Arch, sudoversion 1.8.15).
terdon