有没有办法改变的Unix的另一个进程的环境变量?有没有办法改变的Unix的另一个进程的环境变量?(I

2019-05-08 23:04发布

在Unix上,是没有什么办法,一个进程可以改变另一个人的环境变量(假定他们都是由同一个用户运行的)? 一般的解决方案是最好的,但如果没有,哪里一个是另一个的孩子的具体情况是什么?

编辑:如何通过GDB?

Answer 1:

通过GDB:

(gdb) attach process_id

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

(gdb) detach

这是一个相当讨厌的黑客,只应在调试方案的背景下完成的,当然。



Answer 2:

你也许可以做到这一点在技术上(见其他答案),但它可能帮不了你。

大多数程序会想到包膜增值经销商不能从外部启动后更改,因此最可能只是读他们在启动时感兴趣的VAR和初始化基于这一点。 因此,改变它们以后不会有所作为,因为程序将永远不会再阅读。

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



Answer 3:

实质上,没有。 如果你有足够的权限(根,或左右)和戳周围的/ dev / kmem的(内核内存),和您更改了进程的环境,如果过程实际上重新引用的环境变量之后(也就是过程不是已经采取的环境变量的副本,并没有使用只是复印件),那么也许,如果你是幸运和聪明,清风拂面在正确的方向,和月亮的相位是正确的,也许,你可能实现的东西。



Answer 4:

我能想到的,而人为的方式来做到这一点,它不会随意处理工作。

假设你写它实现了“的char * getenv的”自己的共享库。 然后,您设置了“LD_PRELOAD”或“LD_LIBRARY_PATH” ENV。 瓦尔这样既你的流程预装共享库运行。

这样一来,你就基本上是有过“GETENV”函数的代码控制。 然后,你可以做各种讨厌的把戏。 你“GETENV”可以咨询外部配置文件或SHM段的ENV瓦尔的替代值。 或者你可以做正则表达式搜索/所请求的值替换。 要么 ...

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



Answer 5:

引用杰里皮克:

你不能教老狗新把戏。

你能做的唯一的事情就是开始更改子进程的环境变量:它得到父环境的副本,对不起。

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

关于使用/ proc答案只是一个评论。 linux下的/ proc支持,但是,它不工作,你不能改变/proc/${pid}/environ文件,即使你是根:那绝对是只读的。



Answer 6:

或者让你的程序来更新新工艺,然后是一个配置文件:

  • 对新工艺进行杀-HUP重新读取更新的配置文件,或
  • 有过程检查更新配置文件飘飞。 如果发现变化,然后重新读取配置文件。

HTH。

干杯,



Answer 7:

还不如就我所知。 真的是你正在试图从一个过程到另一个客观上要求的IPC方法之一(共享内存,信号量,插座等)进行通信。 具有这些方法,那么你可以设置环境变量或者更直接地执行其他操作一个接收到的数据。



Answer 8:

如果您的UNIX支持/ proc文件系统,那么它的琐碎来读取ENV - 你可以阅读环境,命令行,和任何过程的许多其他属性你自己的方式。 改变它......嗯,我能想到的办法,但它是一个坏主意。

更普遍的情况......我不知道,但我怀疑有一个便携式的答案。

(编辑:我原来的答复假设OP想读的包膜,不能改变它)



Answer 9:

UNIX是全进程间的通信。 检查您的目标实例有一些。 乌思正在成为“桌面” IPC标准。

我更改使用真棒,客户端是一个Lua代码乌思“发件人”真棒窗口管理器的内部环境变量。



Answer 10:

没有一个直接的答案,但... 雷蒙德陈的[基于Windows]理解决这个只有一天 : -

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

不存在是不跟踪的,你不需要信息的原则的结果。 内核有没有需要获得另一个进程的命令行。 这需要传递到命令行CreateProcess功能,并将其复制到进程的地址空间正在启动,在一个位置GetCommandLine函数可以找回。 一旦进程可以访问自己的命令行,内核的职责就完成了。

由于命令行复制到进程的地址空间,进程甚至可能写入该持有命令行的内存并对其进行修改。 如果出现这种情况,那么原来的命令行就永远失去了; 已知的唯一副本得到改写。

换句话说,任何这样的核心设施将被

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

然而,最可能的原因很简单,就是有这样的设施有限的使用情况。



文章来源: Is there a way to change the environment variables of another process in Unix?