Exécuter un script en root à partir d’un autre user

Bash logo

Des fois il n’y a pas le choix, il faut utiliser les droits root pour certaines actions comme par exemple le montage ou le démontage de filesystems.

Pour cela on peut l’appeler en incluant la commande sudo

vi monscript.sh
#!/bin/bash
if [ $UID -ne 0 ]; then       # or `id -u`
    exec su - root -- "$0" "$@"
fi
#Reste du script

Pour que cela fonctionne, il faudra obligatoirement donner les droits sudo à ce user avec la commande visudo (Centos,Debian,…). Ne jamais éditer le fichier /etc/sudoers directement !

visudo
monuser ALL=(root) NOPASSWD : /usr/local/bin/monscript.sh

En testant le script avec monuser il s’exécute correctement, mais si le système le lance on se retrouve avec le message d’erreur suivant :

sorry, you must have a tty to run sudo exec

On peut se dire qu’il suffit de changer le mode d’appel

vi monscript.sh
#!/bin/bash
if [ $UID -ne 0 ]; then       # or `id -u`
    exec sudo -- "$0" "$@"
fi
#Reste du script

Mais au final …

standard in must be a tty 

On va donc garder cette version :

vi monscript.sh
#!/bin/bash
if [ $UID -ne 0 ]; then       # or `id -u`
    exec su - root -- "$0" "$@"
fi
#Reste du script

On pourrait donc être tenté par désactiver complètement la directive

visudo
Defaults    !requiretty 

Mais c’est une très mauvaise idée !

On va donc uniquement le désactiver pour mon user :

visudo
monuser ALL=(root) NOPASSWD : /usr/local/bin/monscript.sh
Defaults:monuser        !requiretty

Et le tour est joué !

Zephilou

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Post comment