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 sudo
mot de passe à chaque appel d'une commande dans le script, qui a besoin d'une sudo
autorisation? 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 sudo
autorisations seront temporisation (si, par exemple, une commande particulière prend assez longtemps pour dépasser le sudo
délai d' attente)? Ou l' sudo
entrée du mot de passe initial durera-t-elle pendant toute la durée du script entier?
la source
Réponses:
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é.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
extrait de la page de manuel sudosudo
est 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.la source
sudo -u $(logname) <command>
devrait marcher.bash
et 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
sudo
délai d'expiration s'applique uniquement à (plus tard) l'appel séparé desudo
. Cela n'affecterait pas votre processus bash en cours d'exécution, ni aucun de ses descendants.la source
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
sudo
autorisations. Généralement, en haut du script, vous supposez qu'il n'a pas été exécuté avec dessudo
autorisations etsudo -v
vous appelez plutôt (ce qui invitera l'utilisateur à saisir son mot de passe) pour «configurer» unesudo
«session». Vous pouvez soitecho
un texte explicatif avant l'invite, ou remplacersudo
la propre invite avec le-p
commutateur, pour faire savoir à l'utilisateur que vous avez besoin d'sudo
accéder à certaines commandes.Ensuite, dans votre script, vous devriez être en mesure d'appeler
sudo
les 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 desudo
) s'étendra au-delà du délai d'attente sudo, vous pouvez appelersudo -v
au 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.la source
sudo -v
il 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.sudo -u $SUDO_USER
d'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./etc/sudoers.d
utiliservisudo -c -f /tmp/tempsudoers
pour 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 passeNOPASSWD
en stockant chaque commande / arguments dans un tableau pour créer le fichier.sudo
session 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