Tuve que hacer un hack de Linux sucio para que alguien pudiera iniciar una impresora con el comando de shell cupsenable printername
mientras era un usuario no root. No quería que pudieran utilizar la totalidad de la sintaxis cupsenable
como raíz, así que acabo de escribir un contenedor C que desinfecta la entrada en argv[1]
y llama al system("cupsenable sanitizedprintername")
.¿Por qué necesito setuid (0) dentro de un programa setuid-root C que llama a un programa administrativo con system()?
Hice la raíz del programa setuid, pero aún así, cupsenable
falló con "permiso denegado". Luego inserté una llamada setuid(0)
antes de system()
y, he aquí, funcionó.
Ignore el problema de que haya una mejor manera de otorgar a los usuarios el control de la impresora. Probablemente haya una mejor manera. Lo que me interesa son las complejidades de chmod u+s
vs. setuid(0)
contra system()
. ¿Por qué se comportó de esa manera?
Whoa. Bueno, dije que estaba sucio. Parece que lo que hice fue convencer al proceso bash engendrado por el sistema() de que realmente, realmente, honestamente era root, juro por Dios. Parece que algunas refactorizaciones están en orden. – JCCyC