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?
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?
Respuestas:
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
su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &
si su www-data
configuro todos los vars y lo ejecuto ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &
funciona bien. ¿Cómo puedo resolver esto?
su
toma 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 MONOSERVER
y WEBAPPS
se 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.
Si start-stop-daemon
está disponible en su sistema, probablemente debería usarlo y echar un vistazo a sus opciones (especialmente -u
y -g
en este caso).
(De lo contrario, puede usar una combinación de su
y sg
.)
Actualización: Aquí hay un ejemplo tomado de algún /etc/init.d/mpd
script (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/mpd
programa en sí. (El guión start-stop-daemon se encarga del procedimiento de daemonización, por lo que mpd
se 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 mpd
no estaba eliminando los privilegios por sí mismo, uno necesitaría agregar (por ejemplo) -u mpd
, -g mpd
opciones al start-stop-daemon
comando.
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
Usage: su [options] [LOGIN]
ysu: unrecognized option '--debug'