我做了一个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文件中写一些东西。
知道我怎么能这样做吗?
答案 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()
。