2010-10-20 18 views
27

Sto creando uno script di installazione Bash che compila e installa alcune librerie sia per OSX che per Linux. Poiché alcuni comandi nel mio script ("make install", "apt-get install", "port install", ecc.) Richiedono sudo, ho bisogno che l'utente fornisca la password.Gli script di Bash richiedono la password sudo

Attualmente all'utente viene richiesta la password ogni volta che il primo comando sudo sta per essere eseguito, ma poiché questo è spesso dopo una fase di compilazione, c'è sempre un po 'di tempo tra l'avvio dello script e l'inserimento della password.

Vorrei inserire la password + check all'inizio dello script. Inoltre sono curioso di sapere se questo è davvero un modo corretto di installare le librerie di sistema.

In alternativa, potrei installare le librerie in una posizione sandbox locale che non richiede sudo, ma poi dovrò dire a apt-get e macports dove installare le loro librerie diverse dall'impostazione predefinita/usr/local/e/opt/local, e non sono sicuro di come farlo, né se è un'idea intelligente.

risposta

51

Per ottenere la password, è sufficiente inserire sudo echo "Thanks." all'inizio dello script.

Ma io preferirei questa soluzione:

if [[ $UID != 0 ]]; then 
    echo "Please run this script with sudo:" 
    echo "sudo $0 $*" 
    exit 1 
fi 
+0

Chiaro e semplice. Grazie! –

+0

Perché echo' per sudo se puoi 'sudo' direttamente? –

+0

@TobiasKienzler: Perché la domanda lo ha chiesto. –

4

Per coloro che non vogliono elevare l'intero script (per limitare i rischi utilizzando solo sudo all'interno dello script dove necessario) la prima parte del accettata la risposta sudo echo "Thanks" funziona ma non risponderà all'errore della password sudo uscendo dallo script. Per fare questo, gli script che includono i comandi sudo e vogliono garantire l'accesso sudo prima di essere utilizzato potrebbe iniziare con

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

L'avvertenza è che si fa affidamento sull'esistenza di un timeout sudoers che durerà tutta la durata del vostro script per sopprimere il resto dei prompt.

Problemi correlati