La programmation de Linux C s’exécute en tant qu’utilisateur

J’ai un programme que je lance en tant que root. Je voudrais que le programme exécute une autre application en tant qu’utilisateur normal. J’ai essayé setgid() et ça marche, mais je ne peux pas retourner à root ou à un autre utilisateur. Le programme pour le moment est très simple;

  #include  #include  #include  int main(int argc, char *argv[] ) { if ( argc != 2) { printf("usage: %s command\n",argv[0]); exit(1); } setgid(100); setuid(1000); putenv("HOME=/home/caroline"); putenv("DISPLAY=:0"); system(argv[1]); seteuid(1001); putenv("HOME=/home/john"); putenv("DISPLAY=:1"); system(argv[1]); return 0; } 

Comment puis-je faire ceci? C’est comme l’action de la commande su $user-c $command

Si vous utilisez fork+exec vous pouvez modifier euid du processus enfant tout en restant en tant que root dans le parent. Le code pourrait ressembler à ceci:

  #include  #include  #include  int runAs(int gid, int uid, char **env, char *command) { int child = fork(); if (child == 0) { setgid(100); setuid(1000); do { putenv(*env); env++; } while (env != null); exec(command); } else if (child > 0) { waitpid(child); } else { // Error: fork() failed! } } int main(int argc, char *argv[] ) { char *env[3]; if ( argc != 2) { printf("usage: %s command\n",argv[0]); exit(1); } env[0] = "HOME=/home/caroline"; env[1] = "DISPLAY=:0"; env[2] = NULL; runAs(100, 1000, env, argv[1]); env[0] = "HOME=/home/john"; env[1] = "DISPLAY=:1"; runAs(100, 1001, env, argv[1]); return 0; } 

Depuis le manuel setuid: [if caller was root] it is impossible for the program to regain root privileges .

Qu’essayez-vous de faire? Vous pouvez définir SUID-bit sur votre programme et l’exécuter en tant qu’utilisateur. Vous pouvez ensuite utiliser seteuid pour supprimer temporairement les privilèges root et devenir utilisateur appelant, puis réinitialiser les privilèges. Si vous devez vraiment l’exécuter en tant que root, je pense que vous devriez faire un fork (), en laissant un processus en tant que root et un autre en tant que setuid ().

Si vous voulez faire une chose en tant qu’utilisateur normal et en tant qu’utilisateur root, vous pouvez toujours utiliser fork et setuid dans le processus fils pour ne pas avoir de privilèges root tout en les conservant pour l’autre partie de votre programme.