GNU/Linux >> Znalost Linux >  >> Linux

Jak může moje aplikace C/C++ určit, zda uživatel root provádí příkaz?

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

Linux
  1. Jak můžete určit nainstalované verze knihoven glibc?

  2. Jak mohu spustit kód PHP z příkazového řádku?

  3. Jak mohu zobrazit obrázky mimo kořenový adresář webu v mé aplikaci php?

  1. Jak mohu zadat heslo SSH do SVN na příkazovém řádku?

  2. Jak fungují oprávnění k souborům pro uživatele root?

  3. Jak mohu skrýt výstup shellové aplikace v Linuxu?

  1. Jak odebrat uživatele v Linuxu pomocí příkazového řádku

  2. Jak spustit příkaz jako správce systému (root)?

  3. Jak určit kódování znaků, které terminál používá v programu C/c++?