- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 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,以用户权限运行的那个,替换变量,并且 env
在获得 super 用户权限时重新设置它们。)
如果您的应用程序只应以 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
时返回零(“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
明确地。采用已知的好方法没有坏处.. ;)
关于c - 保持用户环境变量执行 gksu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15101854/
我在 c/gtk 中有一个用 gksu 打开的程序。问题是,当我使用 getenv("HOME") 获取环境变量 $HOME 时,它显然返回“root”。我想知道是否有办法知道谁是执行 gksu 的用
我是 linux 命令的新手..我使用 Mac Osx Mountain Lion 作为我的操作系统,并使用 eclipse 来编译我的 java 程序.. 问题是我试图在 eclipse 上以 ro
如何使用 gksu gnome-schedule 设置工作目录,以便我的脚本中引用的所有 shell 都使用我使用 cd 设置的工作目录? 在 Ubuntu 上,我有一个名为 runProcess.s
我正在寻找执行 gksu 或 beesu 作业但依赖于 policykit 的命令。 policykit 和 dbus 文档不知何故非常复杂且不清楚。 我找到了“pkexec”,但它在尝试运行图形应用
我正在编写一个Java应用程序,其中(除其他外)我将安装外部设备,进行一些复制,然后卸载它。 //I am mounting several devices in created dirs named
我是一名优秀的程序员,十分优秀!