Lancer le processus en tant qu'un autre utilisateur / groupe (dans le script init.d)

10

J'édite un script init.d. Le script init.d exécute un script utilitaire qui exécute ensuite un processus. À partir de l'un ou l'autre des scripts bash, comment puis-je faire en sorte qu'il lance le processus principal en tant qu'utilisateur et groupe spécifique?

Stéphane Gimenez
la source

Réponses:

12

La manière la plus simple est d'utiliser la commande su (1), elle a une option qui vous permet d'exécuter une commande via le shell de l'utilisateur, exemple:

su foo -c ls

Cela basculera vers l'utilisateur foo et exécutera la commande ls. Si l'utilisateur que vous souhaitez utiliser n'a pas de shell valide (c'est-à-dire qu'il ne se trouve pas dans / etc / shells, comme / bin / false ou / sbin / nologin), vous devrez également spécifier un shell sur la ligne de commande. Exemple avec sortie:

# 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
la source
su ne semble pas aimer que je lui donne de nombreux arguments. Je reçois Usage: su [options] [LOGIN]etsu: unrecognized option '--debug'
Cela ne fonctionne pas exactement. Lorsque j'exécute cette ligne en tant que root, j'obtiens une erreur su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &si je su www-datadéfinis tous les vars et l'exécute ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &fonctionne correctement. Comment résoudre ce problème?
2
@ acidzombie24 suprend un seul argument, qui est une commande shell. Vous devez écrire su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'et vous assurer que MONOSERVERet WEBAPPSsont exportés par le shell parent. (Remarque: ne faites pas cela su … -c "$MONOSERVER …"car cela échouera si l'une des variables contient des caractères spéciaux du shell.) Et si vous avez un lanceur de démon dédié tel questart-stop-daemon , utilisez-le.
Gilles 'SO- arrête d'être méchant'
Gilles: D'accord, je ne remplace pas le script init.d par ce que je suis? Je peux mettre toutes les variables dans un nouveau script et le lancer car ce sera facile et je n'aurais rien à apprendre. Mais qu'est-ce qui est si spécial avec le démon start-stop? Je vais laisser un commentaire sur cette réponse
Est-il préférable d'utiliser su ou su -login? J'ai lu l'homme de su mais je ne peux pas comprendre pour ce cas spécifique
Massimo
4

Si start-stop-daemonest disponible sur votre système, vous devriez probablement l'utiliser et jeter un œil à ses options (en particulier -uet -gdans ce cas).

(Sinon, vous pourriez utiliser une combinaison de suet sg.)

Mise à jour: Voici un exemple tiré d'un /etc/init.d/mpdscript (qui utilise start-stop-daemon):

  • Commande de démarrage:

    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
    

    Tout ce qui suit --est un argument pour le /usr/bin/mpdprogramme lui-même. (La procédure de démonisation est prise en charge par le script start-stop-daemon, il mpdest donc demandé de ne pas s'en soucier --nodaemon.)

  • Commande d'arrêt:

    echo "Stopping Music Player Daemon"
    start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
    

Si mpdon ne baisse pas les privilèges par lui - même, il faudrait ajouter (par exemple) -u mpd, des -g mpdoptions à la start-stop-daemoncommande.

Stéphane Gimenez
la source
Je ne remplace pas le script init.d par start-stop-daemon suis-je? ne serait-il pas plus facile d'utiliser su et un fichier script? Si je remplace init.d, comment l'installer pour qu'il s'exécute au démarrage? qu'est-ce que je passe à start-stop-daemon? -edit- je google des exemples ATM peut-être que je n'aurai pas besoin d'une réponse mais j'ai l'impression que ça va être une réponse complexe
2
Pas de chance. Voici ma ligne. Il fonctionne toujours en tant que root. J'ai vérifié les pages de manuel et je ne sais toujours pas quoi faire à ce sujet. 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