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

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é !

Pour marque-pages : Permaliens.

Laisser un commentaire

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