Ich bearbeite ein init.d-Skript. Das Skript init.d führt ein Dienstprogramm-Skript aus, das dann einen Prozess ausführt. Wie würde ich aus beiden Bash-Skripten den Hauptprozess als bestimmten Benutzer und bestimmte Gruppe starten lassen?
Ich bearbeite ein init.d-Skript. Das Skript init.d führt ein Dienstprogramm-Skript aus, das dann einen Prozess ausführt. Wie würde ich aus beiden Bash-Skripten den Hauptprozess als bestimmten Benutzer und bestimmte Gruppe starten lassen?
Antworten:
Am einfachsten ist es, den Befehl su (1) zu verwenden. Er verfügt über eine Option, mit der Sie einen Befehl über die Shell des Benutzers ausführen können. Beispiel:
su foo -c ls
Dadurch wird zum Benutzer foo gewechselt und der Befehl ls ausgeführt. Wenn der Benutzer, den Sie verwenden möchten, keine gültige Shell hat (dh nicht in / etc / shells wie / bin / false oder / sbin / nologin), müssen Sie auch eine Shell in der Befehlszeile angeben. Beispiel mit Ausgabe:
# 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 &wenn ich su www-dataalle Variablen setze und sie ausführe ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &. Wie löse ich das?
suein einzelnes Argument, bei dem es sich um einen Shell-Befehl handelt. Sie müssen schreiben su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'und sicherstellen, dass MONOSERVERund WEBAPPSvon der übergeordneten Shell exportiert werden. (Anmerkung: nicht tun su … -c "$MONOSERVER …". Da dies fehlschlagen , wenn eine der Variablen Shell Sonderzeichen enthalten) Und wenn Sie einen dedizierten Daemon Launcher haben wiestart-stop-daemon , verwenden Sie es.
Wenn start-stop-daemones auf Ihrem System verfügbar ist, sollten Sie es wahrscheinlich verwenden und sich die Optionen ansehen (insbesondere -uund -gin diesem Fall).
(Andernfalls können Sie eine Kombination aus suund verwenden sg.)
Update: Hier ist ein Beispiel aus einem /etc/init.d/mpdSkript (das verwendet start-stop-daemon):
Startbefehl:
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
Alles, was folgt, --ist ein Argument für das /usr/bin/mpdProgramm selbst. (Die Dämonisierungsprozedur wird vom Start-Stopp-Dämon-Skript erledigt, daher mpdwird gebeten, sich nicht darum zu kümmern --nodaemon.)
Befehl stoppen:
echo "Stopping Music Player Daemon"
start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
Wenn mpdnicht Privilegien von selbst fallen, würde man hinzufügen müssen (zum Beispiel) -u mpd, -g mpdOptionen für den start-stop-daemonBefehl.
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]undsu: unrecognized option '--debug'