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ではない)で動作するものを追加できます。このディレクトリにあるスクリプトはソースであり、パスがすでに設定されているため、追加しても安全です。ただし、これはログインシェルでのみ機能できます。