Comment un script peut-il vérifier s'il est exécuté en tant que root?

85

J'écris un script bash simple, mais j'en ai besoin pour vérifier s'il est exécuté en tant que root ou non. Je sais qu’il existe probablement un moyen très simple de le faire, mais je ne sais pas comment.

Juste pour être clair:
C'est un moyen simple d'écrire un script foo.sh , pour que la commande ./foo.sh génère 0 et que la commande sudo ./foo.sh génère 1 ?

    
posée Malabarba 02.12.2010 - 12:30
la source

10 réponses

119
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi
    
réponse donnée aneeshep 02.12.2010 - 12:44
la source
100

Un utilisateur root ne doit pas nécessairement s'appeler "root". whoami renvoie le premier nom d'utilisateur avec l'ID utilisateur 0 . $USER contient le nom de l'utilisateur connecté, qui peut avoir l'ID utilisateur 0 , mais un nom différent.

Le seul programme fiable permettant de vérifier si le compte est connecté en tant que root ou non:

id -u

J'utilise -u pour l'ID utilisateur effectif , et non pas -r pour l'ID utilisateur réel . Les autorisations sont déterminées par l'ID utilisateur effectif , et non par le . réel un.

Tests

/etc/passwd contient les noms d'utilisateur suivants avec l'ID utilisateur 0 dans l'ordre indiqué:

rootx
root2

Connecté en tant que root2 , donne les résultats suivants:

  • whoami : rootx
  • echo $USER : root2 (cela renvoie une chaîne vide si le programme a été démarré dans un environnement vide, par exemple env -i sh -c 'echo $USER' )
  • id -u : 0 Comme vous pouvez le constater, les autres programmes ont échoué lors de cette vérification; seul id -u a réussi.

Le script mis à jour ressemblerait à ceci:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   echo "I am not root!"
   exit 1
fi
    
réponse donnée Lekensteyn 13.03.2011 - 10:19
la source
29

As @Lekensteyn a déclaré que vous devriez utiliser un identifiant d'utilisateur effectif. Vous n'avez pas besoin d'appeler id -u in bash:

#!/bin/bash

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

La suggestion de @ geirha tirée des commentaires utilise l'évaluation arithmétique:

#!/bin/bash

if (( EUID != 0 )); then
   echo "You must be root to do this." 1>&2
   exit 100
fi
    
réponse donnée jfs 13.03.2011 - 11:26
la source
19

Vous pouvez y parvenir en utilisant la commande whoami , qui renvoie l'utilisateur actuel:

#!/bin/bash

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

...

L'exécution de ce qui précède imprimera You must be root to do this. si l'utilisateur actuel n'est pas root .

Remarque: dans certains cas, une alternative consiste simplement à vérifier la variable $USER :

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

En prenant en considération l'efficacité, vous pouvez d'abord tester la variable d'environnement EUID , puis, si elle n'existe pas, appeler la commande standard id :

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

De cette façon, en raison du OU du raccourci , vous évitez d'appeler une commande système, en priorisant la requête d'une variable en mémoire.

Réutilisation du code:

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}
    
réponse donnée Luchostein 12.10.2016 - 16:14
la source
2

Un moyen simple de rendre le script exécutable uniquement par root est de le démarrer avec la ligne suivante:
#!/bin/su root

    
réponse donnée alexandre1985 13.08.2016 - 23:07
la source
1
#!/bin/bash
uid='id -u'
if [ "$uid" == "0" ]
then
    echo 1
else
    echo 0
fi
    
réponse donnée Delan Azabani 02.12.2010 - 12:35
la source
1

Cet extrait va:

  • Vérifiez différentes sessions
  • suggère d'utiliser sudo !!
  • et renvoyer une erreur
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
    
réponse donnée rubo77 16.10.2014 - 11:17
la source
1

Cette réponse ne sert qu'à enregistrer une idée qui pourrait être utile pour certains d’entre vous. Si vous avez besoin d'un script exécuté à partir de l'interface graphique du bureau et nécessitant des privilèges root, procédez de la manière suivante:

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

De cette façon, vous obtiendrez une belle fenêtre de dialogue vous demandant le mot de passe de l'utilisateur root. Comme avec sudo en ligne de commande.

Il est possible que gksudo ne soit pas disponible sur votre système, puis installez-le avec sudo apt-get install gksu .

    
réponse donnée gertas 18.10.2015 - 00:00
la source

Lire d'autres questions sur les étiquettes