15 votes

Meilleures pratiques pour utiliser sudo dans un script bash

J'ai un script bash long et de longue durée où une poignée de commandes doivent être exécutées en tant que root alors que la majorité des commandes doivent être exécutées en tant qu'utilisateur régulier avant sudo, car cela perturberait la propriété des fichiers, etc.

J'ai trouvé quelques méthodes, mais chacune d'entre elles a des problèmes

Méthode 1 : Utiliser sudo à l'intérieur du fichier

#!/bin/bash
sudo echo "Je dois être exécuté par root"
touch needsToBeOwnedByUser1
echo "doit être exécuté par l'utilisateur"
sleep 1000
sudo echo "Je dois, encore une fois, être exécuté par root"

Cela semble bien, vu la manière dont le code est écrit. sudo est placé avant les quelques instructions qui doivent réellement être exécutées en tant que root, mais si le délai entre chaque appel à sudo est trop long, sudo redemande un mot de passe. De plus, si la première exécution de sudo échoue, par exemple en raison d'un mot de passe incorrect, le reste du script est quand même exécuté.

Méthode 2 : utiliser sudo pour appeler le fichier et ensuite revenir à l'utilisateur d'origine lorsque nécessaire

#!/bin/bash
echo "Je dois être exécuté par root"
su nom_utilisateur -c 'touch needsToBeOwnedByUser1'
su nom_utilisateur -c 'echo "doit être exécuté par l'utilisateur"'
su nom_utilisateur -c 'sleep 1000'
echo "Je dois, encore une fois, être exécuté par root"

Cela est également contraignant, car je dois ajouter su nom_utilisateur -c devant presque chaque ligne. Trouver le nom d'utilisateur d'origine après sudo est possible, mais fastidieux.

Y a-t-il une meilleure façon de faire ?

Édition : J'ai posté ici de petits scripts non sens pour montrer de quoi je parle. Dans le script réel, j'ai quelques lignes qui ont besoin de sudo (démarrer et arrêter des services), quelques lignes où cela ne pose pas de problème s'il y a sudo et un bon nombre de lignes qui doivent vraiment être exécutées sans sudo.

6voto

wjandrea Points 13147

En ce qui concerne la méthode 2, il est plus facile d'utiliser une fonction. Par exemple:

#!/bin/bash

func(){
    echo "Nom d'utilisateur: $USER"
    echo "    EUID: $EUID"
}

export -f func

func
su "$SUDO_USER" -c 'func'

$SUDO_USER est le nom d'utilisateur du superutilisateur. Vous pourriez aussi utiliser $(logname) à sa place.

Exécution sur mon ordinateur:

$ sudo bash test.sh
[sudo] Mot de passe de wja : 
Nom d'utilisateur: root
    EUID: 0
Nom d'utilisateur: wja
    EUID: 1000

4voto

waltinator Points 32821

En lisant man sudoers, on voit:

 PASSWD et NOPASSWD

   Par défaut, sudo exige qu'un utilisateur s'authentifie
   avant d'exécuter une commande. Ce comportement peut être modifié via la
   balise NOPASSWD. Comme une spécification Runas, la balise NOPASSWD définit une valeur par défaut
   pour les commandes qui suivent dans la liste Cmnd_Spec. De même, la
   balise PASSWD peut être utilisée pour inverser les choses. Par exemple:

   ray     rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

   permettrait à l'utilisateur ray d'exécuter /bin/kill, /bin/ls et /usr/bin/lprm
   en tant que root sur la machine rushmore sans s'authentifier.

Ainsi, vous pourriez autoriser regular sur l'hôte machine1 à exécuter command1 et command2 en tant que root, sans authentification par mot de passe avec:

reguser machine1 root = NOPASSWD: /usr/local/command1, /usr/local/command2

mais consultez chaque man -k sudo pour plus de détails.

-1voto

1337 HaXxoR Points 1

Peut-être que cela peut vous aider :

chmod 775 votrescript.sh

Ensuite vous pouvez utiliser sudo à l'intérieur du script (sans invite de mot de passe) Et ne pouvez pas utiliser sudo pour d'autres commandes à l'intérieur de votre script.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X