Ho dovuto fare uno scribacchino Linux per qualcuno in modo che potessero avviare una stampante con il comando della shell cupsenable printername
pur essendo un utente non root. Non volevo che fossero in grado di utilizzare la totalità della sintassi cupsenable
come root, quindi ho appena scritto un wrapper C che sanifica l'input in e chiama system("cupsenable sanitizedprintername")
.Perché ho bisogno di setuid (0) all'interno di un programma C setuid-root che chiama un programma amministrativo con system()?
Ho creato il programma setuid root, ma anche così, cupsenable
non è riuscito con "autorizzazione negata". Quindi ho inserito una chiamata setuid(0)
prima dello system()
e, ecco, ha funzionato.
Ignora il problema di un modo migliore per consentire agli utenti di controllare la stampante. Probabilmente c'è un modo migliore. Quello che mi interessa sono le complessità di chmod u+s
vs. setuid(0)
vs. system()
. Perché si è comportato in quel modo?
Whoa. Bene, ho detto che era sporco. Sembra che quello che ho fatto sia stato convincere il processo di bash generato da system() che in realtà, davvero, onestamente era root, giuro su Dio. Sembra che un po 'di refactoring sia in ordine. – JCCyC