【问题标题】:Qt copy file with sudo right使用 sudo 权限的 Qt 复制文件
【发布时间】:2023-10-28 11:23:01
【问题描述】:

我使用 Qt 处理文件的正常复制,如下所示:

QFile::copy("/path/file", "/path/copy-of-file");

我现在如何复制需要 Sudo 权限的文件。

【问题讨论】:

  • 也许,您需要以 sudo 身份运行您的应用程序?
  • 在 linux 下你永远不应该使用 sudo 权限运行整个程序。
  • 适用于 Linux 或此要求的正确解决方案:*.com/a/32068110/10460542
  • 尝试改用 QProcess 吗?

标签: qt file copy sudo qfile


【解决方案1】:

您可以使用 QProcess 和 pkexec 以另一个用户的身份执行命令

pkexec 允许授权用户以其他用户身份执行 PROGRAM。如果未指定用户名,则程序将以超级管理员用户 root 身份执行。

https://www.freedesktop.org/software/polkit/docs/0.105/pkexec.1.html

QProcess *proc = new QProcess(this);
proc->waitForFinished();

QString cmd = "pkexec /bin/cp /path/file /path/copy-of-file";

proc->start(cmd);

if(!proc->waitForStarted()) //default wait time 30 sec
{
    qDebug() << "Cannot execute:" << cmd;
}

proc->waitForFinished();
proc->setProcessChannelMode(QProcess::MergedChannels);

if(proc->exitStatus() == QProcess::NormalExit
        && proc->exitCode() == QProcess::NormalExit){
    qDebug() << "Success";
} else {
    qDebug() << "Cannot copy file" << cmd;
}

【讨论】:

    【解决方案2】:

    运行shell命令,like this

    sudo cp /path/file /path/copy-of-file
    

    必要时设置密码。

    $echo <password> | sudo -S <command>
    

    【讨论】:

    • 是的,但这种方式不是特别符合 QT。类似的东西更接近系统,但内部也不是 Qt。系统(qPrintable(“gksudo cp X Y”));
    • 命令 sudo 仅在 linux 中(qt 是跨平台)。可以使用 QAbstractFileEngine 进行一些抽象,但无论如何你都必须使用 shell 命令。
    • 这是一个当然只能在 Linux 上运行的程序。我一次又一次地忘记,还有一些人必须与其他事情作斗争。 :D
    • @Sonya 那么,如果您不尝试遵循跨平台架构,那么使用system()QProcess 运行"gksudo cp src dst" 有什么问题?
    • @John Doe 崩溃的危险随着许多 system() 的增加而大大增加;要求。使用 QProcess 处理为控制过程提供了一个更优雅的解决方案,但不幸的是,在多次使用时也会遇到问题。