![从另一个会话读取环境变量](https://linux22.com/image/160111/%E4%BB%8E%E5%8F%A6%E4%B8%80%E4%B8%AA%E4%BC%9A%E8%AF%9D%E8%AF%BB%E5%8F%96%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F.png)
> 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