web-dev-qa-db-fra.com

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

J'ai récemment désactivé possibilité de mise en cache de l'authentification de Sudo pour qu'il 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, il avait mis mon mot de passe en cache et m'autorisait à exécuter les commandes Sudo sans invite pendant quelques minutes, ce qui me permettait également d'exécuter la commande.
Mais quand je le lance maintenant car il n’ya pas de cache avant 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, à moins que je ne lance Sudo -i avant cela, je ne peux pas exécuter de commande dans ce format qui devient plutôt gênant.
Je me demandais s’il existait un moyen de contourner le problème et de toujours exécuter des programmes et des commandes de cette manière?

J'utilise Ubuntu GNOME 15.10 avec GNOME 3.18, et 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.

29
user364819

Au lieu d'exécuter Sudoen arrière-plan, indiquez Sudopour 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 solution consiste simplement à 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 de toute façon 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 paquetage ssh-askpass-gnome, installé par défaut au moins sur Ubuntu 15.10, en est un exemple.

Sudo_ASKPASS=/usr/bin/ssh-askpass Sudo -A sleep 10 &
55
muru

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 les paramètres par défaut ou avec timestamp_timeout, définissez une valeur autre que 0 peut simplement faire ce qui suit), vous pouvez définir un alias comme celui-ci dans ~/.bashrc, qui ne vous demandera pas 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 obligera Bash à analyser Sudo -v d’abord et séparément, à 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 exécutera à nouveau Sudo (éventuellement l’éclairant) c'était.

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

Tu ne peux pas. Le & envoie immédiatement la commande à l'arrière-plan. 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 dans le cas de Sudoname__, 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 Enter et ensuite frappé CtrlZ pour le renvoyer à l’arrière-plan et bgpour lui dire de continuer à fonctionner.

Une approche plus simple consisterait à ne jamais utiliser & et à envoyer les tâches manuellement à l’arrière-plan avec CtrlZ et bgaprè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.

8
terdon