Isso complementa outras respostas com informações específicas do Windows-Subsystem for Linux. A resposta aceita está correta: sua DISPLAY
variável está configurada incorretamente. Não está exatamente claro, no entanto, por que esse é o caso apenas dessa resposta, então estou corrigindo com essa resposta.
Se você estiver executando o cygwin, ou Windows-Subsystem for Linux, e o servidor X11 for baseado em janelas (por exemplo VcXsrv
, ou XMing
), é mais provável que o servidor X11 esteja escutando uma porta TCP (como 127.0.0.1
nas portas TCP 6000-6010
) do que em o soquete de domínio Unix padrão ( /tmp/.X11-unix/X0
). Soquetes Unix não são bem suportados no Windows neste momento, mesmo dentro da WSL. A comunicação entre programas no ambiente Linux e programas executados diretamente no host do Windows também é geralmente mais fácil através de soquetes IP.
Quando você executa aplicativos gráficos localmente (por exemplo, do ambiente Cygwin ou WSL do seu host) e sua DISPLAY
variável é definida como padrão (por exemplo DISPLAY=:0.0
), os aplicativos primeiro tentam se conectar ao servidor X através do soquete Unix /tmp/.X11-unix/X0
. Isso falhará, mas a maioria dos aplicativos fará o fallback para uma conexão TCP ativada localhost
, que deverá alcançar o servidor, supondo que o servidor X esteja configurado com padrões.
Você pode confirmar que isso está acontecendo procurando connect()
chamadas nos logs de rastreamento de uma execução do seu aplicativo gráfico. Geralmente, esses eventos acontecem desde o início, antes da janela principal do aplicativo aparecer.
Esse comportamento de fallback não ocorre quando o ssh está redirecionando uma conexão do lado remoto, então você está recebendo esse erro. sshd
está de fato encaminhando a conexão para o lado local, mas a conexão local do cliente ssh acaba porque ele não alcança o servidor pelo soquete Unix. Você está recebendo o ENOENT
erro.
Nesses casos, alterar sua DISPLAY
variável para usar a sintaxe TCP em vez da :0.0
sintaxe, pode corrigir o problema:
DISPLAY=127.0.0.1:0 ssh remote some-gui-application
Como outras respostas mencionadas, você também pode exportar essa variável interativamente do prompt do shell:
$ export DISPLAY=127.0.0.1:0
...
$ ssh remote some-gui-application
Você também pode armazenar essa configuração de forma mais permanente, adicionando essa linha ao script de inicialização do perfil do shell de login (por exemplo ~/.bash_profile
).
Nota: Alguns shells têm um script de inicialização diferente para sessões de logon e não logon. Por exemplo, com o bash, você pode escrever essa linha no script de não login, ou seja ~/.bashrc
, em vez de ~/.bash_profile
. Se o fizer, tome cuidado para não substituir qualquer valor personalizado que possa ter sido definido pelo ssh. Esse seria o caso se você estivesse pulando primeiro em seu host via ssh e depois pulando novamente em outro host (aninhando assim seu encaminhamento X11).
strace -fo /tmp/trace ssh....
para verificar se ele tenta conectar esse soquete de domínio Unix.