Les services démarrent par défaut sous la forme root
au 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, quel est le meilleur moyen de faire en sorte que les processus soient exécutés 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é ...
Existe-t-il un peu de magie cachée qui fournit un mécanisme simple pour démarrer automatiquement des services en tant qu'utilisateur non root?
EDIT: J'aurais dû dire que les processus que je lance dans ce cas sont des scripts Python ou des programmes Java. Je préférerais ne pas écrire de wrapper natif autour d'eux, donc je ne peux malheureusement pas appeler setuid () as Black suggère.
Sur Debian, nous utilisons l'utilitaire start-stop-daemon
, qui gère les fichiers pid, modifie l'utilisateur, met le démon en arrière-plan et bien plus encore.
Je ne connais pas bien RedHat, mais l’utilitaire daemon
que vous utilisez déjà (défini dans /etc/init.d/functions
, btw.) Est mentionné partout comme l’équivalent de start-stop-daemon
; il peut donc également modifier l’utilisateur La façon dont vous le faites est déjà la bonne.
Si vous regardez autour de vous, vous pouvez utiliser plusieurs wrappers prêts à l'emploi. Certains peuvent même être déjà emballés dans RedHat. Regardez daemonize
, par exemple.
Après avoir examiné toutes les suggestions ici, j'ai découvert quelques points qui, je l'espère, seront utiles à d'autres personnes dans ma position:
hop a raison de me rappelerat /etc/init.d/functions
: la fonction daemon
vous permet déjàpour définir un autre utilisateur:
daemon --user=my_user my_cmd &>/dev/null &
Ceci est implémenté en encapsulant l’appel du processus Avec runuser
- Plus à ce sujet plus tard.
Jonathan Leffler a raison: Il y a setuid en Python:
import os
os.setuid(501) # UID of my_user is 501
Je ne pense toujours pas que vous puissiez définir le format... À partir de l’intérieur d’une machine virtuelle, cependant.
Ni su
ni runuser
Ne gèrent avec élégance le cas où vous Demandez à exécuter une commande en tant qu’utilisateur que vous êtes déjà. Par exemple.:
[my_user@my_Host]$ id
uid=500(my_user) gid=500(my_user) groups=500(my_user)
[my_user@my_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)
Pour contourner ce comportement de su
et runuser
, j'ai changé mon script init en quelque chose comme:
if [[ "$USER" == "my_user" ]]
then
daemon my_cmd &>/dev/null &
else
daemon --user=my_user my_cmd &>/dev/null &
fi
Merci à tous pour votre aide!
Si vous avez l’intention d’écrire votre propre démon, je vous recommande d’appeler setuid () . Ainsi, votre processus pourra
Juste pour ajouter d'autres choses à surveiller:
sur une machine virtuelle CENTOS (Red Hat) pour svn serveur: édité /etc/init.d/svnserver
pour changer le pid en quelque chose que svn peut écrire:
pidfile=${PIDFILE-/home/svn/run/svnserve.pid}
et ajouté l'option --user=svn
:
daemon --pidfile=${pidfile} --user=svn $exec $args
Le pidfile d'origine était /var/run/svnserve.pid
. Le démon n'a pas commencé car seul root peut y écrire.
These all work:
/etc/init.d/svnserve start
/etc/init.d/svnserve stop
/etc/init.d/svnserve restart
Quelques points à surveiller:
J'utilise généralement/sbin/su pour basculer vers l'utilisateur approprié avant de lancer les démons.
Pourquoi ne pas essayer ce qui suit dans le script init:
setuid $USER application_name
Cela a fonctionné pour moi.
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 remplacé le propriétaire et le groupe de mon fichier jar par l'utilisateur que je voulais exécuter sous le nom .
Alors:
#chown myuser:myuser /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar
#ln -s /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar /etc/init.d/springApp
#service springApp start
#ps aux | grep Java
myuser 9970 5.0 9.9 4071348 386132 ? Sl 09:38 0:21 /bin/Java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar