Aufforderung zur Eingabe des sudo-Passworts und programmgesteuerte Erhöhung der Berechtigungen im Bash-Skript?

49

Ich arbeite derzeit an einem Bash-Skript, das verschiedene Programme auf einem Standard-Linux-System (derzeit Ubuntu) installiert und einrichtet. Da es Programme installiert und eine Reihe von Dateien in verschiedene Ordner kopiert, für die erhöhte Berechtigungen erforderlich sind, habe ich bereits den Standard "Ich benötige erhöhte Berechtigungen" -und-Exit ausgeführt.

Ich möchte jedoch, wenn möglich, den Benutzer zur Eingabe seines Sudo-Kennworts auffordern und die Skriptberechtigungen automatisch erhöhen können, wenn der Benutzer den Skriptbefehl nicht mit sudo ausführt (z. B. über den GUI-Dateimanager). ohne dass der Benutzer das Skript neu starten muss.

Da dies so konzipiert ist, dass es auf Standard-Linux-Installationen ausgeführt werden kann, funktioniert jede Option, die das System ändert, für meine Zwecke nicht. Alle Optionen müssen im Skript selbst enthalten sein.

Ist das innerhalb von Bash möglich? Wenn ja, wie geht das am besten (sicher und dennoch präzise)?

Shauna
quelle
@MichaelMrozek - Ah, die Freude, so viele Nischen-Sites zu haben und gleichzeitig zu versuchen, die Fragmentierung zu minimieren. Und Sie wissen, der Link, den Sie mir gegeben haben, ist mir beim Durchsuchen von Google kein einziges Mal aufgefallen.
Shauna
@jww du merkst, dass fast alle diese links ungefähr 4 Jahre nach diesem gefragt wurden , oder?
Shauna
1
@ Shauna - Ich vermute, Sie haben das Problem inzwischen gelöst. Die Links sind für zukünftige Besucher.

Antworten:

64

Ich starte sudodirekt aus dem Skript:

if [ $EUID != 0 ]; then
    sudo "$0" "$@"
    exit $?
fi
Michael Mrozek
quelle
16

Ich schlage vor:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done
Enzotib
quelle
Was if [[ -t 1 ]];prüft?
Shauna
Ach ja ok Ich nahm an, dass es etwas mit Terminal vs. GUI zu tun hatte, war mir aber nicht sicher, was die if-Anweisung selbst überprüfte.
Shauna
Erstaunlich, danke!
Fire-Dragon-DoL
16

Fügen Sie dies als erste Zeile des Skripts hinzu:

[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"

Wechseln Sie sudozu gksuoder, gksudowenn Sie eine grafische Eingabeaufforderung bevorzugen.

Kevin
quelle
3
Beachten Sie, dass "$*"alle Argumente zu einem zusammengeführt werden ( /path/to/script one two threewas dazu führen $1wird one two three) und $*dass Leerzeichen in Argumenten ohne Anführungszeichen durcheinander gebracht werden. "$@"funktioniert richtig
Michael Mrozek
@MichaelMrozek Ah, richtig. Das ist der, den ich gesucht habe, Fixed
Kevin
Gibt es eine Möglichkeit, dies unter Debian zu tun, wo es anscheinend keinen sudo-Befehl gibt?
Falscher Benutzername
@wrongusername installieren sudo, es ist viel besser als mit su. Aber wenn Sie wirklich wollen, wahrscheinlichexec su -c "$0" "$@"
Kevin
2

Beispielskript Ich habe nichts dagegen zu teilen ::

#!/bin/bash
[ "$UID" -eq 0 ] || exec sudo "$0" "$@" && echo -n "sudo bash what: "
read WHAT
sudo $WHAT

--ImP.TeK

IMPERIAL TEK. Lösungen
quelle
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"- Sieht aus wie ein wirklich effizienter Einzeiler! Nett!
Groovenectar
Wäre es sinnvoll, hier Effective UID zu verwenden $EUDIoder immer das gleiche Ergebnis? ZB[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
Groovenectar