web-dev-qa-db-fra.com

N'exécutez que des parties d'un script en tant que Sudo, en entrant le mot de passe une seule fois

J'écris un script (en fait une combinaison de scripts et de makefile) qui installe des dépendances externes: certaines commandes apt-get, d'autres git clonage, construction, installation, ajout d'utilisateurs à des groupes, ...

Certaines opérations de ces scripts nécessitent des autorisations de superutilisateur, d'autres non.

Jusqu'à présent, j'ai exécuté l'intégralité du processus de création avec Sudo, mais il présente certains inconvénients:

  • git je récupère root en tant que propriétaire, ce qui signifie que je ne pourrai plus les modifier sans Sudo ou chown
  • les scripts qui ajoutent des utilisateurs aux groupes ne savent pas quel utilisateur ajouter, car whoami renvoie root

Quel est le meilleur moyen d’exécuter en tant que superutilisateur uniquement les commandes qui le nécessitent? Idéalement, le processus nécessiterait toujours que je saisisse mon mot de passe Sudo, mais une seule fois au tout début du processus d'installation. Il l'oublierait tout à la fin, mais gardez-le tout le temps jusque-là (cela peut prendre plusieurs heures).

Les solutions que j'ai trouvées en ligne incluent:

  • Sudo -v au début du script, mais si je comprends bien, le délai est écoulé. Mon script pourrait être en cours d'exécution pendant quelques heures
  • exécuter le script avec Sudo, mais les commandes qui font pas ont besoin du superutilisateur avec Sudo -u $(logname) <command>. C'est ce que je fais maintenant, mais il me semble que ce devrait être l'inverse.

Idéalement, j'aimerais que mon script:

  1. demander les informations d'identification du superutilisateur
  2. lancer des commandes normales en tant qu'utilisateur connecté
  3. exécutez les commandes Sudo avec les informations d'identification entrées à l'étape 1.
  4. Sudo -k pour fermer la session de superutilisateur
14
Gauthier

Puisque vous avez accès à Sudo, créez un fichier sudoers, puis supprimez-le lorsque le script est terminé:

# grant this user access to the Sudo commands without passwords
# add all required cmds to the CMDS alias
Sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END

# your script goes here
Sudo apt-get install ...
git clone ...
Sudo adduser group2 $USER
Sudo adduser group1 $USER
: ...

# then, remove the Sudo access
Sudo /bin/rm /etc/sudoers.d/$USER
Sudo -k
7
glenn jackman

Une façon, que je ne recommanderais généralement pas, est de lire le mot de passe vous-même et d’utiliser l’option -S de Sudo pour lui transmettre le mot de passe selon les besoins:

#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
Sudo -S apt-get install foo -y <<<"$password"

De man Sudo :

 -S, --stdin
             Write the Prompt to the standard error and read the password
             from the standard input instead of using the terminal device.
             The password must be followed by a newline character.
2
muru