lpapp..

10

为此目的存在的关键方法建立在QProcess:

因此,以下代码片段将是等同于command1 | command2不限制自己的一个或另一个解释器:

QProcess process1

QProcess process2;

process1.setStandardOutputProcess(&process2);

process1.start("echo myPass");

process2.start("sudo -S shutdown -r now");

process2.setProcessChannelMode(QProcess::ForwardedChannels);

// Wait for it to start

if(!process1.waitForStarted())

return 0;

bool retval = false;

QByteArray buffer;

// To be fair: you only need to wait here for a bit with shutdown,

// but I will still leave the rest here for a generic solution

while ((retval = process2.waitForFinished()));

buffer.append(process2.readAll());

if (!retval) {

qDebug() << "Process 2 error:" << process2.errorString();

return 1;

}

您可以删除该sudo -S部分,因为您可以以root身份运行此小程序,以及设置权限.你甚至可以为关机程序设置setuid或setcap.

我们在构建商业Linux系统时通常做的是拥有一个最小的应用程序,可以为它正在尝试的活动获取setuid或setcap,然后我们在Linux 上system(3)或QProcess在Linux上显式调用它.基本上,

我会编写这个小应用程序以避免对整个应用程序提供完全root权限,因此限制访问权限以防止恶意使用,如下所示:

sudo chmod u+s /path/to/my/application

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐