在Unix上,有没有办法让一个进程可以改变另一个进程的环境变量(假设它们都是由同一个用户运行)?一般的解决方案是最好的,但如果没有,那么一个人是另一个人的孩子的具体情况怎么样?
编辑:通过gdb怎么样?
通过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下支持但是,它不起作用,即使你是root用户也无法更改/proc/${pid}/environ
文件:它绝对是只读的.
我可以想到这样做的相当人为的方法,它对任意过程都不起作用.
假设您编写了自己的共享库,它实现了'char*getenv'.然后,设置'LD_PRELOAD'或'LD_LIBRARY_PATH'env.vars,以便您的进程在预加载共享库的情况下运行.
这样,您基本上可以控制'getenv'函数的代码.然后,你可以做各种令人讨厌的技巧.您的'getenv'可以查询外部配置文件或SHM段以获取env vars的备用值.或者您可以对请求的值执行regexp搜索/替换.要么 ...
对于任意运行的进程(即使你是root用户),我想不出一个简单的方法,而不是重写动态链接器(ld-linux.so).