Intereting Posts
Почему непривилегированные пользователи не могут вкладывать монтирования FUSE, но они могут монтировать FUSE внутри NFS с помощью root_squash? Apache отказывается запускать любой порт Формирование трафика с графическим интерфейсом Почему никто не использует истинную оболочку Bourne как / bin / sh? /etc/ld.so.conf не содержит / usr / lib Как добавить строки файла в конец строк другого файла? отклонить любое письмо к данному приложению и его детям несколько пользовательских типов / правил доступа для OpenVPN на CentOS 7 и firewalld сторожевой таймер и системный сторожевой таймер медленная передача файлов через последовательный порт с кошкой Установить переменную на случайный элемент в массиве Как я могу понять, почему Xorg является SIGALRM и использует 90% + CPU? Внедрить сетевой мост в качестве пользовательской программы? Что такое поле Archive в файле Release, для которого используется? Найдите файл с определенным словом внутри этого файла.

Текущие переменные среды процесса

Этот вопрос связан с этим ответом .

Можно ли получить текущие (не начальные) переменные среды процесса, выполнив дочерний процесс и проверив его первоначальные переменные среды?

Идея состоит в том, что начальная среда дочернего процесса унаследована от текущей среды родителя.

Среда представляет собой список строк, передаваемых по execve вызову execve , так же, как и список аргументов. Период. Что приложения делают с этим списком строк, которые он получает, зависит от приложения.

Теперь, по соглашению, этот список обычно используется иначе, чем список аргументов. Обычно программы запоминают список переменных среды, которые они получают, и повторно используют их при выполнении другой команды.

У них есть функции библиотеки C, чтобы помочь им в этом: среда становится доступной как переменная среды, и вы можете получить и изменить этот список (копию списка полученных переменных окружения) с помощью getenv , setenv , putenv , и такие функции, как execvp , execl , system , popen … используют эту переменную execl при выполнении команд (вызов execve с environ они отслеживают).

Теперь приложениям не нужно использовать этот API. Они могут использовать свой собственный способ управления списком переменных окружения. Например, оболочки, переменные окружения карты и переменные оболочки, и, вероятно, не будут использовать функции putenv / setenv libc. perl имеет свой ассоциативный массив %ENV и т. д.

Вы всегда можете использовать gdb для присоединения к процессу и сделать его system("env > /tmp/some-file") вызова system("env > /tmp/some-file") (при условии, что они динамически связаны с libc), но у вас нет гарантии, что env получит в той же среде, что и другая команда, если команда, к которой вы присоединяетесь, выполняла ее по-своему (например, подумайте о оболочках). (также обратите внимание, что system() запускает оболочку (для интерпретации командной строки), и оболочки могут изменять свою среду при запуске (попробуйте, например, env -i sh -c env ).

 $ sleep 100 & [1] 17098 $ gdb --pid=$! /bin/sleep [...] (gdb) p environ[0] $1 = 0x7fffd722d227 "STY=7498.pts-0.hostname" (gdb) p environ[1] $2 = 0x7fffd722d245 "TERM=screen-bce" (gdb) call system("env > /tmp/some-file") $4 = 0 (gdb) detach Detaching from program: /bin/sleep, process 17098 (gdb) quit $ cat /tmp/some-file GNOME_KEYRING_PID=6850 SSH_AGENT_PID=6844 SHLVL=1 [...] 

Если вы используете Linux или один из Unix, у которого есть файловая система /proc , среда процесса находится в одном из файлов процесса в разделе /proc . У меня нет доступа к машине Solaris прямо сейчас, но для Linux это сработало:

 $ tr '\0' '\n' < /proc/$$/environ 

Это печатает переменные среды текущей оболочки, но $$ может быть любым идентификатором процесса, к которому имеет доступ ваш идентификатор пользователя.

В Solaris был способ сделать это, но это было намного сложнее. Я думаю, что у BSD есть /proc более похожие на Linux.