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。