web-dev-qa-db-fra.com

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

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:
Qu'est-ce qu'un moyen simple d'écrire un script foo.sh, de sorte que la commande ./foo.sh génère 0 et que la commande Sudo ./foo.sh génère 1?

100
Malabarba
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi
144
aneeshep

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 , pas -r pour le réel identifiant d'utilisateur. Les autorisations sont déterminées par l'ID utilisateur effectif , et non le réel un.

Des 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 (ceci retourne 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 été transmis.

Le script mis à jour ressemblerait à ceci:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   echo "I am not root!"
   exit 1
fi
112
Lekensteyn

Comme @ Lekensteyn a dit , vous devez utiliser un ID utilisateur effectif. Vous n'avez pas besoin d'appeler id -u dans 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 à partir 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
30
jfs

Vous pouvez accomplir cela 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.


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

if [ $USER != 'root' ]
20
Nathan Osman

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

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

De cette manière, en raison du raccourci O, vous évitez d'appeler une commande système, en priorisant la recherche d'une variable en mémoire.

Réutilisation du code:

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}
10
Luchostein
#!/bin/bash
[[ $(id -u) != 0 ]] 
echo $?
9
João Pinto

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

2
alexandre1985

Cet extrait va:

  • Vérifiez les différentes sessions
  • suggère d'utiliser Sudo !!
  • et renvoyer une erreur
 if ["$ (whoami & 2>/dev/null)"! = "root"] && ["$ (id -un & 2>/dev/null)"! = "root"] 
 puis 
 echo "Vous devez être root pour exécuter ce script!" 
 echo "utilisez 'Sudo !!'" 
 exit 1 
 fi 
1
rubo77

Cette réponse est juste pour enregistrer une idée avec peut ê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 comme suit:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   gksudo -w $0 $@
   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 fenêtre de dialogue Nice vous demandant le mot de passe utilisateur root. Comme avec Sudo en ligne de commande.

Le gksudo peut ne pas être disponible sur votre système, puis installez-le avec Sudo apt-get install gksu.

1
gertas
#!/bin/bash
uid=`id -u`
if [ "$uid" == "0" ]
then
    echo 1
else
    echo 0
fi
1
Delan Azabani

Ce code fonctionne à la fois sous Bash et dans le stock Bourne sh (testé sous FreeBSD) qui ne définit pas EUID. Si EUID existe, sa valeur est renvoyée, sinon la commande 'id' est exécutée. C'est un peu plus court que l'exemple "ou" ci-dessus, car il utilise un shell ": -" intégré.

Racine dans sh:

# echo $EUID

# euid=${EUID:-`id -u`}
# echo $euid
0

In bash:
[chaapala@tenfwd2 ese]$ euid=${EUID:-`id -u`}
[chaapala@tenfwd2 ese]$ echo $euid
10260
0
Clayton Haapala