323 votes

Comment vérifier si on s'exécute en tant que Root dans un script bash

J'écris un script qui nécessite des autorisations de niveau Root, et je veux faire en sorte que si le script n'est pas exécuté en tant que Root, il échoue simplement "Please run as Root." et sort.

Voici un pseudo-code de ce que je recherche :

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

  else (do stuff)
fi

exit

Quelle est la meilleure façon d'y parvenir (proprement et en toute sécurité) ? Merci !

Ah, juste pour clarifier : la partie (faire des choses) impliquerait l'exécution de commandes qui en elles-mêmes nécessitent Root. Donc, l'exécuter en tant qu'utilisateur normal se solderait par une erreur. Ceci est juste destiné à exécuter proprement un script qui nécessite des commandes Root, sans utiliser sudo à l'intérieur du script, je suis juste à la recherche d'un sucre syntaxique.

10 votes

(1) faire en sorte qu'il ne soit pas exécutable par autre chose que Root (2) prévoir d'autres permissions également (3) id -u renvoie à 0 pour Root.

476voto

Petey T Points 1068

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

Note : Si vous obtenez 2: [: Illegal number: vérifier si vous avez #!/bin/sh en haut et le changer en #!/bin/bash .

0 votes

Il semble que de bonnes permissions et le fait d'avoir ceci constituent une double couche de sécurité.

36 votes

Je pense qu'il est préférable de comparer une chaîne de caractères avec une chaîne de caractères, un nombre avec un nombre. En utilisant des doubles crochets, vous pouvez utiliser > directement sans guillemets [[ $EUID > 0 ]].

7 votes

J'ai 2: [: Illegal number: jusqu'à ce qu'il soit remplacé par la version de Sergio.

87voto

sberder Points 1145

Dans un script bash, vous avez plusieurs façons de vérifier si l'utilisateur en cours d'exécution est Root.

En tant que avertissement ne vérifient pas si un utilisateur est Root en utilisant l'option "Root". root le nom d'utilisateur. Rien ne garantit que l'utilisateur avec l'ID 0 est appelé 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 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 l'utilisateur réel qui exécute le script.

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

Une façon d'aborder ce genre de problème est d'injecter sudo dans mes commandes lorsqu'elles ne sont pas exécutées en tant que Root. Voici un exemple :

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

De cette façon, ma commande est exécutée par Root en utilisant le superutilisateur ou par sudo lorsqu'il est exécuté par un utilisateur normal.

Si votre script doit toujours être exécuté par Root, il suffit de définir les droits en conséquence ( 0500 ).

0 votes

Si la personne qui essaie d'exécuter le script n'a pas les privilèges sudo, cela provoquera l'erreur et la commande ne s'exécutera pas ? Je veux juste m'assurer que je comprends correctement.

1 votes

Je ne suis pas sûr que cette réponse soit complètement correcte à 100%. Sur RHEL7.2 en utilisant Bash 4.2.46... si je printf $EUID avec ou sans sudo, je récupère mon propre UID. Si j'utilise id -u J'obtiens mon UID et quand je l'invoque avec sudo, j'obtiens 0 en retour. Ai-je fait quelque chose de mal ?

4 votes

@0xSheepdog, il est possible que sur le cli bash, l'expansion de la variable $EUID soit résolue en premier, puis sudo change l'utilisateur. Par conséquent, vous obtiendriez ce comportement, mais dans scripts, tout fonctionnerait toujours bien.

70voto

Dale_Reagan Points 149
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

:)

1 votes

Vous pourriez envisager d'intégrer La réponse de Jeremy J Starcher avec cette partie, à la fin c'est toujours la même chose...

0 votes

Je sais que dans le terminal, lorsque j'oublie de préfixer quelque chose avec sudo Je peux simplement taper sudo !! et cela fait le travail pour moi, plutôt que d'appuyer sur la flèche UP, d'aller au début de la ligne, et d'ajouter sudo à la main. Je ne sais pas si c'est un truc de BASH ou de SUDO ou autre, mais ça marche la plupart du temps.

0 votes

@0xSheepdog : C'est un truc de Bash (et une fonctionnalité de certains autres shells comme csh, d'où il provient, je crois).

35voto

Slater Tyranus Points 6650

Il existe une vérification simple pour savoir si un utilisateur est Root.

El [[ stuff ]] est la façon standard d'exécuter une vérification dans bash.

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

if [[ $EUID -eq 0 ]]; then
    error "Do not run this as the root user"
    exit 1
fi

Cela suppose également que vous voulez sortir avec un 1 si vous échouez. Le site error est une fonction qui met le texte de sortie en rouge (pas nécessaire, mais assez classe si vous voulez mon avis).

0 votes

Qu'est-ce que c'est ? error commande ? Mon système ne semble pas l'avoir

0 votes

Oh, c'est juste un petit truc de style. Ça n'a pas beaucoup d'importance, mais je vais le joindre.

4 votes

C'est plutôt cool ! Si je peux suggérer quelques améliorations : (1) déplacer le saut de ligne à la fin ; (2) écrire dans le fichier d'erreur standard plutôt que dans le fichier de sortie standard ; (3) définir la couleur seulement si le fichier d'erreur standard est un terminal (plutôt que de risquer d'écrire des caractères d'échappement dans les fichiers journaux ou dans le fichier de sortie standard). less ou autre) ; et (4) définir une couleur de fond, afin que le texte soit lisible quelle que soit la couleur de fond du terminal de l'utilisateur. Donc, quelque chose comme function error () { if [[ -t 2 ]] ; then echo $'\033[31;2;47m'"$@"$'\033[0m' ; else echo "$@" ; fi >&2 ; } . (Ajustez comme vous le souhaitez.)

31voto

Jeremy J Starcher Points 10640

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

En outre, avec une utilisation appropriée 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 et l'exécuter avec les droits Root.

En fonction de ce que fait le script, une autre option peut être de mettre en place un sudo pour toutes les commandes spécialisées dont le script peut avoir besoin.

0 votes

Existe-t-il une manière élégante pour qu'un programme se rappelle lui-même ? Peut-être y a-t-il une variable bash avec le chemin absolu du programme ?

1 votes

Je ne suis pas près d'une invite BASH pour tester, mais $0 a le nom du script en cours d'exécution. Il y a quelques exemples aquí qui pourrait vous aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X