运行 unshare 时的环境变量

运行 unshare 时的环境变量

是否有任何名称空间(进程、用户等)来隔离环境变量?

如果有的话,当你发生时会发生什么unshare?他们会被克隆吗?如果流程更改现有变量会发生什么?

编辑:我正在使用Ubuntu

答案1

您不需要任何命名空间来隔离环境变量。它们对于每个进程来说已经是隔离的和私有的。修改子进程中的环境变量不会传播到其父进程。

Unix 中的环境变量只是存储在进程地址空间中的一堆字符串。当一个进程分叉时,它的子进程将“继承”它们的副本以及整个地址空间,并且当程序执行另一个程序(并替换地址空间的整个内容)时,它们必须作为参数显式传递envp给系统execve(2)调用(如果要保留它们)。

如果你想启动一个进程空的环境,您可以将其启动为

env - cmd ...

这只会调用execve("/path/to/cmd", ["cmd", ..., NULL], [NULL]).

或者在仅包含以下内容的环境中运行它FOO=bar

env - FOO=bar cmd ...

clone(2)影响系统调用 ( 、unshare(2)setns(2)) 和命令行实用程序的命名空间unshare(1)都不会以任何特殊方式考虑或影响环境。


注意:这是 Unix 中的工作原理,而不是某种自然法则。在其他系统上,例如 plan9(命名空间的概念起源于其中,但所有命名空间基本上都是命名空间,因为一切都有一个文件/系统)环境只是默认安装的文件系统/env,与 Unix 相反,共享默认情况下父母和孩子之间。

答案2

中的环境变量bash仅作用于 shell 的特定实例,因此无需为它们定义单独的命名空间。

如果您同时打开两个终端窗口(在桌面环境中),您可以清楚地看到这一点。在其中之一创建一个新的环境变量,例如:

TEST_VAR=34

它不会出现在bash另一个终端窗口的会话中。

相关内容