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;
}