J'ai dû faire un bidouillage Linux pour quelqu'un afin de pouvoir démarrer une imprimante avec la commande shell cupsenable printername
tout en étant un utilisateur non-root. Je ne voulais pas qu'ils puissent utiliser l'intégralité de la syntaxe cupsenable
en tant que root, donc j'ai juste écrit un wrapper C qui nettoie l'entrée en argv[1]
et appelle system("cupsenable sanitizedprintername")
.Pourquoi ai-je besoin de setuid (0) dans un programme C setuid-root qui appelle un programme administratif avec system()?
J'ai fait le programme setuid root, mais même ainsi, cupsenable
a échoué avec "permission denied". Ensuite, j'ai inséré un appel setuid(0)
avant system()
et, voilà, cela a fonctionné. Ne tenez pas compte du fait qu'il existe une meilleure façon de donner aux utilisateurs le contrôle de l'imprimante. Il y a probablement un meilleur moyen. Ce qui m'intéresse sont les subtilités de chmod u+s
par rapport à setuid(0)
par rapport à system()
. Pourquoi s'est-il comporté de cette façon?
Whoa. Eh bien, j'ai dit que c'était sale. Il semble que ce que j'ai fait était de convaincre le processus bash engendré par le système() que j'ai vraiment, vraiment, honnêtement été racine, jure à Dieu. Il semble que le refactoring soit en ordre. – JCCyC