Вы не можете сделать это, кроме как подключиться к отладчику, знающему о внутренней структуре вашей оболочки, и использовать эти знания для извлечения этой информации.
Нет, даже вызов getenv("OK")
или system("printenv OK >/this/tty")
изнутри может сработать, потому что большинство оболочек не используют стандартные функции libc для управления средой и запускают команды, явно передавая список окружения в качестве аргумента execve()
.
Среда из /proc/PID/environ
— это среда, которая была передана при запуске процесса, с учетом того, что она могла быть изменена процессом намеренно или непреднамеренно.
Например, этот (UB -, запускающий )C-код, "добавит" WTF=help
к /proc/PID/environ
, который может быть возвращен или не возвращен getenv()
или передан дочернему элементу, в зависимости от о том, когда и как были вызваны setenv()
или putenv()
:
% cat a.c
#include <string.h>
#include <unistd.h>
int main(int argc, char **argv)
{
memcpy(argv[argc + 1], "WTF=help", 9);
pause();
}
% cc a.c
%./a.out &
[4] 3445
% tr '\0' '\n' </proc/3170/environ | head -n1
WTF=help