使用两台 Linux 服务器时,我在 X11 上遇到了一些非常奇怪的行为。以下是有关情况的详细信息:
- 我有两台远程 Linux 机器,保拉(RHEL6)和玛丽(CentOS7)。
- 我从 Windows 7 计算机连接到它们(沃尔特) 通过 MobaXterm。在两个 SSH/Shell 会话中,我都将 DISPLAY 变量设置为我的本地 Windows 机器。
- 通过 Linux 机器的 MobaXterm shell 窗口玛丽我开始玛丽Firefox。在我的本地机器上沃尔特Firefox 窗口打开(当然运行在玛丽)。 到目前为止,一切都很好。
- 现在我在另一台 Linux 机器的 MobaXterm shell 窗口中发出保拉
xdg-open www.google.com
。 - 这将打开一个新标签在玛丽的火狐!
我完全没想到这一点!(我猜保拉的 Firefox(通过 调用xdg-open
)将打开请求传递给 X11 系统沃尔特然后将其传送到浏览器玛丽。
我不想发生这种情况。我该如何xdg-open
强迫保拉(重新)使用浏览器保拉xdg-open
,即发出命令的机器上的浏览器?
答案1
xdg-open 没有窗口、机器甚至浏览器的概念。最后,它所做的一切(在经过一些其他工具、查找 mimetype 等之后)只是运行:
/usr/bin/firefox http://www.google.com
Firefox 是否为每个 $DISPLAY 使用独立实例或是否使用单个实例完全由 Firefox 决定。默认情况下,它始终通过 IPC 联系现有实例并要求其打开新窗口/选项卡。
在 Firefox 中,实现这一点的方式确实通过 X11 作为 IPC 通道– 它通过搜索现有窗口并在其上设置某些 X 属性来与现有实例进行通信。不幸的是,它不会检查该窗口的 WM_CLIENT_MACHINE 是否真正与其运行的主机匹配。
(它使用单个实例的原因是它无法轻松地在多个进程之间共享“配置文件”(设置文件),也无法轻松地从单个进程连接到多个 $DISPLAY。两者在技术上都是可以实现的,但可能不被视为几乎足以证明需要做的工作是合理的。
为了避免这种情况,您可以设置MOZ_NO_REMOTE=1
,或者如果您firefox
直接通过 CLI 运行,您可以使用--no-remote
来避免 IPC。但是,它将总是尝试启动一个新实例,即使该实例上已有一个正在运行相同的系统。除了打补丁之外,似乎没有好的方法可以将基于 X11 的远程控制限制在同一主机上XRemoteClient.cpp
。
答案2
答案@grawity提供的内容很完整。但是,由于似乎没有通用的解决方案,因此我想补充一下我最终如何解决我的问题:
我在两个远程系统上使用两种不同的浏览器保拉和玛丽:在一个上我使用 Firefox,在另一个上我使用 Chrome - 并且我BROWSER
在每个系统上相应地设置了环境变量。
这边走保拉的 xdg-open 用途保拉的 Chrome 和玛丽的 xdg-open 用途玛丽的 Firefox。