问题描述
我正在创建一个最终将由不同用户运行的程序,但在我的程序中,我必须调用必须以特定用户身份运行的第三方程序(而不是像 root 这样的提升权限)。
我的代码不在连接到 Internet 的计算机上,因此我已尽力在下面重新创建它正在执行的操作。
Foo.h
#include <QProcess>
class Foo : public QProcess
{
Q_OBJECT
....
slots:
void readStandardOutput();
protected:
void setupChildProcess() override;
private:
QProcess *process;
}
Foo.cpp
void Foo::setupChildProcess ()
{
#if defined Q_OS_UNIX
setgroups (0,0);
setgid (337);
setuid (337);
umask (0);
#endif
}
void Foo::RunFoo ()
{
QString commandScriptToRun (thirdPartyBashScript);
QString workingDirectory (thirdPartyDirectory);
QString command (commandScriptToRun);
QStringList args;
args.append (arg1);
args.append (arg2);
process = new QProcess();
process->setProgram (command);
process->setArguments (args);
process->setWorkingDirectory (workingDirectory);
connect (process,&QProcess::readyReadStandardOutput,this,&Foo::readStandardOutput);
process->start();
process->waitForFinished (-1);
}
当我调试并在调用 setgroups() 时设置断点时,它不会停止。从我从 QProcess::setupChildProcess 的 QT 文档中可以看出,它在 fork() 之后和 execve() 之前被调用,所以我原以为它会在我的重写函数中停止,但它没有。
我也试过以特权用户身份运行我的程序,但是环境变量存在很多问题,这些问题不仅很麻烦,而且没有解决我的问题。
是否可以做我想做的事情,或者我需要寻找其他地方?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)