如何启动具有 root 权限的 QProcess?

Posted

技术标签:

【中文标题】如何启动具有 root 权限的 QProcess?【英文标题】:How to launch a QProcess with root rights? 【发布时间】:2011-04-11 18:39:30 【问题描述】:

我需要从 Qt 程序启动 gphoto2。我这样做:

QString gphotoProgram = "/usr/bin/gphoto2";
QStringList gphotoArguments;
gphotoArguments << "--capture-image";
QProcess *gphotoProcess = new QProcess(this);
gphotoProcess->start(gphotoProgram, gphotoArguments);

但它永远不会以这种方式进入Running 状态,因为gphoto2 通常需要管理员权限才能在命令行上启动。

如何以适当的权限启动此QProcess 以使gphoto2 正常工作?

编辑:我希望用户不必输入密码,这意味着 gksudo、kdesudo 或任何其他图形解决方案对我来说不是一个有效的选项。

【问题讨论】:

【参考方案1】:

我强烈建议找到一种方法,允许 gphoto2 以登录用户的权限运行。也许this article 有一些有用的信息。

【讨论】:

这个页面确实很有帮助,非常感谢!对于后代,这里是启用组 plugdev 的任何用户所需的命令行:/usr/lib/libgphoto2/print-camera-list udev-rules 版本 0.98 group plugdev mode 0660 > /etc/udev/rules。 d/90-libgphoto2.rules【参考方案2】:

如果您的发行版启用了 sudo,请尝试将“gksudo”添加到您的进程的命令行:

QString gphotoProgram = "gksudo /usr/bin/gphoto2"

如果用户帐户被授权为 sudo-er,它会询问用户密码,以便程序可以以 root 权限运行。

【讨论】:

我忘了准确地说我不想使用图形界面输入密码,因为用户可能不知道。我相应地编辑了问题。 如果安全机制需要密码(而且大多数情况下是这样),您将无法绕过它。 如果你想绕过密码验证,唯一的办法就是设置一个后台进程,使用 root 权限(守护进程、服务器等)来包装你的 gphoto2 需求。您的应用程序只需使用套接字与服务器通信。但我认为这是一个坏主意,因为它是安全问题的大门……也许您应该尝试了解为什么需要管理员权限,以及是否有其他替代方法。 ... 作为旁注,我认为如果 gphoto 需要管理员权限,那是因为它直接使用 USB 设备,并且必须为它们正确设置访问权限。看看以下页面:gphoto.org/doc/manual/permissions-usb.html,看看你是否可以配置一些东西,以便 USB 相机不需要 root 权限【参考方案3】:

您还可以使用 PolicyKit 以 sudo 权限启动 QProcess。

pkexec 命令

QString gphotoProgram = "pkexec /usr/bin/gphoto2";

【讨论】:

@ChrisV 我想在 Windows 中实现它。帮帮我。【参考方案4】:

GNOME 和 KDE 不是还有自己的图形 sudo 包装器吗? (我自己是一个 Windows 人。)您可以使用 QProcess 启动“sudo”并让它负责提升和随后的 gphoto 启动。

【讨论】:

我忘了准确地说我不想使用图形界面输入密码,因为用户可能不知道。我相应地编辑了问题。

以上是关于如何启动具有 root 权限的 QProcess?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上通过 QProcess 启动提升的子进程?

Qt 应用程序之间通过 QProcess 进行通信

如何使用 QProcess 启动 Shell 脚本?

如何使用子进程或 QProcess 启动独立的 gnuplot 进程?

Qt,ProcessState 枚举如何工作

hadoop用户是不是可以具有root权限