Inicie el proceso como otro usuario / grupo (en el script init.d)

10

Estoy editando un script init.d. El script init.d ejecuta un script de utilidad que luego ejecuta un proceso. De cualquiera de los scripts de bash, ¿cómo haría que inicie el proceso principal como un usuario y grupo específicos?

Stéphane Gimenez
fuente

Respuestas:

12

La forma más simple es usar el comando su (1), tiene una opción que le permite ejecutar un comando a través del shell del usuario, por ejemplo:

su foo -c ls

Esto cambiará al usuario foo y ejecutará el comando ls. Si el usuario que desea utilizar no tiene un shell válido (es decir, no está en / etc / shells, como / bin / false o / sbin / nologin), también deberá especificar un shell en la línea de comandos. Ejemplo con salida:

# su nobody -s /bin/bash -c id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
ckk
fuente
parece que no le gusta, le doy muchos argumentos. Tengo Usage: su [options] [LOGIN]ysu: unrecognized option '--debug'
No funciona exactamente. Cuando ejecuto esta línea como root obtengo un error su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &si su www-dataconfiguro todos los vars y lo ejecuto ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &funciona bien. ¿Cómo puedo resolver esto?
2
@ acidzombie24 sutoma un único argumento, que es un comando de shell. Usted tiene que escribir su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"', y asegúrese de que MONOSERVERy WEBAPPSse exportan por el shell padre. (Nota: no haga, su … -c "$MONOSERVER …"ya que esto fallará si alguna de las variables contiene caracteres especiales de shell). Y si tiene un iniciador de demonios dedicado comostart-stop-daemon , úselo.
Gilles 'SO- deja de ser malvado'
Gilles: Muy bien, no estoy reemplazando el guión init.d con eso, ¿verdad? Puedo poner todas las variables en un nuevo script y ejecutarlo, ya que será fácil y no tendría que aprender nada. Pero, ¿qué tiene de especial start-stop-daemon?
¿Es mejor usar su o su -login? Leí al hombre de su pero no puedo entender para este caso específico
Massimo
4

Si start-stop-daemonestá disponible en su sistema, probablemente debería usarlo y echar un vistazo a sus opciones (especialmente -uy -gen este caso).

(De lo contrario, puede usar una combinación de suy sg.)

Actualización: Aquí hay un ejemplo tomado de algún /etc/init.d/mpdscript (que usa start-stop-daemon):

  • Comando de inicio:

    echo "Starting Music Player Daemon"
    start-stop-daemon --start --quiet --background --exec /usr/bin/mpd \
        --pidfile /var/run/mpd.pid --make-pidfile \
        -- --no-daemon /etc/mpd.conf 2>/dev/null
    

    Todo lo que sigue --es un argumento para el /usr/bin/mpdprograma en sí. (El guión start-stop-daemon se encarga del procedimiento de daemonización, por lo que mpdse le pide que no se preocupe por ello --nodaemon).

  • Comando de parada:

    echo "Stopping Music Player Daemon"
    start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
    

Si mpdno estaba eliminando los privilegios por sí mismo, uno necesitaría agregar (por ejemplo) -u mpd, -g mpdopciones al start-stop-daemoncomando.

Stéphane Gimenez
fuente
No estoy reemplazando el script init.d con start-stop-daemon, ¿verdad? ¿No sería más fácil usar su y un archivo de script? Si reemplazo init.d, ¿cómo lo instalo para que se ejecute al inicio? ¿Qué estoy pasando a start-stop-daemon? operación -Editar- estoy buscando en Google ejemplos ATM tal vez ya no quiero necesito una respuesta, pero me siento como que va a ser una respuesta compleja
2
Sin suerte. Aquí está mi línea. Todavía se ejecuta como root. Revisé las páginas del manual y todavía no sé qué hacer al respecto. start-stop-daemon --start --quiet --background -u www-data -g www-data --exec ${MONOSERVER} --pidfile /path/monoserve.pid --make-pidfile -- /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid