Com dois servidores Linux, experimentei no X11 um comportamento muito surpreendente. Aqui os detalhes sobre a situação:
- Tenho duas máquinas Linux remotas, Paula (RHEL6) e Marie (CentOS7).
- Eu me conecto a eles de uma máquina com Windows 7 ( Walter ) via MobaXterm. Em ambas as sessões SSH/Shell, defino as variáveis DISPLAY para minha máquina Windows local.
- Através da janela do shell MobaXterm para a máquina Linux Marie eu começo no Marie Firefox. Na minha máquina local, Walter , uma janela do Firefox é aberta (que obviamente é executada no Marie ). Até agora tudo bem.
- Agora eu emito na janela do shell MobaXterm para a outra máquina Linux Paula
xdg-open www.google.com
. - Isso abre uma nova guia no Firefox de Marie !
Eu totalmente não esperava isso! (Suponho que o Firefox de Paula (invocado via xdg-open
) passa a solicitação aberta para o sistema X11 em Walter , que então a canaliza para o navegador em Marie .)
E eu não quero que isso aconteça. Como posso forçar Paulaxdg-open
a (re)usar um navegador em Paula , ou seja, um navegador na máquina em que o comando foi emitido?xdg-open
O xdg-open não tem conceito de janelas, máquinas ou mesmo navegadores. No final, tudo o que ele faz (depois de passar por algumas outras ferramentas, pesquisar o mimetype, etc.) é simplesmente executar:
Se o Firefox usará instâncias independentes para cada $DISPLAY ou se usará uma única instância é uma decisão inteiramente tomada pelo Firefox. Por padrão, ele sempre contata a instância existente pelo IPC e solicita que ela abra uma nova janela/guia.
A maneira como isso é implementado, especificamente no Firefox, é de fato por meio do X11 como um canal IPC – ele se comunica com a instância existente procurando por uma janela existente e definindo certas propriedades do X nela. Infelizmente, ele não verifica se o WM_CLIENT_MACHINE dessa janela realmente corresponde ao host em que está sendo executado.
(A razão pela qual ele usa uma única instância é porque ele não pode compartilhar facilmente o "perfil" (arquivos de configurações) entre vários processos e também não pode se conectar facilmente a vários $ DISPLAYs de um único processo. Ambos são tecnicamente possíveis de implementar, mas provavelmente não é visto como um benefício suficiente para justificar o trabalho necessário.)
Para evitar isso, você pode definir
MOZ_NO_REMOTE=1
, ou se executarfirefox
diretamente via CLI, pode usar--no-remote
o que evita o IPC. No entanto, ele sempre tentará iniciar uma nova instância, mesmo que uma já esteja em execução no mesmo sistema. Não parece ser uma boa maneira de limitar o controle remoto baseado em X11 para o mesmo host, a não ser aplicar patchesXRemoteClient.cpp
.A resposta fornecida pelo @grawity está completa. No entanto, como não parece haver uma solução geral, quero acrescentar como acabei resolvendo meu problema:
Eu uso dois navegadores diferentes nos dois sistemas remotos Paula e Marie : Em um eu uso o Firefox, no outro eu uso o Chrome - e defino a
BROWSER
variável de ambiente em cada sistema de acordo.Dessa forma , o xdg-open de Paula usa o Chrome de Paula e o xdg-open de Marie usa o Firefox de Marie .