Prozess als anderer Benutzer / andere Gruppe starten (im Skript init.d)

10

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?

Stéphane Gimenez
quelle

Antworten:

12

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
ckk
quelle
su scheint das nicht zu gefallen, ich gebe ihm viele Argumente. Ich bekomme Usage: su [options] [LOGIN]undsu: unrecognized option '--debug'
Es funktioniert nicht genau. Wenn ich diese Zeile als root ausführe, erhalte ich eine Fehlermeldung, 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?
2
@ acidzombie24 akzeptiert 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.
Gilles 'SO - hör auf böse zu sein'
Gilles: Okay, ich ersetze das init.d-Skript nicht durch das, oder? Ich kann alle Variablen in ein neues Skript einfügen und das starten, da es einfach ist und ich nichts lernen müsste. Aber was ist das Besondere an Start-Stop-Daemon? Ich werde einen Kommentar zu dieser Antwort
Ist es besser, su oder su -login zu verwenden? Ich habe den Mann von su gelesen, aber ich kann für diesen speziellen Fall nicht verstehen
Massimo
4

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.

Stéphane Gimenez
quelle
Ich ersetze das Skript init.d nicht durch start-stop-daemon, oder? Wäre es nicht einfacher, su und eine Skriptdatei zu verwenden? Wenn ich init.d ersetze, wie installiere ich es, um es beim Start auszuführen? Was übergebe ich an Start-Stop-Daemon? -edit- Ich google Beispiele Geldautomaten Vielleicht brauche ich keine Antwort, aber ich
2
Kein Glück. Hier ist meine Linie. Es läuft immer noch als root. Ich habe die Manpages überprüft und weiß immer noch nicht, was ich dagegen tun soll. 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