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)?



@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

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

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.


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


[ "$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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.