国产化-普通用户GUI进程以root身份调用其他程序
普通用户以root身份调用其他程序的常规方法
- sudo
sudo没有提供密码框,不适合普通GUI进程调用。 - pkexec
pkexec提供密码框,但也有缺点。
#include <iostream>
#include <unistd.h>
int main() {
using namespace std;
pid_t pid = fork();
if (pid == 0)
{
std::cout << "fork() successfully." << endl;
const char *env_init[] = {"DISPLAY=:0", nullptr};
const char cmd[] = "/usr/bin/echo";
execle("/usr/bin/pkexec", "pkexec", cmd, nullptr, env_init);
}
// 以下的输入等待很必要,否则pkexec会调用不起来,报错“Refusing to render service to dead parents.”
int i;
cin >> i;
return 0;
}
推荐方法
实测在中标麒麟和中科方德系统的普通用户进程调用pkexec以root身份运行其他程序有可能不弹出密码框。另外如果pkexec的调用者提前退出会导致pkexec运行失败,报错"Refusing to render service to dead parents."。所以调用pkexec的程序必然会堵塞等待,在很多场合不适用。
root身份运行的守护进程+进程间通信则是解决此难题的方法,因为root身份运行的守护进程调用的程序可以继承root身份,完美避开输入密码的步骤。普通GUI进程可以通过进程间通信向守护进程发出调用其他程序的请求,然后无需等待即可返回,避免了阻塞的问题。