从另一个会话读取环境变量

从另一个会话读取环境变量
> tmux new -s test
> OK=test
> export OK
> env | grep OK
OK=test
> [control]+[B],[D]
> grep OK /proc/*/environ
> while read P ; do ps eww -p $P | grep OK; done < <(pgrep bash)
> id
uid=0(root) gid=0(root) groups=0(root)

正如你所看到的,我尝试了两件事,但仍在寻找如何从另一个会话(shell 实例)读取环境变量。只有当我在 tmux 中导出并运行某些内容(例如 sleep 999)时,我才能看到该变量。取消共享似乎没有影响。

答案1

除了连接了解 shell 内部结构的调试器并使用这些知识来提取该信息之外,您无法做到这一点。

不,甚至从内部调用getenv("OK")或 也system("printenv OK >/this/tty")可能不起作用,因为大多数 shell 不使用标准 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

相关内容