Comprobar si el usuario es root en C?


¿Cómo puedo verificar si el usuario es root?

 34
Author: Mohit Deshpande, 2010-11-12

3 answers

Normalmente es un error probar si el usuario es root. POSIX ni siquiera requiere un usuario root, pero deja que la implementación determine cómo funcionan los permisos. Código como:

if (i_am_root) do_privileged_op(); else print_error();

Realmente molestará a los usuarios con modelos de privilegios avanzados donde root no es necesario para realizar las operaciones privilegiadas necesarias. Recuerdo que en los primeros días de la grabación de CD en Linux, tuve que hackear toda la fuente cdrecord para eliminar todas las comprobaciones inútiles para ver si se estaba ejecutando como root, cuando funcionó bien con permiso para leer /dev/sga.

En su lugar, siempre debe intentar la operación privilegiada que necesita realizar, y verificar EPERM o similar si no notifica al usuario que tiene privilegios insuficientes (y tal vez debería volver a intentar ejecutar como root).

El único caso en el que es útil buscar root es comprobar si su programa fue invocado "suid-root". Una prueba razonable sería:

uid_t uid=getuid(), euid=geteuid();
if (uid<0 || uid!=euid) {
    /* We might have elevated privileges beyond that of the user who invoked
     * the program, due to suid bit. Be very careful about trusting any data! */
} else {
    /* Anything goes. */
}

Tenga en cuenta que permití la posibilidad (inverosímil, pero mejor ser paranoico) de que cualquiera de las llamadas para obtener uid/euid podría fallar, y que en el caso de falla deberíamos asumir que somos suid y un usuario malicioso de alguna manera ha causado que las llamadas al sistema fallen en un intento de ocultar que somos suid.

 55
Author: R..,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-11 23:46:24

getuid o geteuid, dependiendo de lo que significa realmente. En cualquier caso, 0 significa raíz.

if(geteuid() != 0)
{
  // Tell user to run app as root, then exit.
}

El punto hecho por R es válido. Debe considerar el ensayo y error, u otro enfoque que no requiera explícitamente root.

 27
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-12 16:22:15

Es mejor usar getuid o geteuid pero está en zconf.h archivo de cabecera y debe introducir que como a continuación:

#include <zconf.h>
#include <stdio.h>
int main()
{
int a;
a=getuid();
//or you can use  a=geteuid();
//euid is effective user id and uid is user id 
// both euid and uid are zero when you are root user 
if (a==0){
printf("you are root user");
//so you can do what`enter code here`ever `enter code here` you want as root user
}
else
printf("please run the script as root user !");
return 0;
} 
 0
Author: mohamadali abasnejad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-17 07:04:07