Ich musste einen schmutzigen Linux-Hack für jemanden machen, damit sie einen Drucker mit dem Shell-Befehl cupsenable printername
starten konnten, während sie kein Root-Benutzer waren. Ich wollte nicht, dass sie die gesamte cupsenable
-Syntax als root verwenden können, also schrieb ich gerade einen C-Wrapper, der die Eingabe in argv[1]
bereinigt und system("cupsenable sanitizedprintername")
aufruft.Warum brauche ich setuid (0) innerhalb eines setuid-root C-Programms, das ein Administrationsprogramm mit system() aufruft?
Ich machte das Programm setuid root, aber selbst so, cupsenable
schlug mit "Berechtigung verweigert". Dann habe ich einen setuid(0)
Anruf vor system()
eingefügt und, siehe da, es funktionierte.
Das Problem, dass es eine bessere Möglichkeit gibt, den Benutzern die Kontrolle über den Drucker zu geben, wird ignoriert. Es gibt wahrscheinlich einen besseren Weg. Was mich interessiert, sind die Feinheiten von chmod u+s
vs setuid(0)
vs system()
. Warum hat es sich so verhalten?
Whoa. Nun, ich habe gesagt, es war dreckig. Es scheint, dass ich den Bash-Prozess, der durch das System() hervorgebracht wurde, davon überzeugt habe, dass ich tatsächlich, wirklich, ehrlich Wurzel war, Gott schwöre. Es scheint etwas Refactoring in Ordnung zu sein. – JCCyC