Exécuter la commande sudo en C avec system ()

J’écris un morceau de code C qui exécutera une commande sudo dans l’appel de fonction system("sudo ip route ...") .

Cet appel est effectué dans un pthread créé par le thread principal et le programme principal est exécuté avec sudo ./program au démarrage.

Lorsque je lance le programme, Ubuntu me demande de saisir un mot de passe pour personne:

[sudo] password for nobody:

J’ai aussi essayé de faire du system("ip route ...") directement, mais il me donne un retour négatif, ce qui signifie qu’il n’est pas exécuté.

Que dois-je faire dans le thread pour permettre à l’appel system() d’utiliser le privilège sudo hérité du programme principal?

Vous n’avez rien de spécial à faire pour hériter des privilèges root que sudo a accordés. Les processus héritent généralement automatiquement des privilèges de leurs parents. La raison pour laquelle system(3) ne fonctionne pas est probablement soit parce que vous êtes root (voir ci-dessous), soit parce que vous êtes sur un thread.

Cela étant dit, n’utilisez pas system(3) . C’est parce que sudo fonctionne avec setuid, et que cela ne fonctionne pas bien avec system() . Par conséquent, utilisez plutôt la famille de fonctions exec(3) (sauf pour execlp() et execvp() ). Voir le man 3 system pour plus d’informations.

Cela dit, n’utilisez pas system(3) ou exec(3) . A la place, appelez directement l’API C pour manipuler les tables IP. Pourquoi voudriez-vous gaspiller des ressources système générant un nouveau processus ou deux, alors que vous pourriez simplement simplifier votre programme? (À ce stade, vous en êtes au point où votre question s’applique à Stack Overflow, cependant).

 system("echo XXXX | sudo -S gedit"); 

Où XXXX votre mot de passe.