我有一个用c/gtk编写的程序,可以用gksu打开。问题是,当我使用getenv(“$HOME”)获取环境变量根时,它显然会返回“根”。我想知道是否有方法可以知道谁是执行gksu的用户,或者获取他的环境变量的方法。提前感谢!
发布于 2013-02-27 12:42:03
请参阅手册页。使用gksu -k command...保留环境(特别是PATH和HOME)。
或者,就像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/yourapp安装。exec意味着命令将替换shell;即exec命令之后的任何内容都不会被执行(除非应用程序或命令根本无法执行) --最重要的是,在开始执行应用程序时,内存中不会有额外的shell。
虽然Linux和其他类似POSIX的系统确实有有效标识(定义应用程序可能执行的操作)和真实标识(定义执行操作的用户)的概念,但gksu会修改所有标识。特别是,当getuid()返回真实用户ID (例如,对于set-UID二进制文件)时,当使用gksu时,它将返回零(“根”)。
因此,以上启动脚本是解决您的问题的推荐方法。这也是一个常见的问题;运行
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-27 08:16:18
您可以将这些环境变量的值赋给标准变量,然后在gksu之后执行gkSU导出这些变量...通过在gkSU之后使用&&定义这些变量来绑定您的执行,这样您实际上就可以使用克隆的环境变量来执行...
一个更好的问题是,为什么要这样做?我知道你想要保留一些文件夹,但不确定为什么作为root创建的任何文件都必须是全局可写的,可能使用umask,否则你将不得不手动修改权限或更改所有权...这真是个糟糕的主意!
请查看https://superuser.com/questions/232231/how-do-i-make-sudo-preserve-my-environment-variables,http://www.cyberciti.biz/faq/linux-unix-shell-export-command/ & https://serverfault.com/questions/62178/how-to-specify-roots-environment-variable
https://stackoverflow.com/questions/15101854
复制相似问题