2

我在 c/gtk 中有一个用 gksu 打开的程序。问题是,当我使用 getenv("HOME") 获取环境变量 $HOME 时,它显然会返回“root”。我想知道是否有办法知道谁是执行 gksu 的用户或获取他的环境变量的方法。提前致谢!

4

2 回答 2

2

请参阅手册页。用于gksu -k command...保护环境(特别是PATHHOME)。

或者,就像 Lewis Richard Phillip C 指出的那样,您可以使用gksu env PATH="$PATH" HOME="$HOME" command...来重置命令的环境变量。(逻辑是父 shell 以用户权限运行,替换变量,并env在获得超级用户权限时重新设置它们。)

如果您的应用程序只能以 root 权限运行,您可以编写一个启动器脚本——就像许多其他应用程序一样。脚本本身基本上是

#!/bin/sh
exec gksu -k /path/to/your/application "$@"

或者

#!/bin/sh
exec gksu env PATH="$PATH" HOME="$HOME" /path/to/your/application "$@"

该脚本安装在 中/usr/bin,您的应用程序安装为/usr/bin/yourapp-bin/usr/lib/yourapp/yourapp。意思是exec命令替换了shell;即exec命令之后的任何内容都不会被执行(除非应用程序或命令根本无法执行)——最重要的是,当您的应用程序开始执行时,内存中不会有额外的外壳。

虽然 Linux 和其他类似 POSIX 的系统确实具有有效身份(定义应用程序可能执行的操作)和真实身份(定义正在执行操作的用户)的概念,但gksu会修改所有身份。特别是,虽然getuid()返回真实用户 ID,例如 set-UID 二进制文件,但在gksu使用时将返回零(“root”)。

因此,上述启动脚本是解决您问题的推荐方法。这也是一种常见的;跑

file -L /usr/bin/* /usr/sbin/* | sed -ne '/shell/ s|:.*$||p' | xargs -r grep -lie launcher -e '^exec /'

查看系统上哪些命令是(或声明自己是)启动器脚本,或者

file -L /bin/* /sbin/* /usr/bin/* /usr/sbin/* | sed -ne '/shell/ s|:.*$||p' | xargs -r grep -lie gksu

查看哪些gksu明确使用。采用已知的好方法没有害处.. ;)

于 2013-02-27T04:42:02.827 回答
1

您可以将这些环境变量的值分配给标准变量,然后在 gkSU 之后执行 gksu 导出变量...通过在 gkSU 之后使用 && 将您的执行绑定在一起来定义这些,以便您基本上使用克隆的环境变量执行...

一个更好的问题是为什么要这样做?我意识到你想要保留一些文件夹,但我不确定为什么作为 root 创建的任何文件都必须是全局可写的,可能使用 umask,或者你必须手动修改权限或更改所有权......就是这样一个坏主意!

请查看https://superuser.com/questions/232231/how-do-i-make-sudo-preserve-my-environment-variableshttp://www.cyberciti.biz/faq/linux-unix-shell -export-command/ & https://serverfault.com/questions/62178/how-to-specify-roots-environment-variable

于 2013-02-27T00:16:17.740 回答