具有根权限的 GLib 运行命令



我正在编写一个非常简单的侏儒扩展供个人使用(在javascript中(。

要运行控制台命令,我使用GLib.spawn_command_line_sync("command");

GNOME 外壳版本 3.36.2

我需要什么

我只需要运行一个命令,但具有root权限,如何使类似GLib.spawn_command_line_sync("sudo command");工作?

我想使用默认的Authentication Requiredgnome 对话框进行密码输入。

我所知道的

我阅读了很多源代码,我找到了对话框的定义,但我不明白如何使用它,因为找不到一个单一的使用示例。

我不知道如何将这两件事(对话框和GLib(连接在一起。

首先,避免在扩展中使用GLib.spawn_command_line_sync()。此函数将与动画和用户交互在同一线程中同步执行,直到完成为止。

如果不需要从命令输出或退出状态,请使用GLib.spawn_command_line_async()。如果确实需要输出或退出状态,请将Gio.Subprocesscommunicate_utf8_async()一起使用。

要以用户身份执行特权命令,最简单的方法可能是使用pkexec,它将使用您想要的对话框(您可以在终端中测试运行它(:

// With GLib (no output or success notification)
let cmd = 'apt-get update';
try {
GLib.spawn_command_line_async('pkexec ' + cmd);
} catch (e) {
logError(e);
}
// With GSubprocess (output and success notification)
let args = ['apt-get', 'update'];
function privelegedExec(args) {
try {
let proc = Gio.Subprocess.new(
['pkexec'].concat(args),
Gio.SubprocessFlags.STDOUT_PIPE | Gio.SubprocessFlags.STDERR_PIPE
);
proc.communicate_utf8_async(null, null, (proc, res) => {
try {
let [, stdout, stderr] = proc.communicate_utf8_finish(res);
// Failure
if (!proc.get_successful())
throw new Error(stderr);
// Success
log(stdout);
} catch (e) {
logError(e);
}
});
} catch (e) {
logError(e);
}
}   

最新更新