web-dev-qa-db-fra.com

Comment vérifier si en cours d'exécution en tant que root dans un script bash

J'écris un script qui nécessite des autorisations au niveau de la racine et je souhaite le rendre tel que, si le script n'est pas exécuté en tant que root, il se contente simplement de dire "Veuillez exécuter en tant que root". et sort.

Voici quelques pseudocodes pour ce que je recherche:

if (whoami != root)
  then echo "Please run as root"

  else (do stuff)
fi

exit

Comment pourrais-je le faire (proprement et en toute sécurité)? Merci!

Ah, juste pour clarifier: la partie (faire des choses) impliquerait d'exécuter des commandes qui en elles-mêmes ont besoin de root. Donc, le lancer en tant qu’utilisateur normal ne ferait que créer une erreur. Ceci est juste destiné à exécuter proprement un script qui nécessite des commandes racine, sans utiliser Sudo dans le script, je cherche juste un sucre syntaxique.

240
Nathan

Quelques réponses ont été données, mais il semble que la meilleure méthode consiste à utiliser:

  • id -u
  • Si exécuté en tant que root, retournera un identifiant de 0.

Cela semble être plus fiable que les autres méthodes et semble renvoyer un identifiant égal à 0 même si le script est exécuté via Sudo.

58
Nathan

La variable d'environnement $ EUID contient l'UID de l'utilisateur actuel. L'UID de Root est 0. Utilisez quelque chose comme ceci dans votre script:

if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi

Remarque: Si vous obtenez 2: [: Illegal number:, vérifiez si vous avez #!/bin/sh en haut et remplacez-le par #!/bin/bash.

344
ptierno

Dans un script bash, vous avez plusieurs moyens de vérifier si l'utilisateur en cours d'exécution est root.

En tant que avertissement, ne vérifiez pas si un utilisateur est root en utilisant le nom d'utilisateur root. Rien ne garantit que l'utilisateur portant l'ID 0 s'appelle root. C'est une convention très forte qui est largement suivie, mais n'importe qui peut renommer le superutilisateur sous un autre nom.

Je pense que la meilleure façon d’utiliser bash est d’utiliser $EUID, à partir de la page de manuel:

EUID   Expands to the effective user ID of the current  user,  initialized
       at Shell startup.  This variable is readonly.

C'est un meilleur moyen que $UID qui pourrait être modifié et ne pas refléter le véritable utilisateur exécutant le script.

if (( $EUID != 0 )); then
    echo "Please run as root"
    exit
fi

J'aborde ce type de problème en injectant Sudo dans mes commandes lorsqu'il n'est pas exécuté en tant que root. Voici un exemple:

Sudo=''
if (( $EUID != 0 )); then
    Sudo='Sudo'
fi
$Sudo a_command

Ainsi, ma commande est exécutée par root lorsque vous utilisez le superutilisateur ou par Sudo lorsqu'elle est exécutée par un utilisateur normal.

Si votre script doit toujours être exécuté par la racine, définissez simplement les droits en conséquence (0500).

73
sberder
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi

ou

if [[ `id -u` -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi

:)

47
Dale_Reagan

Comme @wrikken l'a mentionné dans ses commentaires, id -u est une bien meilleure vérification pour root.

De plus, avec une utilisation correcte de Sudo, vous pourriez demander au script de vérifier s'il est exécuté en tant que root. Si ce n'est pas le cas, faites-le se rappeler lui-même via Sudo, puis exécutez-le avec les autorisations root.

En fonction de l'action du script, une autre option consiste à configurer une entrée Sudo pour les commandes spécialisées dont le script peut avoir besoin.

29
Jeremy J Starcher

Il y a une vérification simple pour un utilisateur en tant que root.

La syntaxe [[ stuff ]] est la méthode standard d’exécution d’une vérification dans bash.

error() {
  printf '\E[31m'; echo "$@"; printf '\E[0m'
}

if [[ $EUID -eq 0 ]]; then
    error "This script should not be run using Sudo or as the root user"
    exit 1
fi

Cela suppose également que vous souhaitiez quitter avec un 1 si vous échouez. La fonction error est un flair qui définit le texte de sortie en rouge (inutile, mais plutôt élégant si vous me le demandez).

21
Slater Victoroff

0- Lisez la documentation officielle GNU Linux, il existe de nombreuses façons de le faire correctement.

1- Assurez-vous de mettre la signature du shell pour éviter les erreurs d'interprétation:

 #!/bin/bash

2- c'est mon script

#!/bin/bash 

if [[ $EUID > 0 ]]; then # we can compare directly with this syntax.
  echo "Please run as root/Sudo"
  exit 1
else
  #do your stuff
fi
11
Sergio Abreu

Manière très simple il suffit de mettre:

if [ "$(whoami)" == "root" ] ; then
    # you are root
else
    # you are not root
fi

L'avantage d'utiliser ceci au lieu de id est que vous pouvez vérifier si un certain utilisateur non root exécute également la commande; par exemple.

if [ "$(whoami)" == "john" ] ; then
    # you are john
else
    # you are not john
fi
9
Matthew Trotter

Si le script nécessite réellement un accès root, ses autorisations sur les fichiers doivent en tenir compte. Avoir un script root exécutable par des utilisateurs non-root serait un drapeau rouge. Je vous encourage à ne pas contrôler l'accès avec une vérification if.

chown root:root script.sh
chmod u=rwx,go=r script.sh
8
John Kugelman

essayez le code suivant:

if [ "$(id -u)" != "0" ]; then
    echo "Sorry, you are not root."
    exit 1
fi

OR

if [ `id -u` != "0" ]; then
    echo "Sorry, you are not root."
    exit 1
fi
5
MLSC

Dans cette réponse, que cela soit clair, je suppose que le lecteur est capable de lire bash et un POSIX Script shell comme dash .

Je crois qu’il n’ya pas grand chose à expliquer ici puisque les réponses très votées en expliquent beaucoup.

Cependant, s'il y a quelque chose à expliquer, n'hésitez pas à commenter, je ferai de mon mieux pour combler les lacunes.

Optimisé bash Solution performante et fiable

vérifié pour fonctionner sur GNU bash, version 4.4.19, à la fois en tant que root et avec Sudo

#!/bin/bash

function am_i_root {
    ! (( ${EUID:-0} || $(id -u) ))
}

if am_i_root; then
    tput bold; tput setaf 2; echo 'Ok, you are root!'; tput sgr0
else
    tput bold; tput setaf 1; echo 'Sad, you are NOT root :('; tput sgr0
fi

Explication

Comme il est une multitude de fois plus rapide pour lire la variable $EUID standard bash , le numéro d'identification de l'utilisateur effectif, par rapport à l'exécution de la commande id -u - POSIX -ly trouver l'ID utilisateur, cette solution combine les deux dans une fonction bien emballée. Si, et seulement si, le $EUID est indisponible pour une raison quelconque, la commande id -u sera exécutée, garantissant ainsi l'obtention de la valeur de retour appropriée quelles que soient les circonstances .

Pourquoi je poste cette solution après tant d'années, le PO a demandé

Eh bien, si je vois bien, il semble qu'il manque un morceau de code ci-dessus.

Vous voyez, il y a beaucoup de variables à prendre en compte, et l'une d'entre elles est et combine performance et fiabilité .


POSIX solution

vérifié pour fonctionner sur dash version 0.5.8 en tant que root et avec Sudo

#!/bin/sh

am_i_root() {
    [ "$(id -u)" -eq 0 ]
}

if am_i_root; then
    tput bold; tput setaf 2; echo 'Ok, you are root!'; tput sgr0
else
    tput bold; tput setaf 1; echo 'Sad, you are NOT root :('; tput sgr0
fi

Conclusion

Bien que cela ne vous plaise pas du tout, l’environnement Linux s’est beaucoup diversifié. Cela signifie qu'il y a des gens qui aiment tellement bash qu'ils ne pensent même pas à la portabilité ( POSIX coquillages). D'autres comme moi préfèrent les POSIX . C'est aujourd'hui une question de choix personnel et de besoins.

5

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

id -u est bien meilleur que whoami, car certains systèmes comme Android peuvent ne pas fournir la racine Word.

Exemple:

# whoami
whoami
whoami: unknown uid 0
2
Smeterlink

Pour autant que je sache la bonne façon de vérifier est:

if [ $(id -u) = "0" ]; then
    echo "You are root"
else
    echo "You are NOT root"
fi

Voir la section "Test de la racine" ici:

http://linuxcommand.org/lc3_wss0080.php

2
WebBrother

Recherchez la racine, quittez si échoue:

    func_check_for_root() {
        if [ ! $( id -u ) -eq 0 ]; then
            echo "ERROR: $0 Must be run as root, Script terminating" ;exit 7
        fi
    }
    func_check_for_root

Ensuite, il y a aussi whoami et 'qui suis-je', si vous voulez savoir qui a appelé un vers de script qui exécute actuellement un script:

    it@it-ThinkPad-W510:~$ who am i
    it       pts/19       2014-06-03 12:39 (:0.0)
    it@it-ThinkPad-W510:~$ Sudo who am i
    [Sudo] password for it: 
    it       pts/19       2014-06-03 12:39 (:0.0)

(voir que même avec Sudo appelé cela donne l'identifiant de l'utilisateur)

    it@it-ThinkPad-W510:~$ Sudo whoami
    root

Par conséquent,

    if [ "$(whoami)" == "user" ]; then
                echo "Executing the installer script"

    else
                echo "user is only allowed to execute the installer script"
    fi
1
Mike Q