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
?
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
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.
/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
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
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' ]
En prenant en considération l'efficacité, vous pouvez d'abord tester la variable d'environnement EUID
name__, puis, si elle n'existe pas, appeler la commande standard id
name__:
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)"))
}
#!/bin/bash
[[ $(id -u) != 0 ]]
echo $?
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
Cet extrait va:
Sudo !!
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
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
.
#!/bin/bash
uid=`id -u`
if [ "$uid" == "0" ]
then
echo 1
else
echo 0
fi
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