保持用户env变量执行gksu

时间:2013-02-27 00:04:01

标签: c linux gtk

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

2 个答案:

答案 0 :(得分:2)

请参见手册页。使用gksu -k command...来保护环境(尤其是PATHHOME)。

或者,就像Lewis Richard Phillip C所说,您可以使用gksu env PATH="$PATH" HOME="$HOME" command...重置命令的环境变量。 (逻辑是父shell,使用用户权限运行的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/yourappexec表示命令替换 shell;即在执行exec命令之后没有任何内容(除非根本无法执行应用程序或命令) - 最重要的是,当您的应用程序开始执行时,内存中不会有额外的shell。

虽然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的内容。采用已知的良好方法没有害处..;)

答案 1 :(得分: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