GNU/Linux >> Linux Esercitazione >  >> Linux

In che modo la mia applicazione C/C++ può determinare se l'utente root sta eseguendo il comando?

getuid o geteuid sarebbero le scelte più ovvie.

getuid controlla le credenziali dell'utente effettivo.

Il e aggiunto in geteuid sta per effective . Controlla le credenziali effettive.

Solo per esempio, se usi sudo per eseguire un programma come root (superutente), le tue credenziali effettive sono ancora il tuo account, ma le tue credenziali effettive sono quelle dell'account root (o un membro del gruppo Wheel, ecc.)

Ad esempio, considera un codice come questo:

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

Se lo esegui normalmente, getuid() e geteuid() restituirà lo stesso valore, quindi dirà "in esecuzione come sé". Se esegui sudo ./a.out invece, getuid() restituirà comunque il tuo ID utente, ma geteuid() restituirà le credenziali per root o wheel, quindi dirà "Esecuzione come qualcun altro".


Consiglierei NON apportando questa modifica, migliorando invece il messaggio di errore. È dubbio che la tua applicazione debba effettivamente "essere root"; ha invece bisogno di determinati privilegi che ha root, ma che i sistemi operativi con controlli di sicurezza granulari potrebbero essere in grado di concedere all'applicazione senza concederle l'accesso root completo. Anche se ciò non è possibile ora, potrebbe esserlo tra 6 mesi o 2 anni e gli utenti si irriteranno se il tuo programma si rifiuta di essere eseguito sulla base di ipotesi precedenti sul modello di autorizzazione anziché limitarsi a verificare che riesca a funzionare le operazioni privilegiate di cui ha bisogno.


#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. Come eseguire un comando come amministratore di sistema (root)?

  2. Come posso richiamare l'argomento del precedente comando bash?

  3. Come posso eseguire il codice PHP dalla riga di comando?

  4. Come posso mostrare le immagini al di fuori della directory radice web nella mia applicazione php?

  5. Come posso fornire una password SSH a SVN sulla riga di comando?

Come utilizzare il comando usermod in Linux

Come diventare un utente root in Ubuntu

Come utilizzare il comando ulimit in Linux

Come disabilitare l'accesso SSH per l'utente root in Linux?

Come posso copiare una cartella dalla riga di comando di Linux?

Come posso nascondere l'output di un'applicazione shell in Linux?