Come può uno script verificare se viene eseguito come root?

85

Sto scrivendo un semplice script bash, ma ne ho bisogno per verificare se viene eseguito come root oppure no. So che probabilmente c'è un modo molto semplice per farlo, ma non ho idea di come.

Per essere chiari:
Qual è un modo semplice per scrivere uno script foo.sh , in modo che il comando ./foo.sh generi 0 e il comando sudo ./foo.sh generi 1 ?

    
posta Malabarba 02.12.2010 - 12:30

10 risposte

119
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi
    
risposta data aneeshep 02.12.2010 - 12:44
100

Un utente root non deve essere chiamato "root". whoami restituisce il primo nome utente con ID utente 0 . $USER contiene il nome dell'utente che ha effettuato l'accesso, che può avere l'ID utente 0 , ma ha un nome diverso.

L'unico programma affidabile per verificare se l'account è stato eseguito come root, o meno:

id -u

Uso -u per l'ID utente effettivo , non -r per l'ID utente reale . Le autorizzazioni sono determinate dall'ID utente efficace , non da vero uno.

test

/etc/passwd contiene i seguenti nomi utente con ID utente 0 nell'ordine specificato:

rootx
root2

Collegato come root2 , dà i risultati seguenti:

  • whoami : rootx
  • echo $USER : root2 (restituisce una stringa vuota se il programma è stato avviato in un ambiente vuoto, ad esempio env -i sh -c 'echo $USER' )
  • id -u : 0 Come puoi vedere, gli altri programmi non hanno superato questo controllo, solo id -u è stato superato.

Lo script aggiornato sarebbe simile a questo:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   echo "I am not root!"
   exit 1
fi
    
risposta data Lekensteyn 13.03.2011 - 10:19
29

Come @Lekensteyn ha detto che dovresti usare un ID utente efficace. Non è necessario chiamare id -u in bash:

#!/bin/bash

if [[ $EUID -ne 0 ]]; then
   echo "You must be root to do this." 1>&2
   exit 100
fi

Il suggerimento di geirha dei commenti utilizza la valutazione aritmetica:

#!/bin/bash

if (( EUID != 0 )); then
   echo "You must be root to do this." 1>&2
   exit 100
fi
    
risposta data jfs 13.03.2011 - 11:26
19

Puoi farlo usando il comando whoami , che restituisce l'utente corrente:

#!/bin/bash

if [ 'whoami' != 'root' ]
  then
    echo "You must be root to do this."
    exit
fi

...

L'esecuzione di quanto sopra stamperà You must be root to do this. se l'utente corrente non è root .

Nota: in alcuni casi un'alternativa è semplicemente controllare la variabile $USER :

if [ $USER != 'root' ]
    
risposta data Nathan Osman 13.03.2011 - 08:38
9
#!/bin/bash
[[ $(id -u) != 0 ]] 
echo $?
    
risposta data João Pinto 02.12.2010 - 12:40
7

Prendendo in considerazione l'efficienza, puoi testare, in primo luogo, la variabile di ambiente EUID e quindi, se non esiste, chiama il comando standard id :

if ((${EUID:-0} || "$(id -u)")); then
  echo You are not root.
else
  echo Hello, root.
fi

In questo modo, a causa della scelta rapida , eviti di chiamare un comando di sistema, priorizzando la query di una variabile in memoria.

Riutilizzo del codice:

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}
    
risposta data Luchostein 12.10.2016 - 16:14
2

Un modo semplice per rendere lo script eseguibile solo da root è avviare lo script con la riga:
#!/bin/su root

    
risposta data alexandre1985 13.08.2016 - 23:07
1
#!/bin/bash
uid='id -u'
if [ "$uid" == "0" ]
then
    echo 1
else
    echo 0
fi
    
risposta data Delan Azabani 02.12.2010 - 12:35
1

Questo snippet avrebbe:

  • Verifica sessioni diverse
  • consiglia di utilizzare sudo !!
  • e restituisce un errore
if [ "$(whoami &2>/dev/null)" != "root" ] && [ "$(id -un &2>/dev/null)" != "root" ]
      then
      echo "You must be root to run this script!"
      echo "use 'sudo !!'"
      exit 1
fi
    
risposta data rubo77 16.10.2014 - 11:17
1

Questa risposta è solo per salvare un'idea con potrebbe essere utile per alcuni di voi. Se hai bisogno di uno script che viene eseguito dalla GUI desktop e richiede i privilegi di root, prova in questo modo:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   gksudo -w $0 [email protected]
   exit
fi

#here go superuser commands, e.g. (switch intel cpu into powersave mode):
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
cpupower frequency-set -g powersave

In questo modo avrai una bella finestra di dialogo che ti chiederà la password dell'utente root. Proprio come con la riga di comando sudo.

Il gksudo potrebbe non essere disponibile nel tuo sistema quindi installarlo con sudo apt-get install gksu .

    
risposta data gertas 18.10.2015 - 00:00

Leggi altre domande sui tag