简单示例:在 Ubuntu 20.04 下,以下命令:
gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval true
产生以下输出:
(true, 'true')
但在 22.04 下,相同的命令会产生以下输出:
(false,'')
我在 22.04 下尝试过的任何其他“Eval”语句都会产生相同的输出。
出了什么问题?20.04 和 22.04 系统都是新安装的,原始安装。
更新:这似乎是 gcdev 存在的问题之一(https://askubuntu.com/users/1216972/gcdev) 早些时候试图报道:
答案1
与其他地方一样,Gnome Shell 也实施了更严格的安全性。
org.gnome.Shell 接口为其他核心组件提供私有 API,以实现桌面功能(如设置或全局键绑定)。它不打算用作公共 API,因此请将其限制为一组预期调用者。
(https://gitlab.gnome.org/GNOME/gnome-shell/-/commit/a628bbc4)
这就是许多此类命令不再起作用的原因。可以global.context.unsafe_mode = true
在 Looking Glass 中输入 ( Alt+ F2, lg
Enter) 以使它们在当前会话中起作用。有一个扩展,不安全模式菜单,允许在安全和不安全模式之间切换(感谢 Bryan Wright)。还应该能够启动 Gnome Shell带有--unsafe
选项。
答案2
补充一下 vanadium 的回答,
这是一个将 gdb 附加到 gnome-shell 进程的脚本,并调用 javascript 引擎来切换不安全变量。
这意味着只要在此过程中没有任何中断,您就不需要重新启动会话来添加标志,或处理附加组件或类似的事情。
这是最重要的一行:
gdb -p "$gnome_pid" -batch -ex "调用 (void*)gjs_context_eval((void*)gjs_context_get_current(), "$1", -1, "", 0, 0)"
将 $1 替换为需要运行的代码,例如:
global.context.unsafe_mode = true
请注意,这有点危险且不受支持。如果 gdb 没有完成,会话将挂起。我建议在 screen 或 tmux 中运行它,并在 UI 挂起时以某种方式访问它。