尝试以 root 用户身份启动 gnome-terminal 时出现“错误构建代理...”

Owe*_*ing 3 opensuse d-bus gnome-terminal

openSUSE Leap 42.2 Gnome 终端 3.20.2

我打开了一个终端窗口。如果我输入以下命令:

gnome-terminal
Run Code Online (Sandbox Code Playgroud)

作为非 root 用户,它成功启动了一个新终端。

但是,如果我以 root 身份运行该命令,则会收到以下错误消息:

为 org.gnome.Terminal:/org/gnome/Terminal/Factory0 构建代理时出错:连接已关闭

如果我尝试启动终端,dbus-launch gnome-terminal那么它就可以工作。

什么阻止gnome-terminal命令以 root 身份启动终端?并且是dbus-launch可接受的解决方法还是可能导致无法预见的问题(我真的不明白它在做什么)?

Jde*_*eBP 9

请记住,在 Win32 出现之前的 Win16 天中,Windows 应用程序主要是如何工作的,并废除了它:在有hInstance和的地方hPrevInstance,尝试运行许多应用程序的第二个实例只是将事情交给第一个实例,这使得事情变得困难命令脚本工具(如 Take Command),因为人们会第二次调用应用程序,它会在屏幕上作为一个附加窗口明显存在,但就命令解释器而言,它刚刚运行的子进程立即退出?

GNOME 已经为 Linux 带回了 Win16 行为。

GNOME 终端现在是一个客户端-服务器应用程序。该gnome-terminal程序只是一个客户端,它向服务器构造桌面总线消息,传递其命令行选项、环境、工作目录和参数,然后简单地退出。服务器在桌面总线上gnome-terminal-server注册org.gnome.Terminal并负责所有实际终端仿真并在 GUI 上显示窗口。

桌面总线客户端gnome-terminal通过环境变量定位桌面总线代理,该变量通常指向每个用户目录中的套接字,例如/run/user/1001. 或者,环境变量指定在“当前用户的运行时目录”中查找,并且根据客户端进程的有效用户 ID 构造与上述类似的路径。在这两种情况下,该目录通常是个人用户私有的,其他(非特权)用户无法访问。

当人们试图gnome-terminal通过sudo诸如此类的方式作为另一个用户运行时,就会发生欢闹。如果环境变量指向显式命名的运行时目录,则非特权客户端无法连接到每用户桌面总线。如果环境变量指向“当前用户的”运行时目录,它会查找错误的桌面总线代理,通常是针对当前没有运行桌面总线代理的用户,因为用户尚未登录并启动该代理用户帐户的每用户服务。(每用户桌面总线代理由每用户服务管理器运行。每用户服务管理器要么显式启动,要么在某些服务管理软件的情况下,loginsu和 SSH 服务器程序。)

dbus-launch作为超级用户对您有用的原因是dbus-launch显式启动了另一个桌面总线代理,以超级用户身份运行,gnome-terminal可以与之交谈。幸运的是,系统还被配置为gnome-terminal-server在客户端尝试通过代理连接到服务器时请求启动服务器。(不一定是这种情况,现在这种需求启动被视为一种低劣的机制,因为它最终导致许多桌面总线服务器进程不在任何类型的服务管理下运行。确实,没有代理本身在服务管理下也被认为是低劣的。对于超级用户来说,这通常也不是一个好主意帐户运行这些类型的服务,因为他们中的许多人不希望以超级用户权限运行,因为他们希望在普通用户帐户的保护下运行。)

如果像“如何在我的无头服务器上远程启动 gnome-terminal?(无法通过 X11 转发启动) ”中的提问者那样,gnome-terminal如果即使原始用户没有桌面总线代理,人们也会尝试运行跑步。例如,当一个人通过 SSH 登录但 SSH 登录过程没有启动每用户服务管理器时,就会发生这种情况,这反过来意味着每用户桌面总线代理没有运行,并且gnome-terminal-server服务器不能通过桌面总线到达。(根据系统的配置方式,图形登录仍然可以触发启动每用户服务管理器,因此人们可能会观察到以同一用户的身份以图形方式登录会神奇地使事情工作。再次dbus-launch 将显式启动非服务管理的桌面总线代理。)

然而,当一个服务经理有一个钩子时login,就会发生更多的欢笑,su, 和 SSH 服务器。这些钩子通常实现启动每用户服务管理的语义,以及它启动的所有每用户服务,在该用户首次登录时;并在该用户的最后注销时停止所有这些操作。如果有很多短暂且不重叠的 SSH 会话,那么可能会产生大量无用的开销来启动和关闭整个每用户服务管理系统(及其所有自动启动服务)每个 SSH 会话的开始和结束。systemd,一个这样的服务管理器,有一个不完美的“逗留”机制,只有一半解决了这个问题。这意味着每用户服务管理在最终注销后“徘徊”,但它根本不会停止每用户服务管理的启动。

进一步阅读

  • 很棒的 GNOME,我多么讨厌你。 (2认同)