Dopo aver esaminato tutti i suggerimenti qui, ho scoperto alcune cose che spero possano essere utili ad altri nella mia posizione:
-
hop ha ragione a indicarmi
/etc/init.d/functions
:ildaemon
La funzione consente già di impostare un utente alternativo:daemon --user=my_user my_cmd &>/dev/null &
Questo viene implementato avvolgendo l'invocazione del processo con
runuser
-ne parleremo più avanti. -
Jonathan Leffler ha ragione:c'è setuid in Python:
import os os.setuid(501) # UID of my_user is 501
Continuo a non pensare che tu possa impostare id dall'interno di una JVM, comunque.
-
Né
su
nérunuser
gestisci con garbo il caso in cui chiedi di eseguire un comando come l'utente che sei già. Ad esempio:[[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)
Per aggirare il comportamento di su
e runuser
, ho modificato il mio script init in qualcosa del tipo:
if [[ "$USER" == "my_user" ]]
then
daemon my_cmd &>/dev/null &
else
daemon --user=my_user my_cmd &>/dev/null &
fi
Grazie a tutti per il vostro aiuto!
Su Debian usiamo il start-stop-daemon
utility, che gestisce i file pid, cambia l'utente, mette il demone in background e molto altro.
Non ho familiarità con RedHat, ma con daemon
utilità che stai già utilizzando (definita in /etc/init.d/functions
, btw.) è menzionato ovunque come l'equivalente di start-stop-daemon
, quindi o può anche cambiare l'uid del tuo programma, o il modo in cui lo fai è già quello corretto.
Se ti guardi intorno in rete, ci sono diversi involucri già pronti che puoi usare. Alcuni potrebbero anche essere già impacchettati in RedHat. Dai un'occhiata a daemonize
, ad esempio.