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?



@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:



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

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.


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


[ "$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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.