从使用root用户运行的C程序启动Python GUI

时间:2013-06-18 12:15:21

标签: python c root xorg

我做了一个C程序,在某个时刻调用它的python GUI。

当我在桌面上使用sudo运行C和python时,它可以正常工作,因为sudo正在以我的用户身份执行C程序。

但是,我创建了一个systemd单元来启动C代码,因此它由root用户执行,然后我无法让它在我的桌面上显示Python GUI,因为我得到WARNING **: Could not open X display

C代码正在使用inotify监视二进制文件,并在打开二进制文件时执行某些操作,并通过简单的system调用打开Python GUI。

C代码必须以root权限执行,但python GUI可以作为普通用户启动,并且在需要时,可能使用polkit来获取它。它只需要在/ var / lib中的xml文件中写一些东西。

知道我怎么能这样做吗?

1 个答案:

答案 0 :(得分:0)

当你以第一种方式运行它时它起作用的原因是在启动C程序之前已经设置了DISPLAY环境变量,它将由子进程继承。

如果你在启动时启动C程序,DISPLAY变量(可能)将不会被设置,所以你需要在产生子进程之前设置它,例如... < / p>

#include <stdlib.h>

setenv("DISPLAY", something, 1);
// Now launch the Python script

棘手的一点是something的内容。假设C程序在与X11会话相同的系统上运行,它必须是从常规X11会话中echo $DISPLAY时获得的任何内容。

你要么必须硬编码一个有效的值,要么找到一些方法将正确的值传递给C程序。


<强>更新

关于权限问题 - 一个简单的解决方法是将xhost +root放在~/.xsession中,假设您信任root。

否则,您可以强制Python脚本作为您的UID运行。您可以执行正确的fork-exec操作,并在调用exec()之前在子进程中调用setuid(2),或者可以在Python脚本的顶部调用os.setuid()