【问题标题】:Authenticating GTK app to run with root permissions验证 GTK 应用程序以使用 root 权限运行
【发布时间】:2011-01-24 22:48:49
【问题描述】:

我有一个用于 Linux 的 UI 应用(使用 GTK),需要以 root 身份运行(它读取和写入 /dev/sd*)。

我不知道每次启动我的应用程序时都要求用户打开 root shell 或手动使用“sudo”,我想知道该应用程序是否可以使用一些操作系统提供的 API 来获取 root 权限。 (注意:gtk 应用程序不能使用“setuid”模式,所以这里不是一个选项。)

这里的优点是工作流程更简单:用户可以从他的默认用户帐户,从桌面双击我的应用程序,而不必打开根终端并从那里启动它。

我问这个是因为 OS X 正好提供了这个:应用程序可以要求操作系统启动具有 root 权限的可执行文件 - 操作系统(而不是应用程序)然后要求用户输入他的凭据,验证它们,然后启动根据需要定位。

我想知道 Linux 是否有类似的东西(例如 Ubuntu)

澄清:

所以,在 PolicyKit 的提示之后,我想知道是否可以使用它来获得对“/dev/sd...”块设备的读写访问权限。我发现文档很难理解,所以我想在我花费数小时试图徒劳地理解它之前先问问这是否可能。

更新:

该应用程序是一个远程操作的磁盘修复工具,适用于不精通的 Linux 用户,那些 Linux 菜鸟不会对使用 sudo 甚至更改用户的组成员有太多了解,特别是如果他们的磁盘刚刚开始出现问题并且他们再吓一跳。这就是为什么我寻求一种避免此类技术问题的解决方案。

【问题讨论】:

  • 绝对可以这样设置——例如,Synaptic 包管理器通常就是这样设置的。
  • 我不确定您是否真的想以 root 身份运行。如果您只需要访问磁盘,最好将用户添加到“磁盘”组。
  • Milan - 我的应用程序充当一次性磁盘修复工具。我不认为任何想要使用它的人愿意为此更改他的系统范围设置,准永久。

标签: linux permissions gtk root


【解决方案1】:

旧方法是GKSu,虽然简单但现在已被淘汰。 Here是关于GKSu未来的讨论。

新方法是使用PolicyKit。我不太确定这是如何工作的,但我认为您需要使用 pkexec 命令启动您的应用程序。

更新:

查看http://hal.freedesktop.org/docs/polkit/polkit-apps.html 上的示例代码,您似乎可以使用PolicyKit 来获取.policy/usr/share/polkit-1/actions 中的.policy 文件描述的某些动作 的授权。作为另一个用户执行程序的操作是org.freedesktop.policykit.exec。我似乎找不到直接访问块设备的操作,但我不得不承认,PolicyKit 文档也让我大吃一惊。

因此,也许对您来说最简单的做法是将需要特权的磁盘修改代码分离到一个命令行实用程序中,然后使用g_spawn_[a]sync()pkexec 从您的GUI 应用程序中运行它。这样,您就不必为请求操作之类的事情而烦恼。无论如何,以 root 身份运行整个 GUI 应用程序可能是一种不好的做法。

另一个建议是直接询问 PolicyKit 的作者 (David Zeuthen)。或者尝试将您的问题发布到 gtk-app-devel 列表。

【讨论】:

  • 我试过 pkexec - 不幸的是,它在我的情况下不起作用,因为我收到以下错误消息:“Gtk-WARNING **: cannot open display:” -- “man pkexec”解释原因:“PROGRAM 将运行它的环境将被设置为最小已知和安全的环境,以避免通过 LD_LIBRARY_PATH 或类似机制注入代码。此外,PKEXEC_UID 环境变量设置为调用 pkexec 的进程的用户 ID。结果,pkexec 将不允许您运行,例如X11 应用程序作为另一个用户,因为 $DISPLAY 环境变量没有设置。”该死。
  • 嗯,我认为 PolicyKit API 可以让您实现相同的目标,但可以在您的程序中实现。不过我不确定。
  • 所以没有给我发邮件通知你的更新,所以我现在才看到。感谢您付出额外的努力,我认为有了这些信息,我可以取得成功。
  • 当然,我很高兴为所有代表加倍努力,他们不会无缘无故地称其为 Crack Overflow ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2014-09-16
相关资源
最近更新 更多