すべてのサービスに対してグローバル環境変数を設定するには?

すべてのサービスに対してグローバル環境変数を設定するには?

DefaultEnvironment=inを使用すると可能であることがわかりました/etc/systemd/system.conf。しかし、式拡張が利用可能かどうかはわかりませんPATH=$PATH:/whatever/path

それでは、グローバル基本サービス環境はどのように設定する必要がありますか?そして表現拡張?

答え1

PATHデバイスからシェルコマンドを呼び出すと、設定や他の場所に対する他の回答が機能する可能性があります。/etc/environmentしかし、以下を実行しようとすると:

ExecStart=mycommand

mycommandそしてからエクスポートしようとすると動作$PATHしません。これらの問題を解決するsystemdためには使用されません。$PATHコンパイル時に定義されたパスのリストを使用します。

~からシステムサービス:

コマンドがフル(絶対)パスではない場合は、コンパイル時に決定された固定検索パスを使用してフルパスとして解決されます。検索されたディレクトリには、パーティション/usr/bin/および/bin/ディレクトリを使用するシステムの/usr/local/bin/、/usr/bin/、/bin/、パーティションbin/および/bin/ディレクトリを使用するシステムの/usr/local/bin/ が含まれます。 sbin/ sbin/ 対応するディレクトリ。したがって、実行可能ファイルが「標準」ディレクトリにある場合にのみ実行可能ファイル名を使用することは安全であり、他の場合は絶対パスを使用する必要があります。あいまいさを避けるために絶対パスを使用することをお勧めします。ヒント:この検索パスを照会できますsystemd-path search-binaries-default

ベストプラクティスは、Exec*=フィールドを使用するときに絶対パスを使用することです。これにより必要性がなくなり、$PATH他の人に他の場所にバイナリを追加してもサービスの動作は変わりません/usr/local/bin。通常、テンプレート以外のサービスは動的に設計されていません(ローカル環境に応じてコンテンツや意図を変更するように設計されています)。

答え2

これを行うことができる場所がいくつかあります。

systemdのマニュアルページは、試した方法でパスに追加できることを示していません。また、他のメカニズムがパスを置き換えて、system.confから値を消去することもできます。また、パスが空の場合、この方法でパスに追加しようとすると、パスに「.」に変換される空のディレクトリが残り、パスに現在のディレクトリを含めることは安全な脆弱性と見なされます。 、とにかくこれはおそらく悪い考えです。

systemdを使用しているので、おそらくpam_envも使用しているでしょう。このツールはおよびで環境変数を設定し、/etc/environmentこれら/etc/security/pam_env.confの変数は変数の置き換えをサポートしていますが、セキュリティの脆弱性に関する上記の注意事項を参照してください。

グローバルサービスの変数を設定したいと思いました。ただし、シェル用に設定したい場合は、/etc/profile.d/sh、bash、zsh、およびおそらく他のもの(cshではない)で動作するものを追加できます。このディレクトリにあるスクリプトはソースであり、パスがすでに設定されているため、追加しても安全です。ただし、これはログインシェルでのみ機能できます。

関連情報