使用dbus和polkit运行调用根脚本的root特权python服务

时间:2019-02-25 10:55:36

标签: python dbus pam polkit dbus-python

我编写了一个python脚本,该脚本从启动板下载deb文件,然后调用shell脚本以使用Alien将Deb转换为rpm。

shell脚本使用Alien,因此需要以root身份运行。

程序使用线程池,使用threadpool.apply_async异步下载deb文件,然后使用处理池异步调用shell脚本,因此整个过程相当迅速。

一切正常,但是调用外星人的shell脚本必须是root,否则软件包将无法正确构建。当我第一次完成脚本时,在使用sudo之后,我将使用pkexec调用Alien。在这两种情况下,我都有两个问题。

首先是从root开始,我失去了用户的环境,因此失去了pip安装的python库。也许我可以使用sudo -s或类似的东西,但是第二个问题是我必须为每个生成的软件包输入root密码。

我想做的是,以普通用户身份运行python脚本,qt gui和所有命令,选择要转换的文件,然后点击安装按钮,仅输入我的超级用户密码一次。

我决定过滤掉python的安装部分,包括线程下载和对shell脚本的线程调用,然后尝试以root / superuser身份运行这些部分。

我为此安装部分创建了一个dbus服务,并且在经过艰苦的dbus学习之后,设法使该服务正常工作。但是,我不高兴对脚本进行身份验证并提高其特权。

我已经能够使用polkit显示密码对话框并授权超级用户,但是我不知道如何使用polkit的返回值

`authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)`

显示密码对话框,用于授权,但不处理提升脚本特权。

我将python安装服务设置为0500权限,因此希望一旦我弄清楚了如何提升特权,root用户就可以读取和执行服务,该服务当前在会话总线上创建。

如何提升权限,同时保留用户的环境变量,这样我就不必在根帐户中安装python模块了?

非常感谢您的提前帮助...

ps。我已经编写了一个polkit操作文件和一个polkit规则,但是在每种情况下我都不确定操作ID与特权提升之间的关系。 pps。我可以/应该使用pam吗?

1 个答案:

答案 0 :(得分:0)

我最终使用pkexec作为密码对话框以root身份运行了该进程。