Nachdem ich mir alle Vorschläge hier angesehen habe, habe ich ein paar Dinge entdeckt, von denen ich hoffe, dass sie für andere in meiner Position nützlich sein werden:
-
Hop hat recht, wenn er mich auf
/etc/init.d/functions
verweist :diedaemon
Funktion erlaubt Ihnen bereits, einen alternativen Benutzer festzulegen:daemon --user=my_user my_cmd &>/dev/null &
Dies wird implementiert, indem der Prozessaufruf mit
runuser
umschlossen wird -dazu später mehr. -
Jonathan Leffler hat Recht:Es gibt setuid in Python:
import os os.setuid(501) # UID of my_user is 501
Ich glaube jedoch immer noch nicht, dass Sie innerhalb einer JVM setuid ausführen können.
-
Weder
su
nochrunuser
Gehen Sie elegant mit dem Fall um, in dem Sie einen Befehl als der Benutzer ausführen möchten, der Sie bereits sind. Beispiel:[[email protected]_host]$ id uid=500(my_user) gid=500(my_user) groups=500(my_user) [[email protected]_host]$ su my_user -c "id" Password: # don't want to be prompted! uid=500(my_user) gid=500(my_user) groups=500(my_user)
Um dieses Verhalten von su
zu umgehen und runuser
, habe ich mein Init-Skript so geändert:
if [[ "$USER" == "my_user" ]]
then
daemon my_cmd &>/dev/null &
else
daemon --user=my_user my_cmd &>/dev/null &
fi
Vielen Dank für Ihre Hilfe!
Unter Debian verwenden wir den start-stop-daemon
Dienstprogramm, das PID-Dateien handhabt, den Benutzer ändert, den Daemon in den Hintergrund stellt und vieles mehr.
RedHat kenne ich nicht, aber daemon
Dienstprogramm, das Sie bereits verwenden (das in /etc/init.d/functions
definiert ist , btw.) wird überall als Äquivalent zu start-stop-daemon
erwähnt , also kann es entweder auch die UID Ihres Programms ändern, oder die Art und Weise, wie Sie es tun, ist bereits die richtige.
Wenn Sie sich im Netz umsehen, gibt es mehrere fertige Wrapper, die Sie verwenden können. Einige sind möglicherweise sogar bereits in RedHat verpackt. Siehe daemonize
, zum Beispiel.