Pytać o hasło sudo i programowo podnieść uprawnienia w skrypcie bash?

49

Obecnie pracuję nad skryptem bash, który instaluje i konfiguruje różne programy w standardowym systemie Linux (obecnie Ubuntu). Ponieważ instaluje programy i kopiuje pewną liczbę plików do różnych folderów wymagających podwyższonych uprawnień, już wykonałem standardowe „Potrzebuję podwyższonych uprawnień” - i wychodzę.

Chciałbym jednak, jeśli to możliwe, móc pytać użytkownika o hasło sudo i automatycznie zwiększać uprawnienia skryptu, jeśli użytkownik nie uruchomi polecenia skryptowego za pomocą sudo (np. Uruchamiając go z menedżera plików GUI), bez konieczności ponownego uruchamiania skryptu przez użytkownika.

Ponieważ jest on zaprojektowany do uruchamiania na standardowych instalacjach Linuksa, każda opcja modyfikująca system nie będzie działać dla moich celów. Wszystkie opcje muszą być zawarte w samym skrypcie.

Czy jest to możliwe w Bash? Jeśli tak, jaki jest najlepszy (bezpieczny, ale zwięzły) sposób na zrobienie tego?

Shauna
źródło
@MichaelMrozek - Ach, radość z posiadania tak wielu niszowych witryn przy jednoczesnym staraniu się zminimalizować fragmentację. I wiesz, link, który podałeś nigdy nie pojawił się dla mnie podczas wyszukiwania w Google.
Shauna
@ jww zdajesz sobie sprawę, że prawie wszystkie te linki zostały zadane około 4 lata po tym, prawda?
Shauna
1
@Shauna - Chyba już rozwiązałeś problem. Linki są przeznaczone dla przyszłych gości.

Odpowiedzi:

64

Uruchamiam sudobezpośrednio ze skryptu:

if [ $EUID != 0 ]; then
    sudo "$0" "$@"
    exit $?
fi
Michał Mrożek
źródło
16

Sugeruję:

#!/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
źródło
Co to if [[ -t 1 ]];sprawdza?
Shauna,
Ach, okej Uznałem, że ma to coś wspólnego z terminalem kontra GUI, ale nie byłem pewien, co sprawdza sama instrukcja if.
Shauna
Niesamowite dzięki!
Fire-Dragon-DoL
16

Dodaj to jako pierwszy wiersz skryptu:

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

Zmień sudona gksulub gksudojeśli wolisz graficzny monit.

Kevin
źródło
3
Zauważ, że "$*"połączy wszystkie argumenty w jeden ( /path/to/script one two threespowoduje $1powstanie one two three), a $*bez cudzysłowów zepsuje spacje w argumentach. "$@"działa dobrze
Michael Mrozek
@MichaelMrozek Ah, prawda. Właśnie tego szukałem, Naprawiono
Kevin
Czy istnieje sposób, aby to zrobić na Debianie, gdzie wydaje się, że nie ma polecenia sudo?
wrongusername
Instalacja @ wrongusername sudo, jest znacznie lepsza niż używanie su. Ale jeśli naprawdę tego chcesz, prawdopodobnieexec su -c "$0" "$@"
Kevin
2

przykładowy skrypt nie mam nic przeciwko udostępnianiu ::

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

--ImP.TeK

ImPerial TeK. Rozwiązania
źródło
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"- Wygląda jak naprawdę wydajny jeden liniowiec! Miły!
groovenectar
Czy warto zastosować tutaj efektywny identyfikator UID $EUDI, czy zawsze ten sam wynik? Np.[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
groovenectar,