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-data
alle Variablen setze und sie ausführe ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &
. Wie löse ich das?
su
ein 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 MONOSERVER
und WEBAPPS
von 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-daemon
es auf Ihrem System verfügbar ist, sollten Sie es wahrscheinlich verwenden und sich die Optionen ansehen (insbesondere -u
und -g
in diesem Fall).
(Andernfalls können Sie eine Kombination aus su
und verwenden sg
.)
Update: Hier ist ein Beispiel aus einem /etc/init.d/mpd
Skript (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/mpd
Programm selbst. (Die Dämonisierungsprozedur wird vom Start-Stopp-Dämon-Skript erledigt, daher mpd
wird 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 mpd
nicht Privilegien von selbst fallen, würde man hinzufügen müssen (zum Beispiel) -u mpd
, -g mpd
Optionen für den start-stop-daemon
Befehl.
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'