【发布时间】:2013-11-08 20:31:18
【问题描述】:
我有一个 C++ 程序,它将以 root 身份运行某些非常特定的命令。之所以需要这样做是因为在 Node.js 下运行的另一个程序需要执行诸如设置系统时间、设置时区等需要 root 权限才能完成的事情。在使用 setuid 命令后,我正在使用 C++ 中的函数 execve 以 root 权限进行系统调用。我特地选择了execve命令,因为我想隔离环境,所以我不会创建环境变量漏洞。
setuid(0);
execve(acExeName, pArgsForExec2, pcEnv);
我想要做的是准确地找出 pcEnv,它是我的程序需要的程序执行的环境变量列表。例如,如果我想像从控制台运行工具 time-admin 一样运行它,我如何才能确定它需要哪些环境变量。我知道我可以使用命令 printenv 打印出环境变量,但这给了我所有这些。我很确定我不需要所有这些,并且想要尽可能小的子集。
我知道我可以全部使用它们,然后慢慢评论每一个,看看它是否能继续工作,但我真的不想走那么远。
任何人有一个聪明的方法来弄清楚程序使用了哪些环境变量?我应该补充一下,我是在 Ubuntu 12.04 LTS 安装上执行此操作的。
感谢您的帮助。
【问题讨论】:
-
除非程序在做一些有趣的事情,否则 ltrace 应该很有用
-
@PlasmaHH 有趣的是你的意思是像使用非标准但通常实现的第三个参数到
main(),char *envp[]?因为在那种情况下,如果没有询问作者、阅读文档或查看实际来源,我认为 OP 是一条没有桨的小溪。 -
@WhozCraig:没错,但是我发现 envptr 在现代 C 和 C++ 代码中的使用频率比在更旧的 C 代码中要少得多。但是所有的猜测都比阅读精美的手册更好。
-
从二进制文件中提取
strings,除非二进制文件有一些有趣的事情,应该包括它查找的所有环境变量。对 Node.js 做同样的事情可能会更棘手。
标签: c++ linux node.js environment-variables root