
Tengo un script init.d simple que inicia y detiene un proceso. Llamo a init.d como root, pero me gustaría que el proceso que controla se ejecute como un usuario específico.
La sugerencia más común en línea parece ser hacer
su myuser -c "my_process args"
Sin embargo, esto crea un segundo espacio de proceso, un nuevo shell, etc. y es algo poco elegante.
Preferiría usar exec()
, ya que reemplaza el shell, pero esto no toma un usuario como argumento. ¿Es este un caso en el que debería usarlo setuid()
primero? ¿Qué pasa con la configuración del gid? ¿Hay algún problema que deba tener en cuenta?
Alternativamente, ¿existen soluciones específicas de la distribución para ejecutar init.d como un usuario diferente? Mi entorno es Centos 6.4.
Respuesta1
Depende de la distribución, pero las distribuciones basadas en RHEL usan una función Bash de /etc/rc.d/init.d/functions
la que se obtienen daemon
y que es en sí misma solo un contenedor alrededor del runuser
comando. Por lo que puedo ver en los archivos fuente, es funcionalmente idéntico su
en la mayoría de los casos, simplemente no pasa por PAM (probablemente para evitar algunos problemas del huevo y la gallina en ciertos casos).
En realidad, eso no responderá a sus objeciones, pero así es como lo hacen los servicios. La limpieza y la conformidad general con la lógica que usted desea es parte de la motivación para cosas comosystemd
Respuesta2
El uso de su someuser -c ...
es lo que se necesita. Para empezar, setuid()
una llamada al sistema no está disponible para el código shell. No hagas esto más difícil de lo necesario.