如何在Qt中执行复杂的linux命令
How to execute complex linux commands in Qt?
我想使用QProcess
在linux中运行一个命令来重新启动计算机。我已经在我的应用程序中硬编码了我的根密码。
当我在终端中运行以下程序时,它运行得很完美:
echo myPass | sudo -S shutdown -r now
当我把命令放在shell脚本中并通过QProcess
调用它时,它也是成功的:
QProcess process;
process.startDetached("/bin/sh", QStringList()<< "myScript.sh");
但我不能通过直接传递到QProcess
:来运行它
process.startDetached("echo myPass | sudo -S shutdown -r now ");
它只会打印myPass | sudo -S shutdown -r now
如何可能直接使用QProcess
运行这样相对复杂的命令。(没有放入shell脚本)。
QProcess
:中为此目的而存在的关键方法
void QProcess::setProcessChannelMode(ProcessChannelMode模式)
和
void QProcess::setStandardOutputProcess(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
显式地调用它。基本上,
我会写那个小应用程序,以避免对整个应用程序进行完全的root访问,从而限制访问权限以防止恶意使用,如下所示:
sudo chmod u+s /path/to/my/application
首先,您可以配置sudo
以避免询问密码。例如,作为sudo
组的成员并具有行
%sudo ALL=NOPASSWD: ALL
在您的/etc/sudoers
文件中。当然,不询问密码会降低系统的安全性。
要回答您关于Qt的问题,请记住bash(1),就像所有Posix shell一样,也就是/bin/sh
,接受带有字符串的-c
参数(实际上系统(3)正在派生/bin/sh -c
)。所以只要执行
process.startDetached("/bin/sh", QStringList()<< "-c"
<< "echo myPass | sudo -S shutdown -r now");
正如AntiClimacus所回答的那样,将根密码放在可执行文件中是个坏主意。
您必须将命令放在shell脚本中,并使用QProcess以shell脚本为参数执行sh
或bash
,因为您的命令包含|
,必须由sh
或bash
来解释。
然而,这只是我的观点,但是:我不认为这是一个好的解决方案来做你正在做的事情,即在可执行文件中包括你的根密码。
- 在C++/Linux中设置单调时钟的一些技巧
- Linux的Cpp上的计时器
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如何在linux终端中同时编译和运行c++代码
- 在Linux for Windows上编译C++代码时出错
- 函数复杂度分析
- 如何找到锁定Linux futex的C++行
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 在linux上调试巨大的C++项目
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- c++方法参数只能在linux的发布模式下自行更改
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- 这里在 Linux 中具有"CreatePipe"和"CreateProcessW"功能吗?
- 函数在Windows或Linux上运行时表现不同
- 在Linux下捕获SIGKILL的C++程序
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 在Python(linux)中调用复杂的C++函数
- 如何在Qt中执行复杂的linux命令