我想从我的C ++ / Qt代码中以root用户身份执行linux命令。
最终应该实现一个对话框,要求输入root密码,但是我不能硬编码root密码。
到目前为止,这是我所做的:
QProcess p;
p.start("dmidecode" );
p.waitForFinished(-1);
QString p_stdout = p.readAllStandardOutput();
QString p_stderr = p.readAllStandardError();
它适用于不要求root特权的命令。 但是我想实现诸如" zypper up"或" dmidecode"之类的命令,这些命令如果没有root密码就无法执行。
void QProcess::setEnvironment ( const QStringList & environment )可能可以做些什么?
谢谢
我相信仅靠Qt不能做到(以一种标准的或至少是标准化的方式)。 尽管在KDE中有一种标准方法。 尝试搜索他们的文档。
您需要使用桌面管理器界面以root身份运行命令。 对于ubuntu,您可以使用gksudo作为密码界面。
如果您以普通用户身份运行,则不能提升特权,除非您是suid,而您可能不需要整个应用程序。
它的完成方式是通过外部帮助程序。您想要执行sudo not su的操作,因为在Ubuntu中根帐户已被锁定; gksudo或kdesudo取决于运行的环境。其中之一应预先安装在任何现代linux发行版上,否则您可以在应用程序中部署副本。
当然,如果当前用户无权通过sudo运行内容,则将无法正常工作,但这是一种正常的安全措施,因此您不应变通。
如何继续使用您的代码,但为您的应用程序制作一个shell脚本并将其放在/ usr / bin上呢?我做到了,每次都运作良好。
#it is the shell script code
#!/bin/bash
gksudo /usr/lib/your_qt_app
比起您只需要调用shell脚本文件即可。将其命名为myscript并打开bash。在此输入:
myscript
注意上面的gksudo命令。该命令使您成为root用户。我不知道比这更简单的答案。也许没有帮助,但我使用这种方式。
将规则添加到特殊用户的sudoers列表中,并以以下用户身份执行命令:
sudo *some command*
您可以为此使用system()或QProcess。
要查看如何向sudoers列表中添加规则,请参见sudoers手册
是否有一个无需创建其他用户的更优雅的解决方案?
@sivic不要创建其他用户,而是将当前用户添加到sudoers列表中,并允许他们执行只有root才能执行的某些命令