Les services démarrent par défaut au moment root
du démarrage sur ma boîte RHEL. Si je me souviens bien, il en va de même pour les autres distributions Linux qui utilisent les scripts init dans /etc/init.d
.
Selon vous, quelle est la meilleure façon de faire exécuter les processus en tant qu'utilisateur (statique) de mon choix?
La seule méthode à laquelle je suis arrivé était d'utiliser quelque chose comme:
su my_user -c 'daemon my_cmd &>/dev/null &'
Mais cela semble un peu désordonné ...
Y a-t-il un peu de magie cachée qui fournit un mécanisme simple pour démarrer automatiquement les services en tant qu'autres utilisateurs non root?
EDIT: J'aurais dû dire que les processus que je démarre dans cette instance sont des scripts Python ou des programmes Java. Je préfère ne pas écrire un wrapper natif autour d'eux, donc je ne peux malheureusement pas appeler setuid () comme le suggère Black .
Réponses:
Sur Debian, nous utilisons l'
start-stop-daemon
utilitaire, qui gère les fichiers pid, change l'utilisateur, met le démon en arrière-plan et bien plus encore.Je ne suis pas familier avec RedHat, mais l'
daemon
utilitaire que vous utilisez déjà (qui est défini dans/etc/init.d/functions
, btw.) Est mentionné partout comme l'équivalent destart-stop-daemon
, donc il peut également changer l'uid de votre programme, ou la façon dont vous le faites c'est déjà le bon.Si vous regardez autour du filet, il existe plusieurs emballages prêts à l'emploi que vous pouvez utiliser. Certains peuvent même être déjà emballés dans RedHat. Jetez un oeil à
daemonize
, par exemple.la source
/etc/init.d/skeleton
. Ajouter des variables UID, GID et en cours d'do_start()
utilisation:start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $UID:$GID -- $DAEMON_ARGS
daemon()
est défini dans/etc/rc.d/init.d/function
les deux boîtes RHEL et CentOS de la mienne.Après avoir examiné toutes les suggestions ici, j'ai découvert quelques choses qui, je l'espère, seront utiles à d'autres dans ma position:
hop a raison de me rappeler
/etc/init.d/functions
: ladaemon
fonction vous permet déjà de définir un autre utilisateur:Ceci est implémenté en encapsulant l'appel de processus avec
runuser
- nous en parlerons plus tard.Jonathan Leffler a raison: il y a setuid en Python:
Cependant, je ne pense toujours pas que vous puissiez définir le guide depuis une machine virtuelle Java.
Ne gérez
su
pasrunuser
correctement le cas où vous demandez d'exécuter une commande en tant qu'utilisateur que vous êtes déjà. Par exemple:Pour contourner ce comportement de
su
etrunuser
, j'ai changé mon script d'initialisation en quelque chose comme:Merci à tous pour votre aide!
la source
Si vous avez l'intention d'écrire votre propre démon, je vous recommande d'appeler setuid (). De cette façon, votre processus peut
la source
Juste pour ajouter d'autres choses à surveiller:
la source
sur une machine virtuelle CENTOS (Red Hat) pour serveur svn: édité
/etc/init.d/svnserver
pour changer le pid en quelque chose que svn peut écrire:et option ajoutée
--user=svn
:Le pidfile original était
/var/run/svnserve.pid
. Le démon n'a pas démarré car seul root pouvait y écrire.la source
Quelques points à surveiller:
J'utilise généralement / sbin / su pour passer à l'utilisateur approprié avant de démarrer les démons.
la source
Pourquoi ne pas essayer ce qui suit dans le script init:
Cela a fonctionné pour moi.
la source
setuid: command not found
J'avais besoin d'exécuter une application Spring .jar en tant que service et j'ai trouvé un moyen simple de l'exécuter en tant qu'utilisateur spécifique:
J'ai changé le propriétaire et le groupe de mon fichier jar en l'utilisateur avec lequel je voulais exécuter. Ensuite, un lien symbolique de ce fichier jar dans init.d et a démarré le service.
Alors:
la source