web-dev-qa-db-ja.com

systemdサービスでユーザーの.bashrcを使用する

スクリプトにsystemdサービスを使用していますが、home/user/.bashrcから環境値を設定する必要があります

source /home/user/.bashrcはスクリプトでは機能せず、systemdシードはソース機能をサポートしていません。助けて

9
user8893236

あなたがしなければならない場合...

EnvironmentFileを生成しようとする代わりに、シェルに起動スクリプトを実行させ、thenコマンドを実行させます。これにより、(envが環境を格納する方法とsystemd EnvironmentFileオプションが環境をロードする方法の間など)不一致を引き起こす可能性のある手順が回避されます。


ターゲットユーザーの起動スクリプトを取得するには:

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

任意のファイルを入手するには:

ここでは、ログインシェルを実行するためにbash -lを使用する代わりに、$0を明示的にソースし、その位置に/home/user/.bashrcを渡します。

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

しかし、しないでください。本当に。

  • .bashrcファイルは通常、インタラクティブな環境をセットアップするためのものです。これは、それらの設定がサービスに適切でないことが多いことを意味します。
  • サービスを手動で監査する別のEnvironmentFileを構築すると、サービスがどのように実行されているかがわかります正確に対話型環境とは別に設定できます。 Ifシェルで実行されたときに同じ意味を持つようにそのEnvironmentFileを手動で監査した場合は、set -a; source /path/to/your-environment-file; set +a.bashrcを実行して、環境変数を取り込むこともできます。
  • セキュリティの観点からは、サービスが実行する実行可能コードをサービスに変更させることは一般的に賢明ではありません-そのような権限を提供することは、サービスに違反した攻撃者が、二次的な権限昇格攻撃がなくても侵害を持続させることができることを意味します。したがって、EnvironmentFile/etc/conf.dのようにユーザーが書き込みできない場所で使用することは、そのユーザーのホームディレクトリにあるドットファイルよりも安全です。
2
Charles Duffy