使用 sudo 权限的 Qt 复制文件

Posted

技术标签:

【中文标题】使用 sudo 权限的 Qt 复制文件【英文标题】:Qt copy file with sudo right 【发布时间】:2018-10-09 09:28:12 【问题描述】:

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

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

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

【问题讨论】:

也许,您需要以 sudo 身份运行您的应用程序? 在 linux 下你永远不应该使用 sudo 权限运行整个程序。 适用于 Linux 或此要求的正确解决方案:***.com/a/32068110/10460542 尝试改用 QProcess 吗? 【参考方案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 处理为控制过程提供了一个更优雅的解决方案,但不幸的是,在多次使用时也会遇到问题。

以上是关于使用 sudo 权限的 Qt 复制文件的主要内容,如果未能解决你的问题,请参考以下文章

将文件从一台服务器复制到另一台服务器时权限被拒绝

QFile::copy 是不是将源文件权限保留在复制的文件中?

升级到 1.9 后,使用 sudo 复制 Ansible 文件失败

ubuntu复制文件

Linux sudo 配置

linux好用的命令