Richiedi password sudo ed eleva a livello di codice il privilegio nello script bash?


49

Attualmente sto lavorando a uno script bash che installa e configura vari programmi su un sistema Linux standard (attualmente Ubuntu). Poiché installa programmi e copia un numero di file in varie cartelle che richiedono privilegi elevati, ho già eseguito lo standard "Ho bisogno di privilegi elevati" -and-exit.

Tuttavia, vorrei, se possibile, essere in grado di richiedere all'utente la password di sudo ed elevare automaticamente i privilegi dello script se l'utente non esegue il comando di script con sudo (come avviarlo dal file manager della GUI), senza che l'utente debba riavviare lo script.

Poiché questo è progettato per essere eseguito su installazioni Linux di serie, qualsiasi opzione che modifica il sistema non funzionerà per i miei scopi. Tutte le opzioni devono essere contenute nello script stesso.

È possibile all'interno di Bash? In tal caso, qual è il modo migliore (sicuro, ma conciso) per farlo?



@MichaelMrozek - Ah, la gioia di avere così tanti siti di nicchia mentre si cerca di minimizzare la frammentazione. E sai, il link che hai dato non mi è mai venuto in mente durante la ricerca su Google.
Shauna,


@jww ti rendi conto che quasi tutti questi link sono stati chiesti circa 4 anni dopo questo, giusto?
Shauna,

1
@Shauna - Immagino tu abbia risolto il problema ormai. I collegamenti sono per futuri visitatori.

Risposte:


64

Corro sudodirettamente dallo script:

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

16

Suggerisco:

#!/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

Cosa if [[ -t 1 ]];controlla?
Shauna,

Ah ok. Ho pensato che avesse qualcosa a che fare con Terminal vs GUI, ma non ero sicuro di cosa stesse controllando la dichiarazione if.
Shauna,

Incredibile, grazie!
Fire-Dragon-DoL

16

Aggiungi questo come prima riga dello script:

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

Passare sudoa gksuo gksudose si preferisce un prompt grafico.


3
Si noti che "$*"unirà tutti gli argomenti in uno ( /path/to/script one two threesi tradurrà in $1essere one two three), e $*senza virgolette si rovinerà gli spazi negli argomenti. "$@"funziona bene
Michael Mrozek

@MichaelMrozek Ah, giusto. Questo è quello che stavo cercando, fisso
Kevin

C'è un modo per farlo su Debian, dove non sembra esserci alcun comando sudo?
wrongusername

@wrongusername install sudo, è molto meglio dell'uso su. Ma se vuoi davvero, probabilmenteexec su -c "$0" "$@"
Kevin,

2

script di esempio non mi dispiace condividere:

#!/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" "$@"- Sembra una fodera davvero efficiente! Bello!
Groovenectar,

Avrebbe senso usare UID efficace qui $EUDIo sempre lo stesso risultato? Ad esempio,[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
Groovenectar il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.