J'écris un script qui nécessite des autorisations au niveau racine, et je veux faire en sorte que si le script n'est pas exécuté en tant que root, il fait simplement écho «Veuillez exécuter en tant que root». et sort.
Voici un pseudocode pour ce que je recherche:
if (whoami != root)
then echo "Please run as root"
else (do stuff)
fi
exit
Comment pourrais-je au mieux (proprement et en toute sécurité) accomplir cela? Merci!
Ah, juste pour clarifier: la partie (faire des trucs) impliquerait d'exécuter des commandes qui en elles-mêmes nécessitent root. Donc, l'exécuter en tant qu'utilisateur normal reviendrait simplement à une erreur. Ceci est juste destiné à exécuter proprement un script qui nécessite des commandes root, sans utiliser sudo dans le script, je cherche juste du sucre syntaxique.
id -u
retourne0
pour root.Réponses:
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:
Remarque: Si vous obtenez
2: [: Illegal number:
vérifiez si vous avez#!/bin/sh
en haut et changez-le en#!/bin/bash
.la source
2: [: Illegal number:
avertissement jusqu'à ce qu'il soit changé pour la version de Sergio.then
est sur la même ligne que la condition ...Dans un script bash, vous avez plusieurs façons de vérifier si l'utilisateur en cours d'exécution est root.
À titre d' avertissement , ne vérifiez pas si un utilisateur est root en utilisant le
root
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
, à partir de la page de manuel:C'est un meilleur moyen que celui
$UID
qui pourrait être modifié et ne reflète pas l'utilisateur réel exécutant le script.Une façon dont j'aborde ce genre de problème consiste à injecter
sudo
dans mes commandes lorsqu'il n'est pas exécuté en tant que root. Voici un exemple:De cette façon, ma commande est exécutée par root lors de l'utilisation du superutilisateur ou par
sudo
lorsqu'elle est exécutée par un utilisateur normal.Si votre script doit toujours être exécuté par root, définissez simplement les droits en conséquence (
0500
).la source
printf $EUID
avec ou sans sudo, je récupère mon propre UID. Si j'utilise,id -u
j'obtiens mon UID et lorsque je l'invoque avec sudo, j'obtiens 0 en retour. Est-ce que j'ai fait quelque chose de mal?sudo bash <<<'echo $EUID'
avecbash <<<'echo $EUID'
. En savoir plus sur l'hérédité hérédoc-like sur tldp.org/LDP/abs/html/x17837.htmlQuelques réponses ont été données, mais il semble que la meilleure méthode à utiliser soit:
id -u
Cela semble être plus fiable que les autres méthodes, et il semble qu'il renvoie un identifiant de 0 même si le script est exécuté
sudo
.la source
ou
:)
la source
sudo
je peux simplement tapersudo !!
et cela fait le travail pour moi, plutôt que d'appuyer sur la flèche HAUT, d'aller au début de la ligne et d'ajoutersudo
à la main. Je ne sais pas si c'est une chose BASH ou une chose SUDO ou autre, mais cela fonctionne la plupart du temps.if [ "$(id -u)" -ne 0 ]; then echo 'Please run as root.' >&2; exit 1; fi
. À votre santé.Comme @wrikken l'a mentionné dans ses commentaires,
id -u
c'est une bien meilleure vérification de la racine.De plus, avec une bonne utilisation de
sudo
, vous pouvez faire vérifier le script et voir s'il fonctionne en tant que root. Sinon, demandez-lui de se rappeler viasudo
puis d'exécuter avec les autorisations root.Selon ce que fait le script, une autre option peut être de configurer une
sudo
entrée pour les commandes spécialisées dont le script peut avoir besoin.la source
$0
a le nom du script en cours d'exécution. Il y a quelques exemples ici qui pourraient vous aider.Il y a une simple vérification pour qu'un utilisateur soit root.
La
[[ stuff ]]
syntaxe est la manière standard d'exécuter une vérification dans bash.Cela suppose également que vous souhaitez quitter avec un 1 en cas d'échec. La
error
fonction est un flair qui définit le texte de sortie en rouge (pas nécessaire, mais assez chic si vous me le demandez).la source
error
commande? Mon système ne semble pas l'avoir. . .less
ou autre); et (4) définir une couleur d'arrière-plan, de sorte que le texte sera lisible quelle que soit la couleur d'arrière-plan du terminal de l'utilisateur. Donc, quelque chose commefunction error () { if [[ -t 2 ]] ; then echo $'\033[31;2;47m'"$@"$'\033[0m' ; else echo "$@" ; fi >&2 ; }
. (Tweak comme vous le souhaitez.)Très simple, il suffit de mettre:
L'avantage d'utiliser ceci au lieu de
id
est que vous pouvez également vérifier si un certain utilisateur non root exécute la commande; par exemple.la source
whoami
plutôt que d'utiliserid
; lawhoami
commande peut également être utilisée pour rechercher d' autres utilisateurs que root, par leur nom.0- Lisez la documentation officielle GNU Linux, il y a plusieurs façons de le faire correctement.
1- assurez-vous de mettre la signature shell pour éviter les erreurs d'interprétation:
2- c'est mon script
la source
Dans cette réponse, soyons clairs, je suppose que le lecteur est capable de lire
bash
et de scripts shell POSIX commedash
.Je pense qu'il n'y a pas grand-chose à expliquer ici, car les réponses très votées expliquent bien la plupart de ces questions.
Pourtant, s'il y a quelque chose à expliquer, n'hésitez pas à commenter, je ferai de mon mieux pour combler les lacunes.
Solution complète (et pas seulement ) optimisée pour les performances et la fiabilité; tous les coques compatiblesbash
Nouvelle solution:
Benchmark (enregistrer dans un fichier
is_user_root__benchmark
)Solution originale:
^^^ La solution supprimée s'est avérée ne pas accélérer les choses, mais elle existe depuis longtemps, donc je vais la garder ici aussi longtemps que je le jugerai nécessaire.
Explication
Comme il est plusieurs fois plus rapide de lire la variable
$EUID
standardbash
, le numéro d'ID utilisateur effectif, que d'exécuter uneid -u
commande pour POSIX- trouver l'ID utilisateur, cette solution combine les deux en une fonction bien emballée. Si, et seulement si,$EUID
pour une raison quelconque n'est pas disponible, laid -u
commande sera exécutée, garantissant que nous obtenons la valeur de retour appropriée quelles que soient les circonstances .Pourquoi je poste cette solution après tant d'années que le PO a demandé
Eh bien, si je vois bien, il semble y avoir un morceau de code manquant ci-dessus.
Vous voyez, il existe de nombreuses variables qui doivent être prises en compte, et l'une d'entre elles combine performances et fiabilité .
Solution POSIX portable + Exemple d'utilisation de la fonction ci-dessus
Conclusion
Autant que vous ne l'aimez peut-être pas, l'environnement Unix / Linux s'est beaucoup diversifié. Cela signifie qu'il y a des gens qui aiment
bash
tant, ils ne pensent même pas à la portabilité ( coquilles POSIX ). D'autres comme moi préfèrent les coques POSIX . C'est aujourd'hui une question de choix et de besoins personnels.la source
Si le script nécessite vraiment un accès root, ses autorisations sur les fichiers doivent refléter cela. Avoir un script racine exécutable par des utilisateurs non root serait un drapeau rouge. Je vous encourage à ne pas contrôler l'accès avec un
if
chèque.la source
777
bombe rend cette vérification un peu défectueuse pour le type d'utilisateurs qui commettraient l'erreur en premier lieu.bash /path/to/script
il peut toujours être exécuté mêmeo=r
Une façon simple de rendre le script exécutable uniquement par root est de démarrer le script avec la ligne:
#!/bin/su root
la source
exit
? Et ces réponses sont toujours en hausse? Je suppose que les gens ne veulent pas implicitement que le script soit exécuté en tant que root. Je suis donc suivre cette façon de penser, avec une réponse plus simple. Mais oui, vous pouvez également apprendre des réponses plus verbeuses ciessayez le code suivant:
OU
la source
Pour autant que je sache, la manière correcte de le vérifier est:
Voir la section "Test de la racine" ici:
http://linuxcommand.org/lc3_wss0080.php
la source
= "0"
par-eq 0
id -u
est bien meilleur quewhoami
, car certains systèmes comme android peuvent ne pas fournir la racine du mot.Exemple:
la source
Vérifiez si vous êtes root et quittez si vous ne l'êtes pas:
Ou dans cet exemple, essayez de créer un répertoire à l'emplacement racine, puis essayez une fois les droits élevés.
Vérifiez si vous êtes root et si ce n'est pas élevé si possible:
la source
Note de l'éditeur: si vous n'avez pas besoin de crochets doubles, utilisez des crochets simples pour la portabilité du code.
la source
Vérifiez la racine:
Testé et exécuté en root.
la source