web-dev-qa-db-fra.com

Scripts Bash nécessitant un mot de passe Sudo

Je crée un script d'installation Bash qui compile et installe des bibliothèques pour OSX et Linux. Parce que certaines commandes de mon script ("make install", "apt-get install", "port install", etc.) nécessitent Sudo, j'ai besoin de l'utilisateur pour fournir le mot de passe.

Actuellement, l'utilisateur reçoit le mot de passe chaque fois que la première commande Sudo est sur le point d'être exécutée, mais comme il s'agit souvent d'une étape de compilation, il reste toujours un certain temps entre le démarrage du script et la saisie du mot de passe.

Je voudrais mettre l'entrée du mot de passe + vérifier au début du script. De plus, je suis curieux de savoir si c’est vraiment un bon moyen d’installer des bibliothèques système.

Alternativement, je pourrais installer les bibliothèques dans un emplacement de sandbox local qui ne nécessite pas Sudo, mais ensuite, je devrai dire à apt-get et à macports où installer leurs bibliothèques, à part le répertoire par défaut/usr/local/et/opt/local , et je ne sais pas comment faire cela ni si c'est une idée intelligente.

33
Thijs Koerselman

Pour obtenir le mot de passe, il suffit de mettre Sudo echo "Thanks." au début du script.

Mais je préférerais cette solution:

if [[ $UID != 0 ]]; then
    echo "Please run this script with Sudo:"
    echo "Sudo $0 $*"
    exit 1
fi
61
Aaron Digulla

Pour ceux qui ne veulent pas élever le script entier (pour limiter les risques en utilisant uniquement Sudo dans le script si nécessaire), la première partie de la réponse acceptée Sudo echo "Thanks" fonctionne mais ne répond pas à l'échec du mot de passe Sudo en quittant le script. Pour ce faire, les scripts qui incluent des commandes Sudo et souhaitent garantir l'accès à Sudo avant son utilisation pourraient commencer par

if [[ ! $(Sudo echo 0) ]]; then exit; fi

La mise en garde est que vous vous fiez à l'existence d'un délai d'attente sudoers qui durera toute la durée de votre script pour supprimer le reste des invites.

5
Travis R

Une autre façon de s'y prendre:

function checkSudo() {
    if ((EUID != 0)); then
        echo "Granting root privileges for script ( $SCRIPT_NAME )"
        if [[ -t 1 ]]; then
            Sudo "$0" "$@"
        else
            exec 1>output_file
            gksu "$0" "$@"
        fi
        exit
    fi
}
0
Mike Q