我在c/gtk中有一个用gksu打开的程序。问题是,当我使用getenv(“HOME”)获得环境变量$ HOME时,它显然返回“root”。我想知道是否有一种方法可以知道谁是执行gksu的用户,还是知道他的环境变量的方法。
提前致谢!
最佳答案
请参见手册页。使用gksu -k command...
保留环境(尤其是PATH
和HOME
)。
或者,如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
。采用已知的好的方法没有害处。