web-dev-qa-db-fra.com

Vérifier si l'utilisateur est root en C?

Comment puis-je vérifier si l'utilisateur est root?

36
Mohit Deshpande

Généralement, c'est une erreur de tester si l'utilisateur est root. POSIX ne nécessite même pas d'utilisateur root, mais laisse l'implémentation déterminer le fonctionnement des autorisations. Code tel que:

if (i_am_root) do_privileged_op(); else print_error();

va vraiment gêner les utilisateurs avec des modèles de privilège avancés où root n’est pas nécessaire pour effectuer les opérations privilégiées nécessaires. Je me souviens qu'au début de la gravure de CD sous Linux, je devais pirater la source cdrecord pour supprimer toutes les vérifications inutiles afin de voir si elle fonctionnait en tant que root, alors que cela fonctionnait parfaitement avec l'autorisation de lire /dev/sga.

Au lieu de cela, vous devriez toujours tenter l 'opération privilégiée que vous devez exécuter et rechercher EPERM ou similaire si elle ne parvient pas à avertir l' utilisateur qu'elle ne dispose pas de privilèges suffisants (et qu'elle devrait peut - être recommencer en exécutant en tant que root).

Le seul cas où il est utile de rechercher la racine vérifie si votre programme a été appelé "suid-root". Un test raisonnable serait:

uid_t uid=getuid(), euid=geteuid();
if (uid<0 || uid!=euid) {
    /* We might have elevated privileges beyond that of the user who invoked
     * the program, due to suid bit. Be very careful about trusting any data! */
} else {
    /* Anything goes. */
}

Notez que j’ai permis la possibilité (farfelue, mais mieux vaut être paranoïaque) que l’un ou l’autre des appels pour obtenir uid/euid puisse échouer, et qu’en cas d’échec, nous devrions supposer que nous sommes suid et qu’un utilisateur malveillant a provoqué l'échec des appels système dans une tentative de cacher que nous sommes suid.

57
R..

getuid ou geteuid , selon ce que vous voulez vraiment dire. Dans les deux cas, 0 signifie racine.

if(geteuid() != 0)
{
  // Tell user to run app as root, then exit.
}

La remarque faite par R est valide. Vous devez envisager des essais et des erreurs, ou une autre approche ne nécessitant pas explicitement root.

30
Matthew Flaschen

mieux vaut utiliser getuid ou geteuid mais il se trouve dans le fichier d’en-tête zconf.h et vous devez le saisir comme ci-dessous:

#include <zconf.h>
#include <stdio.h>
int main()
{
int a;
a=getuid();
//or you can use  a=geteuid();
//euid is effective user id and uid is user id 
// both euid and uid are zero when you are root user 
if (a==0){
printf("you are root user");
//so you can do what`enter code here`ever `enter code here` you want as root user
}
else
printf("please run the script as root user !");
return 0;
} 
0