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

最佳答案

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

或者,如Lewis Richard Phillip C所示,您可以使用gksu env PATH="$PATH" HOME="$HOME" command...重置命令的环境变量。 (逻辑是父shell(具有用户特权的shell)替换变量,并且在获得 super 用户特权后,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命令之后什么也不会执行(除非应用程序或命令根本无法执行),最重要的是,在您的应用程序开始执行时,内存中不会有多余的shell。

尽管Linux和其他类似POSIX的系统确实具有有效身份(定义应用程序可能执行的操作)和真实身份(定义正在执行操作的用户)的概念,但是gksu修改了所有身份。特别是,虽然getuid()返回例如set-UID二进制文件的真实用户ID,但是当使用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。采用已知的好的方法没有害处。

10-04 14:02