在 Ubuntu 中以 root 用户身份启动 Qt 应用程序
Posted
技术标签:
【中文标题】在 Ubuntu 中以 root 用户身份启动 Qt 应用程序【英文标题】:Launch Qt application as root user in Ubuntu 【发布时间】:2021-12-27 14:00:02 【问题描述】:我正在测试一个基于 Qt 的 GUI 应用程序,它是在 Ubuntu 20.04 中使用 Qt creator 生成的。此应用程序使用一个需要 root 权限的库。然而,无法以 root 身份启动应用程序,因为它无法访问显示。
如果我以普通用户身份启动应用程序,我会在库中收到 modprobe 错误:
$ CGUTLGUI_Qt
qt.core.qobject.connect: QObject::connect: No such signal QSignalMapper::mapped(int) in ../src/cgosfunc/cgosgpio.cpp:242
qt.core.qobject.connect: QObject::connect: (receiver name: 'CgosGPIO')
modprobe: ERROR: could not insert 'cgosdrv': Operation not permitted
如果我以 root 身份启动应用程序,它无法连接到显示器:
$ sudo CGUTLGUI_Qt
No protocol specified
qt.qpa.xcb: could not connect to display :1
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vkkhrdisplay, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, xcb.
我只需要以一种或另一种方式运行程序,我不介意我不能修复这两个错误。以 root 身份启动 GUI 或以普通用户身份链接库都可以。
【问题讨论】:
【参考方案1】:xhost 程序可用于允许其他用户或系统访问 X 显示器。
要允许 root 访问您的 X 服务器,请使用以下命令:
$ xhost local:root
【讨论】:
感谢您的帮助。我发送了这个命令,然后以 sudo 身份启动程序我得到以下错误:code
_Qt-Desktop-Debug/CGUTLGUI_Qt QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root' qt.core.qobject.connect : QObject::connect: ../src/cgosfunc/cgosgpio.cpp:242 qt.core.qobject.connect: QObject::connect: (receiver name: 'CgosGPIO') 中没有这样的信号 QSignalMapper::mapped(int) code
关于 XDG_RUNTIME_DIR 的警告不是错误。信号映射错误是由于 Qt 程序的源代码中的错误。您知道 GUI 应用程序在任何情况下是否都能正常工作吗?
GUI 应用程序在作为普通用户调用时运行良好。唯一的问题是尝试加载特殊库 cgosdrv 时失败,因为该库需要 root 权限。以上是关于在 Ubuntu 中以 root 用户身份启动 Qt 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Ubuntu 的 Eclipse 中以 root 身份调试应用程序?
Firefox headless 不能在 Docker 中以非 root 用户身份工作