【问题标题】:bash export not working for only one variablebash 导出仅适用于一个变量
【发布时间】:2016-05-10 03:38:05
【问题描述】:

有时,当我在 bash 中导出时,它不会出错,但也不会设置环境变量。这就是我的意思:

这行得通:

bash-3.2$ export DYLD=$ABC_HOME
bash-3.2$ env | grep DYLD
DYLD=/Users/my_username/abc_home

但是当我继续时,这些不会:

bash-3.2$ export DYLD_LIBRARY=$ABC_HOME
bash-3.2$ env | grep DYLD
DYLD=/Users/my_username/abc_home

bash-3.2$ export DYLD_L=$ABC_HOME
bash-3.2$ env | grep DYLD
DYLD=/Users/my_username/abc_home

bash-3.2$ export DYLD_=$ABC_HOME
bash-3.2$ env | grep DYLD
DYLD=/Users/my_username/abc_home

知道我可以用什么来解决这个问题吗?

FWIW,其他带下划线的导出按预期工作,但是一旦我添加下划线,这似乎开始失败。

【问题讨论】:

  • 我在这里看不到。这是什么操作系统? OS X 我猜?这是否适用于非DYLD 前缀?这可能是 OS X 的“保护”吗?
  • 我在 OS X 机器上的行为略有不同,但这表明 DYLD 名称有一些特别之处:$ env | grep DYLD dyld:警告,未知环境变量:DYLD_L dyld:警告,未知环境变量:DYLD_LIBRARY
  • 如果您使用export 命令查看rhem,而不是env,您是否看到导出的变量?
  • @jjjkkklllhhh:我认为@Etan 发布的链接是相关的,但我最初的想法(您的回答部分证实了这一点)是从DYLD_ 开始的环境变量正在被环境中清除env 的安装版本(或其他)。
  • @EtanReisner:是的,实际上有文档here。据此,“安装系统文件时,它们会被标记为特殊标志以防止修改......”此外,/bin/usr/bin 等目录也会自动受到保护。最后,“[a]ny 动态链接器 (dyld) 环境变量,例如 DYLD_LIBRARY_PATH,在启动受保护进程时会被清除。”在这里,我认为问题在于env 受到保护。

标签: bash


【解决方案1】:

这似乎是一种 OS X 保护(可能在 El Capitan 中添加),可防止这些(潜在危险)环境变量被导出到衍生进程。

Apple 开发者论坛上的This thread 对此进行了一些讨论。

官方文档here也简要记录了这一点:

生成受系统完整性保护限制的进程的子进程,例如通过在带有NSTask 的捆绑包中启动辅助进程或调用exec(2) 命令,重置该子进程的马赫特殊端口。启动受保护的进程时会清除所有动态链接器 (dyld) 环境变量,例如 DYLD_LIBRARY_PATH

【讨论】:

  • 这确实是在 El Capitan 中添加的,并且可以使用 csrutil enable --without debug 从恢复分区中禁用(--without 选项未记录)。
  • @4ae1e1 完全禁用该功能?是否可以控制特定的可执行文件是否在受保护/受限集中?
  • /System/Library/Sandbox/rootless.conf,但我相信它没有记录,并且conf文件本身在SIP的文件系统保护下(所以你必须先--without filesystem才能对其进行任何更改;甚至那么我不确定是否会接受更改,因为我从未尝试过)。
  • 发现 this Apple Developer Forums thread 据称来自 WWDC 安全和隐私实验室的一些 QA。
【解决方案2】:

试试这个:

oldifs=$IFS
IFS=$'\n'
export DYLD_LIBRARY=$ABC_HOME
env | grep DYLD
IFS=$oldifs

【讨论】:

  • 为什么你认为这会有所帮助? (将解释添加到您的答案中。)
猜你喜欢
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2018-10-09
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
相关资源
最近更新 更多