fix:提权后30s错误显示提权失败

This commit is contained in:
momen 2025-06-22 15:26:04 +08:00
parent 9fdf0051a1
commit 68d7f42751
1 changed files with 16 additions and 28 deletions

View File

@ -14,53 +14,41 @@ bool elevateToRoot() {
QString program = QCoreApplication::applicationFilePath();
qDebug() << "Current application path:" << program;
// 获取当前 DISPLAY 和 XAUTHORITY 环境变量
QByteArray display = qgetenv("DISPLAY");
QByteArray xauthority = qgetenv("XAUTHORITY");
qDebug() << "DISPLAY:" << display;
qDebug() << "XAUTHORITY:" << xauthority;
// 构造带环境变量的 pkexec 命令
QStringList args;
args << "env"
<< "DISPLAY=" + display
<< "XAUTHORITY=" + xauthority
<< program;
QProcess *process = new QProcess();
process->setProgram("pkexec");
process->setArguments(args);
QProcess process;
process.setProgram("pkexec");
process.setArguments(args);
qDebug() << "Attempting to elevate using pkexec with arguments:" << args;
// 启动进程并等待完成
process->start();
// 等待 pkexec 完成,通常会弹出密码框
// 设置一个合理的超时时间,例如 30 秒
if (!process->waitForFinished(30000)) {
qDebug() << "pkexec process timed out.";
process->kill(); // 如果超时,终止进程
delete process;
process.start();
if (!process.waitForStarted(5000)) {
qDebug() << "Failed to start pkexec.";
return false;
}
int exitCode = process->exitCode();
QProcess::ExitStatus exitStatus = process->exitStatus();
// 阻塞等待提权进程退出(比如主程序窗口关闭)
if (!process.waitForFinished(-1)) { // 等待直到新进程退出
qDebug() << "pkexec process waitForFinished failed.";
return false;
}
int exitCode = process.exitCode();
QProcess::ExitStatus exitStatus = process.exitStatus();
qDebug() << "pkexec exit code:" << exitCode;
qDebug() << "pkexec exit status:" << exitStatus;
qDebug() << "pkexec standard error:" << process->readAllStandardError();
qDebug() << "pkexec stderr:" << process.readAllStandardError();
// 检查 pkexec 是否成功
// pkexec 成功执行通常返回 0或者如果用户取消授权会返回非零值。
// 但是,如果 pkexec 本身执行失败例如找不到命令exitStatus 会是 CrashOrKilled
// 这里我们认为只要pkexec成功启动了即使授权失败也算pkexec命令执行成功了
// 因为这表示pkexec本身是可用的。
// 只有当pkexec命令无法执行时才认为是pkexec的问题
bool pkexecCommandExecuted = (exitStatus == QProcess::NormalExit && exitCode == 0);
delete process;
return pkexecCommandExecuted;
return (exitStatus == QProcess::NormalExit && exitCode == 0);
}
int main(int argc, char *argv[])