it-swarm.com.de

Bash-Skripte, die ein Sudo-Passwort erfordern

Ich erstelle ein Bash-Installationsskript, das einige Bibliotheken für OSX und Linux kompiliert und installiert. Da für einige Befehle in meinem Skript ("make install", "apt-get install", "port install" usw.) Sudo erforderlich ist, muss der Benutzer das Kennwort eingeben.

Derzeit wird der Benutzer immer dann nach dem Kennwort gefragt, wenn der erste Sudo-Befehl ausgeführt werden soll. Da dies jedoch häufig erst nach einer Kompilierungsphase erfolgt, muss immer etwas Zeit zwischen dem Starten des Skripts und der Eingabe des Kennworts liegen.

Ich möchte die Passworteingabe + Prüfung am Anfang des Skripts setzen. Ich bin auch gespannt, ob dies wirklich eine gute Möglichkeit ist, Systembibliotheken zu installieren.

Alternativ könnte ich die Bibliotheken an einem lokalen Sandbox-Speicherort installieren, der kein Sudo erfordert, aber dann muss ich apt-get und macports mitteilen, wo ihre Bibliotheken installiert werden sollen, abgesehen von der Standardeinstellung/usr/local/und/opt/local , und ich bin mir nicht sicher, wie ich das machen soll oder ob das überhaupt eine clevere Idee ist.

33

Um das Passwort zu erhalten, setzen Sie einfach Sudo echo "Thanks." am Anfang des Skripts ein.

Aber ich würde diese Lösung vorziehen:

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

Für diejenigen, die nicht das gesamte Skript erweitern möchten (um Risiken zu begrenzen, indem Sie nur Sudo im Skript verwenden, wo dies erforderlich ist), funktioniert der erste Teil der akzeptierten Antwort Sudo echo "Thanks", reagiert jedoch nicht auf einen Sudo-Kennwortfehler, indem Sie das Skript beenden. Dazu Skripte, die Sudo-Befehle enthalten und den Sudo-Zugriff sicherstellen möchten, bevor er verwendet wird

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

Die Einschränkung ist, dass Sie sich auf das Vorhandensein eines Sudoers-Timeouts verlassen, das die Dauer Ihres Skripts überdauert, um den Rest der Eingabeaufforderungen zu unterdrücken.

5
Travis R

Ein anderer Weg, dies zu tun:

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

Vielleicht etwas leichter zu lesen:

[ $(whoami) == "root" ] || exit
0
Paul Back