getuid
oder geteuid
wäre die naheliegende Wahl.
getuid
überprüft die Anmeldeinformationen des tatsächlichen Benutzers.
Die hinzugefügte e
in geteuid
steht für effective
. Es überprüft die gültigen Anmeldeinformationen.
Nur zum Beispiel, wenn Sie sudo
verwenden Um ein Programm als Root (Superuser) auszuführen, sind Ihre tatsächlichen Anmeldeinformationen immer noch Ihr eigenes Konto, aber Ihre effektiven Anmeldeinformationen sind die des Root-Kontos (oder eines Mitglieds der Wheel-Gruppe usw.)
Betrachten Sie beispielsweise Code wie diesen:
#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";
}
Wenn Sie dies normal ausführen, getuid()
und geteuid()
gibt den gleichen Wert zurück, also heißt es "running as self". Wenn Sie sudo ./a.out
machen stattdessen getuid()
wird weiterhin Ihre Benutzer-ID zurückgeben, aber geteuid()
gibt die Anmeldeinformationen für root oder wheel zurück, also heißt es "Als jemand anderes ausgeführt".
Ich würde NICHT empfehlen diese Änderung vornehmen, aber stattdessen Ihre Fehlermeldung verbessern. Es ist zweifelhaft, ob Ihre Anwendung tatsächlich "root" sein muss; Stattdessen benötigt es bestimmte Privilegien, die Root hat, die Betriebssysteme mit fein abgestuften Sicherheitskontrollen der Anwendung jedoch gewähren können, ohne ihr vollen Root-Zugriff zu gewähren. Selbst wenn das jetzt nicht möglich ist, könnte es in 6 Monaten oder 2 Jahren möglich sein, und die Benutzer werden irritiert sein, wenn Ihr Programm sich weigert, auf der Grundlage rückwärts gerichteter Annahmen über das Berechtigungsmodell ausgeführt zu werden, anstatt nur zu überprüfen, ob es erfolgreich funktioniert die privilegierten Operationen, die es benötigt.
#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;
}