Comment faire en sorte que sudo n'expire pas pendant l'exécution du script [duplicate]

Dec 22 2020

J'ai parfois besoin d'exécuter un script pendant des heures à la fois, pendant lesquelles certaines commandes ont besoin sudo. Cependant, si je ne vérifie pas et ne ressaisis pas le sudomot de passe régulièrement, j'obtiens l' sudo: timed out reading passworderreur qui casse parfois le tout. Je ne veux pas utiliser sudo myscript.shcar certaines des commandes devraient être exécutées sans sudo .

Je voudrais que le sudomot de passe mis en cache persiste pour le script pendant toute la durée du script sans changer le reste du système ( sudopersistance uniquement pour ce script 1).

Existe-t-il un moyen de faire sudodurer toute la durée du script et uniquement pour le script 1?

Réponses

KamilMaciorowski Dec 22 2020 at 13:53

Possibilité: exécuter le script avec sudo myscript.sh. À l'intérieur du script, exécutez des commandes qui devraient être exécutées sans sudocela:

sudo -u "$SUDO_USER" foo args

(peut-être avec une logique appropriée au cas où le script entier serait exécuté sans sudo). L'utilisateur root n'a pas besoin de s'authentifier pour sudoet, en tant que tel, il n'est pas obligé de saisir un mot de passe pour exécuter une commande en tant qu'autre utilisateur .

Selon la taille du script (combien vous avez besoin de le changer) et ce que vous pensez de tout exécuter avec sudovous pouvez aimer ou ne pas aimer l'idée. Dans votre approche actuelle, le code non élevé est la valeur par défaut, les lignes sudoétant des exceptions explicites. Mon approche inverse les choses. Vous devez être plus prudent lors de la création et du test du script. J'admets que ce n'est pas la meilleure pratique; il résout encore le problème de l'expiration sudo.

Personnellement, j'utiliserais cette solution pour un script long et pas trop compliqué (boucle simple, peu de commandes). J'y réfléchirais à deux fois avant de reconstruire un script compliqué.


Une autre approche consiste à mettre à jour périodiquement les informations d'identification mises en cache en arrière-plan. Par défaut, ce sont par tty (voir tty_tickets). Procédez comme ceci:

sudo -v                              # to enter your password once
while sleep 300; do sudo -v; done &  # adjust the interval if needed
myscript.sh

N'oubliez pas de supprimer le travail d'arrière-plan lorsqu'il n'est plus nécessaire. Le script lui-même peut démarrer un tel travail; alors vous voudrez probablement que des pièges dans le script tuent automatiquement le travail lorsque le script se termine.