在某些时候,我的应用程序需要执行一些管理任务,比如在/etc中创建一个文件,或者使用root priveleges运行命令。
我知道你可以做个问答:
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。;-(
发布于 2012-11-11 23:24:24
首先需要掌握一个基本概念: PolicyKit只处理授权,而不是权限提升。PolicyKit将回答以下问题:“用户是否授权执行此任务?”,但它不会给您根权限。
常用的模型是创建一个以根权限运行的DBus系统服务。它将接收来自非根进程的请求,使用PolicyKit确定是否授权该进程提出该请求,然后执行所请求的任务。
几年前我写了一个关于PolicyKit和DBus与Python在ubuntuforums.org上的教程。这些原则是相同的,尽管它可能需要一些更新。我现在要上床睡觉了,所以看一看,如果需要更新,请告诉我。
https://askubuntu.com/questions/159722
复制相似问题