有没有办法找出哪些环境variables是需要/使用的可执行文件?

我有一个C ++程序,它将以root身份运行某些特定的命令。 之所以需要,是因为在Node.js下运行的另一个程序需要执行诸如设置系统时间,设置时区等需要root权限才能完成的事情。 在使用setuid命令之后,我正在使用C ++中的函数execve以root特权进行系统调用。 我特别selectexecve命令,因为我想隔离环境,所以我不创build一个环境variables的漏洞。

setuid(0); execve(acExeName, pArgsForExec2, pcEnv); 

我想要做的是准确找出pcEnv,这是我的程序需要执行的程序的环境variables列表。 例如,如果我想运行time-admin这个工具,就好像我是从控制台运行它一样,我怎样才能找出它需要的环境variables。 我知道我可以使用命令printenv打印环境variables,但这给了我所有的人。 我很确定我不需要它们,并希望尽可能小。

我知道我可以全部使用它们,然后慢慢评论每一个,看看它是否继续工作,但我真的宁愿不去那么远。

任何人都有一个聪明的方法来找出一个程序使用什么样的环境variables? 我应该添加我在Ubuntu 12.04 LTS安装上做这个。

谢谢你的帮助。

没有一般的方法来计算某些程序使用的环境variables。 例如,可以想象一个程序有一些configuration文件给出了环境variables的名称。

实际上,许多shell程序(或脚本解释器)正在这样做。

更一般地说,可以计算getenv(3)的参数。 所以理论上你不能猜测它的可能值。 (我可能是错的,但是libcbash一些非常旧的版本用来玩这种技巧;不幸的是,我忘记了细节,但是有时会使用名称中带有一些pid号的环境variables)。

而且,正如其他人所说,你可能想要使用ltrace (或者玩LD_PRELOAD技巧)或者使用gdb来找出getenv是如何被调用的。

而应用程序也可能使用environvariables(请参阅environ(7) …)或第三个参数为main ….

然而,在实践中,合理编写的程序应清楚地logging它正在使用的所有环境variables。

如果你有权访问程序的源代码,那么你可以使用MELT插件 (刚刚发布的版本1.0),如果它是由GCC编译的话。 MELT是扩展GCC的领域特定语言,可用于在编译程序时探索由GCC处理的内部Gimple表示。 特别是对于新的findgimple模式,您可以在一个命令中find所有对getenv的调用,使用一个常量string。