運行 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另一個終端機視窗的會話中。

相關內容