Переменные среды при запуске unshare

Переменные среды при запуске unshare

Существует ли какое-либо пространство имен (процесс, пользователь и т. д.), которое изолирует переменные среды?

Если есть, что происходит, когда вы unshare? Они клонируются? Что происходит, если процесс изменяет существующую переменную?

EDIT: Я использую 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ограничены только определенным экземпляром оболочки, поэтому нет необходимости определять для них отдельные пространства имен.

Вы можете ясно увидеть это, если откроете два терминальных окна одновременно (в среде рабочего стола). Создайте новую переменную среды в одном из них, например:

TEST_VAR=34

Он не будет отображаться в bashсеансе в другом окне терминала.

Связанный контент