getuid
nebo geteuid
by byla jasná volba.
getuid
zkontroluje přihlašovací údaje skutečného uživatele.
Přidáno e
v geteuid
znamená effective
. Zkontroluje platné přihlašovací údaje.
Jen například, pokud použijete sudo
Chcete-li spustit program jako root (superuser), vaše skutečné přihlašovací údaje jsou stále vaším vlastním účtem, ale vaše efektivní přihlašovací údaje jsou přihlašovací údaje root účtu (nebo člena skupiny Wheel atd.)
Zvažte kód například takto:
#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";
}
Pokud to spustíte normálně, getuid()
a geteuid()
vrátí stejnou hodnotu, takže to bude říkat "běží jako vlastní". Pokud uděláte sudo ./a.out
místo toho getuid()
stále vrátí vaše uživatelské ID, ale geteuid()
vrátí přihlašovací údaje pro root nebo kolo, takže bude napsáno „Spustit jako někdo jiný“.
Doporučuji NE provedení této změny, ale místo toho vylepšení vaší chybové zprávy. Je pochybné, že vaše aplikace skutečně potřebuje "být root"; místo toho potřebuje určitá oprávnění, která má root, ale která operační systémy s jemnými bezpečnostními kontrolami by mohly být schopny aplikaci udělit, aniž by jí udělily úplný root přístup. I když to nyní není možné, může to být možné za 6 měsíců nebo za 2 roky a uživatelé budou podrážděni, pokud váš program odmítne běžet na základě zpětných předpokladů o modelu oprávnění, místo aby pouze kontroloval, zda úspěšně funguje. privilegované operace, které potřebuje.
#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;
}