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.
Quelques réponses ont été données, mais il semble que la meilleure méthode consiste à utiliser:
id -u
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
.
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
.
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
).
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
:)
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.
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).
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
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
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
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
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.
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
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 .
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é .
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
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.
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
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
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:
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