我知道getenv()返回当前用户的指定环境变量的值,但我的代码需要root权限,因此getenv()只会使用sudo环境变量。我也知道SUDO_USER告诉哪个用户正在调用sudo,这是我想用于getenv()的用户环境。
char* gnome_env_var = getenv("GDMSESSION"); //returns null as not found in sudo env
char* usr = getenv("SUDO_USER");
有没有办法可以为登录用户获取环境变量的值,而不是sudo环境?
修改 好的,所以我听到的是环境变量集对于每个进程都是唯一的,而不是用户,并使用sudo来调用具有root权限的进程调用execve,这可以为该进程创建一组全新的环境变量。那么换句话说,除了搞乱sudoers文件之外,还有一种方法,在当前进程中,找到调用进程的环境变量?
我特别需要GDMSession环境变量。
答案 0 :(得分:6)
getenv
没有告诉您当前用户的环境变量,而是当前的进程。用户可以随意拥有任意数量的环境(并且可以创建进程),例如内置export
shell。在每次调用execve
时,调用程序都可以自由地为执行过程创建一个全新的环境。
因此,无法获取用户的环境变量,甚至无法获取执行sudo的进程的环境变量。 为什么你还想要吗?
但是,您可以通过/etc/sudoers
中的keep_env
和reset_env
指令配置 sudo来保留部分或全部环境变量。
答案 1 :(得分:4)
没有“用户环境”。 每个进程都有自己的环境变量副本。它们甚至不会自动继承 - 它们出现是由shell和C库维护的错觉。将它们视为每个程序的第二组命令行参数更为准确。
所以在我们回答你的问题之前,你需要清楚你的意思!有可能 - 它们都不是优雅的,但它们确实存在 - 但它们主要取决于你想要在哪个环境变量中处理哪个过程的状态和原因。