GNU/Linux >> Tutoriels Linux >  >> Linux

Comment mon application C/C++ peut-elle déterminer si l'utilisateur root exécute la commande ?

getuid ou geteuid seraient les choix évidents.

getuid vérifie les informations d'identification de l'utilisateur réel.

Le e ajouté en geteuid signifie effective . Il vérifie les informations d'identification effectives.

Juste par exemple, si vous utilisez sudo pour exécuter un programme en tant que root (superutilisateur), vos informations d'identification réelles sont toujours votre propre compte, mais vos informations d'identification effectives sont celles du compte root (ou d'un membre du groupe wheel, etc.)

Par exemple, considérez un code comme celui-ci :

#include <unistd.h>
#include <iostream>

int main() { 
    auto me = getuid();
    auto myprivs = geteuid();


    if (me == myprivs)
        std::cout << "Running as self\n";
    else
        std::cout << "Running as somebody else\n";
}

Si vous exécutez ceci normalement, getuid() et geteuid() renverra la même valeur, donc il dira "running as self". Si vous faites sudo ./a.out à la place, getuid() renverra toujours votre ID utilisateur, mais geteuid() renverra les informations d'identification pour root ou wheel, donc il dira "Courir en tant que quelqu'un d'autre".


Je recommanderais PAS faire ce changement, mais plutôt améliorer votre message d'erreur. Il est douteux que votre application doive réellement "être root" ; au lieu de cela, il a besoin de certains privilèges dont root dispose, mais que les systèmes d'exploitation avec des contrôles de sécurité précis pourraient être en mesure d'accorder à l'application sans lui donner un accès root complet. Même si ce n'est pas possible maintenant, cela peut être possible dans 6 mois ou 2 ans, et les utilisateurs vont être irrités si votre programme refuse de s'exécuter sur la base d'hypothèses inversées sur le modèle d'autorisation plutôt que de simplement vérifier qu'il réussit à s'exécuter les opérations privilégiées dont il a besoin.


#include <unistd.h> // getuid
#include <stdio.h> // printf

int main()
{
    if (getuid()) printf("%s", "You are not root!\n");
    else printf("%s", "OK, you are root.\n");
    return 0;
}

Linux
  1. Comment supprimer un utilisateur sous Linux à l'aide de la ligne de commande

  2. Comment pouvez-vous déterminer les versions installées des bibliothèques glibc ?

  3. Comment puis-je rappeler l'argument de la commande bash précédente ?

  4. Comment obtenir le nom d'utilisateur en C/C++ sous Linux ?

  5. Comment puis-je exécuter du code PHP à partir de la ligne de commande ?

Comment utiliser la commande usermod sous Linux

Comment devenir un utilisateur root dans Ubuntu

Comment utiliser la commande ulimit sous Linux

Comment désactiver la connexion SSH pour l'utilisateur root sous Linux ?

Comment puis-je boucler sur la sortie d'une commande shell ?

Comment puis-je masquer la sortie d'une application shell sous Linux ?