如何设置环境变量全部用户即使是没有登录的?
特别是,我想设置一个 env 变量,其中包含将在用户脚本和 Web 服务器中使用的路径(www-data 是 nologin shell 用户,然后无法从 PAM 的 /etc/environment 或 /etc/profile 中受益,类似)
答案1
假设您使用默认的 init 系统:
https://www.freedesktop.org/software/systemd/man/systemd-system.conf.html
默认环境=
设置传递给所有已执行进程的管理器环境变量。获取以空格分隔的变量赋值列表。有关环境变量的详细信息,请参阅environ(7)。
例子:
DefaultEnvironment="VAR1=word1 word2" VAR2=word3 "VAR3=word 5 6"
设置三个变量“VAR1”、“VAR2”、“VAR3”。
这里的“所有执行的进程”是指 systemd 执行的所有进程。一般来说,所有进程要么由 systemd 启动,要么是该进程的子进程。但请小心这一点,否则您可能必须使用等来恢复系统init=/bin/sh
:-)。
某些进程可能会清除其环境变量,或进行取代这些环境变量的分配。我认为用户登录(PAM?)将是一个重要的例子。
正如您所说,您可以使用pam_env
/覆盖所有 PAM 会话/etc/environment
。
答案2
如果您的意思是所有用户 - 同一用户,启动服务,登录和不登录 - 您应该通过 systemd 设置变量。在我的系统上,我尝试编辑$HOME/.profile
,但这仅影响登录用户。我将展示我的 zabbix-agent 和 PATH 变量的示例。
有EnvironmentFile
在默认服务单元中使用参数的做法。在您的单元文件中搜索此条目并编辑/创建指定的文件。您可以在 的输出中找到单元文件的名称systemctl status zabbix-agent
。以格式指定变量VARIABLE=value
。
EnvironmentFile
如果您的单位中没有,那么您可以覆盖默认的 systemd 单位。
systemctl edit zabbix-agent.service
然后写
[Service]
Environment="PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/pgsql-9.6/bin"