如何为所有服务设置全局环境变量?

如何为所有服务设置全局环境变量?

DefaultEnvironment=我已经看到,通过使用in应该是可能的/etc/systemd/system.conf。但是,我不确定是否可以使用表达式扩展PATH=$PATH:/whatever/path

那么,如何设置全局默认服务环境,表达式扩展?

答案1

如果您从设备调用 shell 命令,则有关设置或其他位置的其他答案可能会PATH起作用。/etc/environment但是,如果您尝试运行:

ExecStart=mycommand

而你想mycommand从 导出$PATH,那么这是行不通的。 systemd不用于$PATH解决这些问题。它使用在编译时定义的路径列表。

系统服务:

如果命令不是完整(绝对)路径,则会使用编译时确定的固定搜索路径将其解析为完整路径。搜索的目录包括使用分割 /usr/bin/ 和 /bin/ 目录的系统上的 /usr/local/bin/、/usr/bin/、/bin/,以及使用分割 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这些变量确实支持变量替换,但请参阅上面有关安全漏洞的注释。

您说您想为全局服务设置变量。但如果您想为 shell 设置它,您可以添加一些/etc/profile.d/对 sh、bash、zsh 和可能其他(但不是 csh)有效的内容。放置在该目录中的脚本是来源的,并且应该已经设置了路径,因此附加到该路径是安全的。但是,这可能仅适用于登录 shell。

相关内容