使用 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 是不是将源文件权限保留在复制的文件中?