使用dbus和policykit的根任务


10

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

我知道可以做一个问答:

os.popen("pkexec foo bar")

但是我也知道,这不是可以预见的干净方法。由于用户总是需要重新输入密码而不是像会话一样进行处理,因此会给用户带来某种烦恼。

当我找到用于身份验证的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

我一直很天真地认为,授权后我可以使用一些os.popen()-commands在脚本中继续操作。现在我更好了:(

我可以在上面的示例中看到元组结果,但是在进一步的文档中,我现在找不到要执行的代码。

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

我试图使用dir()列出授权方法,但找不到任何线索进行下去。

我真的很想避免使用我的后备,但这将是我的最后选择。请帮助我以正确的方式来做:)

感谢致敬

安德烈

编辑:

由于我没有启用它,并且以前的解决方案(通过使用gksu启动我的程序)在/ opt /中不起作用,因此我最终不得不放弃并实施了上千个要求输入密码的程序,才能使该程序成为基本工作,至少应用程式摊牌中的T恤。

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


我认为您可以在StakOverflow找到更好的答案。您应该要求将此问题迁移到那里。
jgomo3 2012年

Answers:


7

您首先需要掌握一个基本概念:PolicyKit仅处理授权,而不处理特权升级。PolicyKit会回答以下问题:“用户是否有权执行此任务?”,但不会给您root特权。

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

几年前,我在ubuntuforums.org上编写了有关使用Python的PolicyKit和DBus教程。原则是相同的,尽管可能需要进行一些更新。我现在需要上床睡觉,所以看看,让我知道是否需要更新。


可以用来允许virtualbox在普通用户下安装扩展包吗?
Gryu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.