2013-02-27 40 views
2

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

+0

通常的看法是做相反的事情:GTK不应该以root身份运行,所以您的GTK程序可以从非root用户运行并启动“命令行”root-setuid可执行文件;从'sudo'或'gksu'启动一个GTK应用程序是一个坏主意。 – 2013-02-27 05:45:15

+0

我正在做一个使得ioctl调用的程序。所以只能由超级用户完成。如果我想允许其他用户执行,我必须传递root权限。感谢您的回答。 – NEBUC 2013-02-28 22:42:35

+0

代码的常见方式是将应用程序分成两个应用程序,一个提供GTK接口,另一个(setuid)执行实际的事情(并与管道或其他具有GTK接口的IPC进行通信)。 – 2013-03-01 05:59:47

回答

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 "[email protected]" 

#!/bin/sh 
exec gksu env PATH="$PATH" HOME="$HOME" /path/to/your/application "[email protected]" 

的脚本安装在/usr/bin,以及你作为/usr/bin/yourapp-bin/usr/lib/yourapp/yourapp应用。 exec表示命令替换了的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明确。采用已知的好方法并没有什么坏处;)

+0

谢谢!那是我想要的。 – NEBUC 2013-02-28 22:40:31

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