On Unix,是否有任何方式的一个进程可以改变另一方的环境变量(假设他们都是由相同的用户)?一般的解决方案将是最好的,但如果没有,什么有关特定情况下哪一个是孩子的其他?

编辑:怎么样通过广?

有帮助吗?

解决方案

通过gdb:

(gdb) attach process_id

(gdb) call putenv ("env_var_name=env_var_value")

(gdb) detach

这是一个非常讨厌的黑客攻击,当然应该只在调试场景的环境中完成。

其他提示

你可能在技术上可以做到(见其他答案),但它可能对你没有帮助。

大多数程序都希望启动后无法从外部更改env变量,因此大多数人可能只是在启动时读取他们感兴趣的变量并基于此进行初始化。因此,之后更改它们不会产生任何影响,因为程序永远不会重新读取它们。

如果您将此作为一个具体问题发布,您应该采取不同的方法。如果只是出于好奇:好问题: - )。

基本上没有。如果你有足够的权限(root或其左右)并且在/ dev / kmem(内核内存)周围进行了调整,并且你对进程的环境进行了更改,并且之后进程实际上重新引用了环境变量(即进程)还没有拿过env var的副本并且没有使用那个副本),那么也许,如果你是幸运和聪明的,风正朝着正确的方向吹,月亮的相位也许是正确的,也许,你可能会有所成就。

引用Jerry Peek:

  

你不能教老狗新手法。

你唯一能做的就是在开始之前更改子进程的环境变量:它获取了父环境的副本,抱歉。

请参阅 http://www.unix.com.ua/orelly /unix/upt/ch06_02.htm 了解详情。

关于使用/ proc的答案的评论。在linux / proc下支持但是,它不起作用,你不能更改 / proc / $ {pid} / environ 文件,即使你是root用户:它是绝对只读。

我可以想到这样做的相当人为的方式,它不适用于任意过程。

假设您编写了自己的共享库,它实现了'char * getenv'。然后,设置'LD_PRELOAD'或'LD_LIBRARY_PATH'env。 vars,以便在预先加载共享库的情况下运行两个进程。

这样,您基本上可以控制'getenv'函数的代码。然后,你可以做各种令人讨厌的技巧。您的'getenv'可以查询外部配置文件或SHM段以获取env vars的备用值。或者您可以对请求的值执行regexp搜索/替换。或者......

我想不出一个简单的方法来为任意运行的进程(即使你是root用户)做到这一点,而不是重写动态链接器(ld-linux.so)。

或者让你的过程,以更新配置文件的新的进程,然后可以:

  • 执行一个杀HUP在新的过程来重读的更新配置文件,或者
  • 有的过程中检查的配置文件的更新。如果改变被发现,然后再读的配置文件。

据我所知。你真的想从一个进程通信到另一个进程,它需要一个IPC方法(共享内存,信号量,套接字等)。通过这些方法之一接收数据后,您可以更直接地设置环境变量或执行其他操作。

如果你的unix支持/ proc文件系统,那么读取env是微不足道的 - 你可以通过这种方式读取环境,命令行和任何进程的许多其他属性。改变它......好吧,我可以想办法,但这是一个不好的想法。

更一般的情况......我不知道,但我怀疑是否有便携式答案。

(编辑:我的原始答案假设OP想要阅读env,而不是更改它)

UNIX充满了进程间通信。检查您的目标实例是否有一些。 Dbus正在成为“桌面”的标准。 IPC。

我使用 awesome-client 更改了Awesome窗口管理器内的环境变量,其中包含Dbus“sender”。 lua代码。

没有一个直接的答案是... 雷蒙德*陈有一个[基于Windows的]理由围绕这个只有一天 :-

...虽然肯定不支持的方法或方式的工作与援助的一个调试器,没有什么是支持方案的访问另一进程的命令行,至少没有提供核心。...

没有是的后果的原则,没有跟踪信息的,你不需要。核不需要获得命令行的另一个进程。它需要的命令行传递给 CreateProcess 功能,并将其复制进入地址空间的过程中正在发起,在一个位置 GetCommandLine 功能可以检索它。一旦这一进程可以访问其自身的命令行,核心的责任正在做。

由于该命令行复制进程的地址空间,则该进程可能会甚至写信给内存持有的命令行和修改。如果发生这种情况,那么原始命令的行为永远消失;唯一已知的复制得到复盖。

换句话说,任何这样的核设施就是

  • 难以实现
  • 潜在的安全问题

但是最可能的原因是只有有限的使用情况对于这样的设施。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top