如何在OS X Mavericks上设置系统范围的环境变量


36

我们曾经用来/etc/environment在Mountain Lion上设置系统范围的环境变量。但是,似乎不再读取此文件。

理想情况下,该解决方案应适用于所有用户,并且我们需要它与ssh控制台会话一起使用。所以我们需要这个工作

ssh user@mavericks-machine 'echo $MY_ENV_VAR'

到目前为止,我们已经尝试:

  • /etc/launchd.conf

    适用于所有用户,但仅适用于“窗口式”应用程序,即在终端中使用,但不适用于ssh会话。

  • ~/.profile~/.bash_profile等等。

    仅适用于贝壳

有什么建议么?


/etc/environment无法读取文件(),因为它不是任何跨系统标准-它只是Linux PAM工具的一部分。Mac OS X不是Linux,也不使用PAM,据我所知也没有使用其他操作系统。您之所以放弃它,是因为您显然在Linux上。是的,它仍然是读取-被Linux ;-)
AMN

Answers:


18

在Mavericks之前的正确文件是~/.MacOSX/environment.plist。不再支持。

在达尔文,因此在Mac OS X中,设置这些参数的适当位置/etc/launchd.conf适用于所有进程。如果与用户外壳特别相关,则根据相关外壳使用适当的外壳文件。有关更多信息,请参见launchd.conflaunchctl手册页。

那个...

如果您的目标是明确将它们应用于ssh会话,那么出于安全原因,您需要知道ssh不会以这种方式应用环境变量。实际上,ssh会话通常会从OS接收更为严格的环境变量集,因为它不是所谓的“登录”或“交互”外壳,而是被归类为“非交互”外壳。(有关man bashshell类型的更多信息,请参见。)ssh处理环境变量的方式在ssh / sshd文档和手册页中都有介绍。

对于ssh(这是它自己的外壳,类似于bash),会话的环境变量存储~/.ssh/environment为每用户等效项,将其设置为bash或csh等在其相关的启动文件中。尽管您没有详细说明为什么要在原始帖子中全局分配ENV,这可能是您要为用户ssh会话设置ENV变量的地方,这将有助于提供解决方案。我建议您在每个用户的基础上显式设置它们,以遵循最少的限制特权/属性最佳实践,根据每个帐户分别维护适当的安全性。

如果出于某种原因您希望忽略此设置的安全性,请PermitUserEnvironment在ssh配置中进行设置。请注意,如果UseLogin启用,则禁用此功能。重要说明:请注意,这意味着设置为/bin/false用作外壳程序的用户帐户-一种禁用用户帐户的典型方法-现在可能会绕过此限制,并且可能变为活动状态,这很危险。为了/bin/false安全起见,许多帐户都将用作其外壳。

最重要的是,您不应该在全局范围内这样做,并且出于安全原因,期望ssh传播ENV。您的问题实际上是有目的地询问如何消除出于安全原因而存在的几种机制。


非常详细的答案(+10)我也很喜欢这个结论:)欢迎光临!
罗斯,2014年

我建议,出于安全方面的警告,确实确实有这样做的正当理由。这完全取决于您的威胁模型。如果您要设置一组自动化测试机器,则可能需要这样做。
uchuugaka '16

2
根据stackoverflow.com/a/26311753/1081043/etc/launchd.conf自OSX 10.10 Yosemite起不再起作用。
wisbucky

10

如果使用bash,则在中设置环境变量/etc/profile将适用于所有用户。

重点bash介绍OS X Mavericks手册(与以前的版本相同):

当bash作为交互式登录shell或具有--login选项的非交互式shell被调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。读取该文件后,它将按该顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在的且可读的第一个命令中读取并执行命令。
...
如果使用名称sh调用bash,它会尝试尽可能模仿sh的历史版本的启动行为,同时还要符合POSIX标准。当作为交互式交互式活动登录外壳程序或具有--login选项的非交互式外壳程序调用时,它首先尝试从/ etc / profile中读取和执行命令 和〜/ .profile,按此顺序。


5

您(以及其他发现此问题的人)几乎肯定会在寻找以下路径:

/private/etc/paths

/private/etc/paths.d如果您要避免更改主系统默认的“路径”配置文档,则始终可以将编辑内容放入,但是它们将被追加到$PATH变量的末尾,因此,如果要在$PATH(到覆盖默认的系统实用程序),您只需编辑主/private/etc/paths文件本身,然后将其添加到列表的顶部。例如,我对一个文件夹执行此操作,在该文件夹中存储了一些我自己编写的脚本以及一些关键实用程序,例如mozjpeg,我希望系统始终使用它而不是它附带的默认值(这样,几乎任何程序保存的所有jpeg文件都会自动压缩,比常规系统cjpeg实用程序会压缩它们多10%-我是我已经读过它在大多数系统上不是默认的原因是因为它慢得多,但是当您说的是0.14秒而不是0.02秒时,“慢7倍”并不意味着什么任何东西...当然,假设这不是服务器)。我知道很多人可能会警告在系统中进行深层编辑的潜在“危险”,但是我想说,如果您正在寻找这样的答案,那么您可能足够了解任何实用程序命名将来可能发生的冲突,/private/etc/paths确实确实将它们传播给了所有可能的用户/登录名/实例-所有程序,shell等都将使用该文件中的路径来构建其$PATH变量的基础。

老实说,我很惊讶这里没有其他人提到这一点。所有与SSH特定用途的发布和干扰有关的事情都令人迷惑不解...这是任何搜索此基本问题的人真正寻找的解决方案-干净,直接源代码,始终有效的解决方案。

顺便说一句,如果您想知道,在OS X /etc上只是与的符号链接/private/etc,因此您可以轻松地进行操作sudo nano /etc/paths并到达相同的确切位置。上面的路径只是文件的完整实际路径。


2
除非我缺少任何东西,否则只会设置一个系统范围的环境变量- $PATH。在OP似乎在寻找一个通用的解决方案-设置任何的环境变量,系统范围的,如$EDITOR
约翰ñ

即使使用该sudo命令,在macOS Sierra中,如果尝试使用包含路径添加项echo的新文件来创建文件,也会获得拒绝权限/private/etc/paths.d。但是它可以首先创建文件,然后用于sudo mv将文件移动到/private/etc/paths.d
Murray

这有帮助。尽管在我的目录中设置了$ PATH,其他目录也被添加到了我的PATH中~/.zshrc……罪魁祸首的确是/private/etc/paths我必须更新此文件。谢谢。
非存在

1

我有一个类似的问题,特别~/.bashrc是当我通过SSH连接到我的计算机时,不是源代码。我发现更改SSHd的配置设置可以解决问题。也许您的问题还在于SSH守护程序?

修改SSH服务的配置文件,如下所示:

# /etc/sshd_config
PermitUserEnvironment yes

然后在“系统偏好设置”>“共享”中重新启动“远程登录”服务。

sshd_config联机帮助页:

 PermitUserEnvironment
         Specifies whether ~/.ssh/environment and environment= options in
         ~/.ssh/authorized_keys are processed by sshd(8).  The default is
         ``no''.  Enabling environment processing may enable users to
         bypass access restrictions in some configurations using mecha-
         nisms such as LD_PRELOAD.

(以防万一,我已经在个人Wiki上写下了如何测试的方法)


1

如果其他人搜索如何为从常规图形登录会话开始的进程设置环境变量,则可以使用/etc/launchd.conf。例如,要添加/usr/local/bin到默认路径,请运行

echo setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin|sudo tee -a /etc/launchd.conf

然后重新启动以应用更改。应用更改的另一种方法是运行launchctl</etc/launchd.conf;sudo launchctl</etc/launchd.conf和重新启动流程。


/etc/launchd.conf不再在启动时使用。
uchuugaka '16

2
/etc/launchd.conf自OSX 10.10 Yosemite以来不再受支持
wisbucky

0

嗯...从Mac OS X 10.10.5或更早的版本开始,man -s5 launchd.conf我们告诉我们:“ launchd.conf is no longer respected by the system.”我现在正在进行太多工作,无法在文件中放置一个虚拟变量,然后重新启动以查看其是否确实起作用全部,但是文档说它不起作用。

我很确定不会。这样做man launchctl,您会看到:“ The /etc/launchd.conf file is no longer consulted for subcommands to run during early boot time; this functionality was removed for security considerations.

可以做的就是将您想要全局化的所有环境变量放入某个文件中,也许environment是为了与Linux保持一致,或者(如果Apple后来决定对此做某事–您永远不知道)environment.conf,就像我所做的那样,然后通过/etc/profile

if [ -f /etc/environment.conf ]; then
   source /etc/environment.conf
fi

或者,如果您更喜欢紧凑格式:

if [ -f /etc/environment.conf ]; then . /etc/environment.conf; fi

如果您使用的不是bash,而是其他外壳程序,并且它使用与bash 相同的变量设置语法(我认为zsh也是如此),则还需要从该外壳程序的系统范围rc文件(例如/etc/zshrc)中获取该文件。如果您使用的外壳程序使用其他语法,例如tcsh,则需要为该外壳程序维护一个类似的文件,并从该外壳程序的系统范围rc文件中获取该文件(例如/etc/csh.cshrctcsh),或者更好地创建一个脚本该文件会自动生成,因此您只需编辑一个文件即可添加/更改变量。这里不是本教程的地方;在Google上花了几秒钟的时间,如何将[t] csh变量导出转换为bash语法,请访问https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash-to设置环境,因此可能还有其他方向可用。

根据我的经验,Mac OS X越来越远离可预测的rc文件行为。从至少10.8开始,它似乎不再加载/etc/rc.common/etc/rc.conf/etc/rc.<anything>(也至少从10.9起)不再/etc/bash.bashrc为交互式非登录外壳程序加载(它肯定应该这样做,就像~/.bashrc从10.10开始为它们加载一样)。 。然后我又重新安装了Fink,MacPorts和Homebrew,所以也许其中之一正在干扰默认的dotfile行为。YMMV。


问题是对于较早的OS X,还会有其他示例,例如apple.stackexchange.com/questions/215932/…供以后使用
user151019 2015年

我的帖子部分针对小牛(10.9)和10.10。如果您的意思是10.10 完全是一个关于10.9的主题中的verboten主题,那么我不确定为什么您将我定向到10.11线程,其中10.10也将是非主题的(如果所讨论的线程无效并且仍然关闭)。大声笑。
S. McCandlish
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.