Comment exécuter une commande sudo nécessitant la saisie d'un mot de passe en arrière-plan?

28

J'ai récemment désactivé la capacité de mise en cache de l'authentification de sudo pour qu'elle me demande maintenant un mot de passe à chaque fois. .

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

sudo <command> &

Auparavant, j'exécutais une commande sudo auparavant, elle aurait mis mon mot de passe en cache et m'avait permis d'exécuter des commandes sudo sans invite pendant quelques minutes, ce qui me permettait également d'exécuter le commander.
Mais quand je le lance maintenant, car il n'y a pas de cache avant la main et comme il commence un nouveau fil immédiatement et que sudo ne me demande même pas un mot de passe, je ne peux pas le lancer de cette façon.

Donc, sauf si je lance sudo -i auparavant, je ne parviens pas à exécuter une commande dans ce format qui devient plutôt gênante.
Je me demandais donc s’il existait 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 plus précisément le programme que je veux exécuter de cette façon est etherape si cela fait une différence, mais j'aimerais vraiment que la solution fonctionne pour tous les programmes et toutes les commandes.

    
posée muru 26.03.2016 - 15:27
la source

3 réponses

54

Au lieu d'exécuter sudo en arrière-plan, demandez à sudo d'exécuter la commande en arrière-plan. 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

Vous pouvez également utiliser 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 d’envoyer sudo à l’arrière-plan:

-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. Le paquet ssh-askpass-gnome , installé par défaut au moins sur Ubuntu 15.10, en fournit un exemple.

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &
    
réponse donnée muru 26.03.2016 - 15:33
la source
11

Si vous souhaitez définir timestamp_timeout sur au moins quelque chose comme 0.02 (1,2 seconde, je dirais aussi sûr que 0 ) dans /etc/sudoers (nécessaire dans votre cas, mais avec le paramètres par défaut ou avec timestamp_timeout défini sur quoi que ce soit sauf 0 , vous pouvez simplement procéder comme suit), vous pouvez définir un alias comme celui-ci dans ~/.bashrc , ce qui ne vous obligera pas à faire quelque chose avant d'exécuter la commande et qui vous permettront de garder le contrôle du processus.:

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

Le truc ici est le point-virgule, qui obligera Bash à analyser séparément sudo -v , authentifier l'utilisateur et limiter la partie d'arrière-plan potentielle à la commande [ $? ] && sudo , qui vérifiera si sudo -v a réussi et est exécutée. sudo à nouveau (le masquant éventuellement) au cas où ce serait le cas.

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &
    
réponse donnée kos 26.03.2016 - 16:02
la source
8

Vous ne pouvez pas. Le & envoie la commande à l'arrière-plan immédiatement. En d’autres termes, 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 de 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 Entrée , puis appuyez sur Ctrl Z pour le renvoyer à l'arrière-plan et sur bg pour le signaler. pour continuer à courir.

Une approche plus simple consisterait à ne jamais utiliser & et à envoyer les tâches en arrière-plan manuellement à l'aide de Ctrl Z et de bg après leur lancement.

Enfin, vous pouvez envisager de définir le délai d’expiration du mot de passe de sudo sur 1 ou 2 secondes. Cela vous donnerait quand même assez de sécurité (à moins que vous essayiez de vous protéger contre le Flash) et vous permettrait d'exécuter des commandes comme celle-là comme prévu.

    
réponse donnée terdon 26.03.2016 - 15:35
la source

Lire d'autres questions sur les étiquettes