web-dev-qa-db-fra.com

Utilisation du .bashrc d'un utilisateur dans un service systemd

J'utilise le service systemd pour mon script, je dois définir les valeurs d'environnement à partir d'un home/user/.bashrc

source /home/user/.bashrc Ne fonctionne pas dans le script et la graine systemd ne prend pas en charge la fonction d'approvisionnement. Aidez moi

9
user8893236

Si tu dois...

Au lieu d'essayer de générer un fichier d'environnement, demandez à un shell d'exécuter vos scripts de démarrage et puis d'exécuter votre commande. Cela évite les étapes qui peuvent introduire une incompatibilité (entre la façon dont env stocke votre environnement et la façon dont l'option systemd EnvironmentFile le charge).


Pour obtenir les scripts de démarrage de votre utilisateur cible:

[Service]
Type=simple
User=user
Group=user
ExecStart=/bin/bash -l -c 'exec "$@"' _ your-command arg1 arg2 ...

Pour source un fichier arbitraire:

Ici, au lieu d'utiliser bash -l Pour exécuter un shell de connexion, nous source explicitement $0 Et passons /home/user/.bashrc À cette position.

[Service]
Type=simple
User=user
Group=user
ExecStart=/bin/bash -c '. "$0" && exec "$@"' /home/user/.bashrc your-command arg1 arg2 ...

Mais non. Vraiment.

  • Les fichiers .bashrc Sont généralement destinés à la configuration d'environnements interactifs. Cela signifie que leurs paramètres ne sont souvent pas appropriés pour les services.
  • Construire un EnvironmentFile séparé que vous auditez à la main pour votre service signifie que vous savez exactement avec quoi le service fonctionne et pouvez le configurer séparément de l'environnement interactif. Si vous avez audité manuellement ce fichier environnement pour avoir la même signification lorsqu'il est exécuté par un shell, vous pouvez également exécuter set -a; source /path/to/your-environment-file; set +a Dans votre .bashrc Pour extraire ses variables d'environnement.
  • Du point de vue de la sécurité, il n'est généralement pas judicieux de laisser un service modifier le code exécutable qu'il exécute - fournir de telles autorisations signifie qu'un attaquant qui a violé un service peut rendre sa violation persistante même sans aucune attaque d'escalade de privilèges secondaire. Utiliser un EnvironmentFile dans un emplacement non accessible en écriture comme /etc/conf.d Est donc plus sûr qu'un fichier de points dans le répertoire personnel de cet utilisateur.
2
Charles Duffy