使用 dbus 和 policykit 的根任务

lib*_*via 10 session python root policykit dbus

在某些时候,我的应用程序需要执行管理任务,例如在 /etc 中创建文件或使用 root 权限运行命令。

我知道可以做一个问答:

os.popen("pkexec foo bar")
Run Code Online (Sandbox Code Playgroud)

但我也知道这不是可预见的干净方式。对用户来说有些烦人,因为他总是需要重新输入密码,而不是进行类似会话的处理。

我非常乐观,因为我找到了用于身份验证的 python 示例

这是一个立即生效的简单示例:

import dbus

bus = dbus.SystemBus()
proxy = bus.get_object('org.freedesktop.PolicyKit1', '/org/freedesktop/PolicyKit1/Authority')
authority = dbus.Interface(proxy,  dbus_interface='org.freedesktop.PolicyKit1.Authority')

system_bus_name = bus.get_unique_name()

subject = ('system-bus-name', {'name' : system_bus_name})
action_id = 'org.freedesktop.policykit.exec'
details = {}
flags = 1            # AllowUserInteraction flag
cancellation_id = '' # No cancellation id

result = authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)

print result
Run Code Online (Sandbox Code Playgroud)

我一直很天真地认为在授权后我可以继续使用一些 os.popen() 命令在脚本中。现在我知道了 :(

我可以在上面的示例中看到元组结果,但是在进一步的文档中,我找不到此时可以继续执行的工作代码。

这个结果与我有什么关系?我怎样才能继续执行我需要的任务?是否有提供可用方法的示例的 python 参考?

我尝试使用 dir() 列出授权方法,但找不到任何线索如何继续。

我真的想避免使用我的后备,但这将是我的最后手段。请帮助我以正确的方式做这件事:)

感谢致敬

安德烈

编辑:

由于我没有使这个工作并且我以前通过使用 gksu 启动我的程序的解决方案在 /opt/ 之外不起作用,我最终不得不放弃并实施一千次密码请求以使程序基本工作至少应用对决中的 T 恤。

我没有注意到这个问题,因为我首先做了一个快速分享。在那里一切正常。开始时要求输入一次密码。我现在彻底垮了。我对 AppShowdown 的贡献是https://launchpad.net/armorforge。;-(

Fli*_*imm 7

您首先需要掌握一个基本概念:PolicyKit 只处理授权,而不处理权限提升。PolicyKit 将回答这个问题:“用户是否有权执行此任务?”,但它不会为您提供 root 权限。

常用的模型是创建一个DBus系统服务,以root权限运行。它将接受来自非 root 进程的请求,使用 PolicyKit 来确定该进程是否有权发出该请求,然后执行请求的任务。

几年前,我在 ubuntuforums.org 上用 Python编写了关于 PolicyKit 和 DBus教程。原则是相同的,虽然它可能需要一些更新。我现在需要去睡觉,所以看看它是否需要更新让我知道。