我在 c/gtk 中有一个用 gksu 打开的程序。问题是,当我使用 getenv("HOME") 获取环境变量 $HOME 时,它显然会返回“root”。我想知道是否有办法知道谁是执行 gksu 的用户或获取他的环境变量的方法。提前致谢!
2 回答
请参阅手册页。用于gksu -k command...
保护环境(特别是PATH
和HOME
)。
或者,就像 Lewis Richard Phillip C 指出的那样,您可以使用gksu env PATH="$PATH" HOME="$HOME" command...
来重置命令的环境变量。(逻辑是父 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
命令之后的任何内容都不会被执行(除非应用程序或命令根本无法执行)——最重要的是,当您的应用程序开始执行时,内存中不会有额外的外壳。
虽然 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
明确使用。采用已知的好方法没有害处.. ;)
您可以将这些环境变量的值分配给标准变量,然后在 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