【问题标题】:How to launch a QProcess with root rights?如何启动具有 root 权限的 QProcess?
【发布时间】:2023-03-26 19:45:01
【问题描述】:

我需要从 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 或任何其他图形解决方案对我来说不是一个有效的选项。

【问题讨论】:

    标签: c++ qt root rights qprocess


    【解决方案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 启动。

    【讨论】:

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