当我从命令行运行 X 应用程序(例如 leafpad;大多数应用程序)时,我在控制台上收到以下警告:
... dbind-WARNING **: ... Couldn't register with accessibility bus: Did
not receive a reply. Possible causes include: the remote application did
not send a reply, the message bus security policy blocked the reply, the
reply timeout expired, or the network connection was broken.
(断线以适应列宽。)
为什么我会收到此消息?我该怎么办?发布它的应用程序似乎运行良好。
这出现在 Ubuntu 18.04 和 Devuan 3.0 Beowulf (~= Debian Buster) 上
答案1
答案2
很高兴你自己找到了答案;这里有一些更多的背景来回答评论中的“为什么”。
我在这样的设置中遇到了这个错误。使用 2 台笔记本电脑(一台用于工作,使用 Kubuntu,另一台是我个人拥有的,使用 Arch)——我有点懒,没有拿起另一台笔记本电脑,而是使用X11转发又名ssh -X
。
绕行:X11
从概念上讲,X11 转发是一种“远程桌面”技术,如 VNC、RDP……但有一些不同。它不执行远程桌面的视频流;相反,它采用 X11 协议的网络架构。
回到 X11 构想的时代(1980 年代!),所有屏幕和键盘是“远程”的:一个巨大的大型机柜正在运行支持许多用户的 GUI 应用程序的操作系统进程(通常是全部拥有该大型计算机的组织中的计算用户)。因此,在 X11 中,像素绘图部分是在客户端完成的。
VNC-style remote desktop X11 forwarding
──────────────────────── ──────────────
┌─────[Client machine]──────┐ ┌──────[Client machine]────────────────────────────────┐
│ │ │ │
│ Runs VNC viewer app │◄──┐ │ - Runs X server │
│ │ │ │ - Runs local GUI apps, i.e. those using DISPLAY=:0 │
│ • remote GUI embedded in │ │ │ - Renders remote GUI apps which X11-connect to it, │
│ VNC viewer window │ │ │ to network address like client.local.lan:0 │
│ │ │ │ Usually nowadays, ssh -X secures the X11 traffic │
└───────────────────────────┘ │ │ by tunnelling it; so e.g. DISPLAY=localhost:10.0 │
│ │ This localhost is interpreted by app running on │
network│ │ the server machine! │
│ │ Because SSH tunnel. ┌─────┐ ┌─────┐ │
┌─────[Server machine]──────┐ │ │ ┌──────►│ GUI │ … │ GUI │ │
│ │ │ ├───────────────────┐◄──────┘ └─────┘ └─────┘ │
│ Runs VNC server app │◄──┘ ┌─►│ SSH tunnel egress │ local X11 server │
│ │ │ └───────────────────┴──────────────────────────────────┘
│ • streams pixels of the │ │
│ entire screen │ │ ┌──────[Server machine]────────────────────────────────┐
│ • receives client input, │ │ │ │
│ forwards it to GUIs │ │ │ - May lack any screens, input devices, GPUs │
│ │ │ │ - May not run any X server │
│ ┌─────────┐ ┌─────────┐ │ │ │ - Yet, runs remote GUI apps, as OS processes │
│ │ GUI app │ … │ GUI app │ │ │ │ - GUI stuff lives on client machine's X server │
│ └─────────┘ └─────────┘ │ │ │ - Painting commands and input events │
│ │ │ │ travel within the X11 connection. │
└───────────────────────────┘ │ │ │
│ │ ┌─────┐ ┌─────┐ │
│ │ ┌──────►│ app │ … │ app │ │
│ ├────────────────────┐◄─────┘ └─────┘ └─────┘ │
└─►│ SSH tunnel ingress │ OS processes │
└────────────────────┴─────────────────────────────────┘
在个人计算机的常见用例中,X 服务器和客户端 GUI 运行在同一台计算机上,因此这个有趣的 X11 协议在本地主机上运行时几乎是不可见的。
但它也可以在真实网络上运行,而且效果出奇的好!特别是如果辅以 ssh 的内置压缩功能,-C
.例如,我可以使用“远程”运行 Brave(基于 Chromium 的网络浏览器)ssh -CX pasocon.local brave
,并且它几乎可以通过 WiFi 使用。
Detour:Linux 桌面上的可访问性
不多说了,不是专家,一点也不熟悉。但我要说两件事。
首先,观察 X11 转发架构原则上更适合辅助技术。例如,屏幕读取远程桌面的原始视频流(尽管人工智能技术有一天可能会解决这个问题)比屏幕读取 X 服务器状态或事件/命令流更具挑战性。通过 X11 协议,应用程序会说嘿 X 服务器,在这些坐标处以这种字体绘制文本“Lorem ipsum”;改变这个按钮的颜色;折叠此菜单, ETC。
其次,请注意大多数围绕 VNC/RDP 风格处理嵌入式桌面输入的恶作剧(焦点抓取、特殊组合键的转义,如 Ctrl-Alt-Del、正确重新映射键盘布局、剪贴板等)只是简单地进行离开 X11 转发。在客户端计算机上,远程 GUI 实际上是尽可能的“本地”。我的 KDE Plasma 甚至无法区分 X11 转发肉桂Alt-Tab 界面中的本地 KDE 窗口。
绕道:Freedesktop D-Bus
简而言之,D-Bus 是一个面向对象风格的 RPC(远程过程调用)框架。它在 Linux 桌面上广泛使用(但不仅限于此)。对于某些示例,NetworkManager 提供 dbus 服务;编写一个通过 dbus 与之通信的应用程序来查看和操作这些网络连接,或者在系统连接发生变化时获取回调相对容易。桌面通知(来自电子邮件、即时通讯工具、浏览器应用程序等的弹出窗口)是一项广泛集成的org.freedesktop.Notifications
D-Bus 服务。 Ayatana Indicators(托盘图标)也可以通过 D-Bus 工作。还有更多。
在 D-Bus 上提供无障碍辅助技术的扩展点也是非常有意义的。
在编写了与 D-Bus 配合使用的代码后,我可以 100% 毫无疑问地判断,此错误消息涉及 D-Bus 方法调用失败:
...远程应用程序未发送回复、消息总线安全策略阻止了回复、回复超时已过期或网络连接已断开。
结合以上, 我能猜到为什么 export NO_AT_BRIDGE=1
对我的情况有帮助。我正在将 Cinnamon(GNOME 衍生品)应用程序 X11 转发到 KDE 桌面。期望两个桌面的 D-Bus 实例能够神奇地连接是愚蠢的,据我所知 X.Org 并未耦合到 D-Bus。因此,我在 GTK 的“AT_BRIDGE”(AccessibilityToolkit Bridge?)中遇到了一些不起眼的极端情况......无论那是什么。禁用它可以解决我的问题。
当然,不确定这在多大程度上适用于原始问题中的问题。但是,这就是关于明显相关的移动部件的一些背景信息。华泰