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