Answers:
在Mavericks之前的正确文件是~/.MacOSX/environment.plist
。不再支持。
在达尔文,因此在Mac OS X中,设置这些参数的适当位置/etc/launchd.conf
适用于所有进程。如果与用户外壳特别相关,则根据相关外壳使用适当的外壳文件。有关更多信息,请参见launchd.conf
和launchctl
手册页。
那个...
如果您的目标是明确将它们应用于ssh会话,那么出于安全原因,您需要知道ssh不会以这种方式应用环境变量。实际上,ssh会话通常会从OS接收更为严格的环境变量集,因为它不是所谓的“登录”或“交互”外壳,而是被归类为“非交互”外壳。(有关man bash
shell类型的更多信息,请参见。)ssh处理环境变量的方式在ssh / sshd文档和手册页中都有介绍。
对于ssh(这是它自己的外壳,类似于bash),会话的环境变量存储~/.ssh/environment
为每用户等效项,将其设置为bash或csh等在其相关的启动文件中。尽管您没有详细说明为什么要在原始帖子中全局分配ENV,这可能是您要为用户ssh会话设置ENV变量的地方,这将有助于提供解决方案。我建议您在每个用户的基础上显式设置它们,以遵循最少的限制特权/属性最佳实践,根据每个帐户分别维护适当的安全性。
如果出于某种原因您希望忽略此设置的安全性,请PermitUserEnvironment
在ssh配置中进行设置。请注意,如果UseLogin
启用,则禁用此功能。重要说明:请注意,这意味着设置为/bin/false
用作外壳程序的用户帐户-一种禁用用户帐户的典型方法-现在可能会绕过此限制,并且可能变为活动状态,这很危险。为了/bin/false
安全起见,许多帐户都将用作其外壳。
最重要的是,您不应该在全局范围内这样做,并且出于安全原因,期望ssh传播ENV。您的问题实际上是有目的地询问如何消除出于安全原因而存在的几种机制。
/etc/launchd.conf
自OSX 10.10 Yosemite起不再起作用。
如果使用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,按此顺序。
您(以及其他发现此问题的人)几乎肯定会在寻找以下路径:
/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
并到达相同的确切位置。上面的路径只是文件的完整实际路径。
$PATH
。在OP似乎在寻找一个通用的解决方案-设置任何的环境变量,系统范围的,如$EDITOR
等
sudo
命令,在macOS Sierra中,如果尝试使用包含路径添加项echo
的新文件来创建文件,也会获得拒绝权限/private/etc/paths.d
。但是它可以首先创建文件,然后用于sudo mv
将文件移动到/private/etc/paths.d
。
~/.zshrc
……罪魁祸首的确是/private/etc/paths
我必须更新此文件。谢谢。
我有一个类似的问题,特别~/.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上写下了如何测试的方法)
如果其他人搜索如何为从常规图形登录会话开始的进程设置环境变量,则可以使用/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
自OSX 10.10 Yosemite以来不再受支持
嗯...从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.cshrc
tcsh),或者更好地创建一个脚本该文件会自动生成,因此您只需编辑一个文件即可添加/更改变量。这里不是本教程的地方;在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。
/etc/environment
无法读取文件(),因为它不是任何跨系统标准-它只是Linux PAM工具的一部分。Mac OS X不是Linux,也不使用PAM,据我所知也没有使用其他操作系统。您之所以放弃它,是因为您显然在Linux上。是的,它仍然是读取-被Linux ;-)