Servicios predeterminados para comenzar root
en el momento del arranque en mi cuadro RHEL. Si recuerdo correctamente, lo mismo es cierto para otras distribuciones de Linux que usan los scripts de inicio en /etc/init.d
.
¿Cuál crees que es la mejor manera de ejecutar los procesos como un usuario (estático) de mi elección?
El único método al que había llegado era usar algo como:
su my_user -c 'daemon my_cmd &>/dev/null &'
Pero esto parece un poco desordenado ...
¿Hay algo de magia escondida que proporcione un mecanismo fácil para iniciar automáticamente los servicios como otros usuarios no root?
EDITAR: Debería haber dicho que los procesos que estoy comenzando en esta instancia son scripts Python o programas Java. Prefiero no escribir un contenedor nativo alrededor de ellos, así que desafortunadamente no puedo llamar a setuid () como sugiere Black .
Respuestas:
En Debian utilizamos la
start-stop-daemon
utilidad, que maneja archivos pid, cambia el usuario, pone el demonio en segundo plano y mucho más.No estoy familiarizado con RedHat, pero la
daemon
utilidad que ya está usando (que se define en/etc/init.d/functions
, por cierto) se menciona en todas partes como el equivalente astart-stop-daemon
, por lo que también puede cambiar el uid de su programa o la forma en que lo hace Ya es el correcto.Si mira alrededor de la red, hay varios envoltorios listos para usar que puede usar. Algunos incluso pueden estar ya empaquetados en RedHat. Echa un vistazo
daemonize
, por ejemplo.fuente
/etc/init.d/skeleton
. Agregue UID, variables GID y endo_start()
uso:start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $UID:$GID -- $DAEMON_ARGS
daemon()
está definido en las/etc/rc.d/init.d/function
dos cajas de RHEL y CentOS.Después de ver todas las sugerencias aquí, descubrí algunas cosas que espero sean útiles para otros en mi posición:
hop tiene razón al señalarme
/etc/init.d/functions
: ladaemon
función ya le permite configurar un usuario alternativo:Esto se implementa envolviendo la invocación del proceso con
runuser
más información sobre esto más adelante.Jonathan Leffler tiene razón: hay setuid en Python:
Sin embargo, todavía no creo que pueda establecerse desde dentro de una JVM.
Ni
su
tampocorunuser
maneja con gracia el caso en el que solicita ejecutar un comando como el usuario que ya es. P.ej:Para solucionar ese comportamiento de
su
yrunuser
, he cambiado mi script de inicio a algo como:¡Gracias a todos por su ayuda!
fuente
Si tiene la intención de escribir su propio demonio, le recomiendo llamar a setuid (). De esta manera, su proceso puede
fuente
Solo para agregar algunas otras cosas a tener en cuenta:
fuente
en una máquina virtual CENTOS (Red Hat) para el servidor svn: editado
/etc/init.d/svnserver
para cambiar el pid a algo que svn pueda escribir:y opción agregada
--user=svn
:El original pidfile fue
/var/run/svnserve.pid
. El demonio no comenzó porque solo la raíz podía escribir allí.fuente
Algunas cosas a tener en cuenta:
Generalmente uso / sbin / su para cambiar al usuario apropiado antes de iniciar los demonios.
fuente
¿Por qué no prueba lo siguiente en el guión de inicio?
Funcionó para mi.
fuente
setuid: command not found
Necesitaba ejecutar una aplicación Spring .jar como servicio, y encontré una manera simple de ejecutar esto como un usuario específico:
Cambié el propietario y el grupo de mi archivo jar al usuario que quería ejecutar. Luego vinculó este jar en init.d e inició el servicio.
Entonces:
fuente