Si j'exécute sudo un fichier de script Bash, toutes les commandes à l'intérieur du script Bash seront-elles également exécutées en tant que sudo?

30

Je veux écrire un script de post-installation automatisé dans Bash (appelé post-install.sh, par exemple). Le script ajoutera et mettra à jour automatiquement les référentiels, installera et mettra à jour les packages, modifiera les fichiers de configuration, etc.

Maintenant, si j'exécute ce script, par exemple avec sudo post-install.sh, vais-je seulement être invité sudoà entrer un mot de passe, ou devrai-je entrer le sudomot de passe à chaque appel d'une commande dans le script, qui a besoin d'une sudoautorisation? En d'autres termes, les commandes à l'intérieur du script bash "héritent" des autorisations d'exécution, pour ainsi dire?

Et, en effet si elles le font , est - il encore possible que les sudoautorisations seront temporisation (si, par exemple, une commande particulière prend assez longtemps pour dépasser le sudodélai d' attente)? Ou l' sudoentrée du mot de passe initial durera-t-elle pendant toute la durée du script entier?

Dabbler décent
la source
4
Vous pouvez être intéressé par des outils spécialement conçus pour cette tâche. 3 les plus courants sont: Marionnette, chef et ancible.
spuder
@spuder, et pour une architecture à plus grande échelle au niveau de l'entreprise et la sécurité de votre gestion de configuration, vous pouvez utiliser CFEngine 3. (Pas pour les âmes sensibles, ni pour les commandes ponctuelles.)
Wildcard

Réponses:

38

Q # 1: Serai-je invité à entrer un mot de passe sudo une seule fois, ou devrai-je saisir le mot de passe sudo à chaque appel d'une commande dans le script, qui nécessite l'autorisation sudo?

Oui, une fois, pendant la durée de l'exécution de votre script.

REMARQUE: lorsque vous fournissez des informations d'identification à sudo, l'authentification est généralement bonne pendant 5 minutes dans le shell où vous avez tapé le mot de passe. De plus, tout processus enfant exécuté à partir de ce shell ou tout script qui s'exécute dans le shell (votre cas) s'exécutera également au niveau élevé.

Q # 2: existe-t-il toujours une possibilité que les autorisations sudo expirent (si, par exemple, une commande particulière prend suffisamment de temps pour dépasser le délai d'attente sudo)? Ou est-ce que l'entrée initiale du mot de passe sudo durera pendant toute la durée du script entier?

Non, ils ne s'arrêteront pas dans le script. Seulement si vous les tapiez de manière interactive dans le shell où les informations d'identification ont été fournies. Chaque fois qu'il sudoest exécuté dans ce shell, le délai est réinitialisé. Mais dans votre cas, ces informations d'identification resteront aussi longtemps que le script exécutera et exécutera des commandes à partir de celui-ci.

extrait de la page de manuel sudo

Cette limite est spécifique à la politique; le délai d'expiration de l'invite de mot de passe par défaut pour la stratégie de sécurité sudoers est de 5 minutes.

slm
la source
1
La réponse à Q1 est «Non, vous ne serez plus invité».
dannysauer
@dannysauer - relisez son Q. Je dis Oui à l'invite de mot de passe une seule fois!
slm
La question dit "est-ce a ou b", et juste dire "oui" n'a pas précisé si c'était "oui, a" ou "oui, b". J'essaie juste de clarifier les choses pour les futurs lecteurs. : D
dannysauer
@dannysauer - voir la mise à jour.
slm
1
Cette nouvelle question serait la suivante: stackoverflow.com/questions/3522341/… . sudo -u $(logname) <command>devrait marcher.
Gauthier
17

bashet tous ses processus enfants s'exécuteront avec des autorisations de superutilisateur. Vous n'aurez donc pas besoin de ressaisir un mot de passe pour les commandes de votre script bash.

Le sudodélai d'expiration s'applique uniquement à (plus tard) l'appel séparé de sudo. Cela n'affecterait pas votre processus bash en cours d'exécution, ni aucun de ses descendants.

Laurence Gonsalves
la source
3

Ces réponses sont probablement toutes correctes. Cependant, ce n'est pas le moyen généralement utilisé (à ma connaissance) pour créer des scripts bash qui nécessitent des sudoautorisations. Généralement, en haut du script, vous supposez qu'il n'a pas été exécuté avec des sudoautorisations et sudo -vvous appelez plutôt (ce qui invitera l'utilisateur à saisir son mot de passe) pour «configurer» une sudo«session». Vous pouvez soit echoun texte explicatif avant l'invite, ou remplacer sudola propre invite avec le -pcommutateur, pour faire savoir à l'utilisateur que vous avez besoin d' sudoaccéder à certaines commandes.

Ensuite, dans votre script, vous devriez être en mesure d'appeler sudoles commandes qui le nécessitent (et uniquement les commandes qui le nécessitent) sans autre demande de mot de passe. Si vous pensez qu'un certain groupe de commandes qui s'exécutent ensemble dans votre script (indépendamment de leur propre utilisation de sudo) s'étendra au-delà du délai d'attente sudo, vous pouvez appeler sudo -vau milieu afin d'émettre une sorte de `` maintien en vie ' sudo' de la session '.

Si la sudo«session» arrive à expiration pendant le script, l'utilisateur sera simplement invité à saisir son mot de passe la prochaine fois que vous lancerez une commande sudo dans le script.

alexrussell
la source
1
Supposons que l'une des étapes du script consiste à créer un tout nouveau noyau Linux, ce qui peut prendre, par exemple, deux heures. Garder la session vivante pourrait être un défi, comment avez-vous géré cela?
Gauthier
Tu ne peux pas. Mais la prochaine fois que vous appellerez, sudo -vil demandera à nouveau à l'utilisateur son mot de passe. Pas le pire problème à mon avis. Peut-être pour être utile, informer l'utilisateur du mécanisme pourrait être utile.
alexrussell
L'inverse de ceci est d'exiger de l'utilisateur d'appeler le script avec sudo par les autres réponses, puis sudo -u $SUDO_USERd'exécuter toutes les commandes ne nécessitant pas de root sans élévation. Malheureusement, il ajoute plus de code, mais est le seul moyen fiable d'effectuer des tâches racine dans un processus de longue durée.
dragon788
Je suppose que je devrais clarifier, une autre façon de le faire serait d'appeler sudo une fois au début du script pour mettre un fichier temporaire à /etc/sudoers.dutiliser visudo -c -f /tmp/tempsudoerspour s'assurer que le fichier est valide avant de le copier en place, puis supprimer ce fichier une fois terminé (en utilisant un piège à la sortie / erreur pour garantir que l'escalade ne peut pas être abusée). L'implémentation la plus sûre et sécurisée permettrait uniquement à votre utilisateur d'exécuter les commandes spécifiques de votre script avec des arguments spécifiques sans mot de passe NOPASSWDen stockant chaque commande / arguments dans un tableau pour créer le fichier.
dragon788
Un peu tard pour revenir à @Gauthier ici, mais il semblerait que je me trompais quand je dis que vous ne pouvez pas maintenir une sudosession en vie si une tâche donnée prend plus de temps que le délai d'expiration. Je suis tombé sur cette technique l'autre jour dans le repo dotfiles de Mathias Bynens: while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell