ssh -X não funciona no Yosemite

16

Não é mais possível usar o X11 com o ssh. O XQuartz2.7.7 está instalado. O login no X11 via ssh fornece os avisos

Aviso: falha na configuração do encaminhamento do X11 não confiável: dados da chave xauth não gerados Aviso: Não há dados xauth; usando dados de autenticação falsos para o encaminhamento do X11.

No meu próprio sistema, echo $DISPLAY

/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz updated

No entanto, quando tento xauth generate $DISPLAY . trusted, recebo o erro

xauth: (argv): 1: nome de exibição inválido "/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartzAdd" no comando "add"

Alguma idéia de como corrigir isso?

stakSmashr
fonte
2
O nome de exibição retornado $DISPLAYestá errado. Deve ser algo parecido :0.0. Você definir $DISPLAYem ~/.bash_profileou ~/.profilea si mesmo?
jaume
2
Faz diferença quando você usa a -Yopção em vez de -X? Qual sistema operacional seu servidor está usando? E: $DISPLAYcolocar o seu conjunto em algo /tmp/é perfeitamente normal em um Mac.
Asmus
@jaume Não defino minha própria variável $ DISPLAY. No entanto, alterar manualmente parece ter corrigido. Agora ainda tenho certeza de como acabou sendo o que era.
stakSmashr
Entretanto, você reiniciou o seu Terminal? Isso me ajudou com problemas de ambiente variáveis estranhas no passado ...
Asmus
@ Asmus Eu havia reiniciado o Terminal anteriormente, além de reiniciar o computador várias vezes sem sucesso. Estou usando o OS X 10.10.2. Tudo o que fiz foi fazer algo assim DISPLAY=:0.0, e funcionou. Eu adicionei isso em minha Bash_profile
stakSmashr

Respostas:

20

ATUALIZAR

O desenvolvedor Jeremy Huddleston Sequoia anunciou ontem que esse problema foi resolvido no XQuartz 2.7.8_beta2 :

O XQuartz 2.7.8_beta2 está disponível para download.

Você pode ver http://xquartz.macosforge.org/trac/wiki/X112.7.8 para obter um conjunto completo de alterações, mas as mais importantes são:

1) o xauth agora analisa corretamente o caminho do soquete $ DISPLAY do Yosemite launchd $
2) libGL foi atualizado para o Mesa 10.4.4
3) Várias explorações foram corrigidas no xorg-server, freetype e libpng
4) Um bug que impedia atualizações automáticas em alguns casos foi consertado

O relatório de erros está fechado e marcado como corrigido:

insira a descrição da imagem aqui

Se você não pode (ou não deseja) instalar a versão beta, ainda pode usar a solução alternativa que explico abaixo.


RESPONDA

Análise

(role para baixo para a seção de solução alternativa)

Meu primeiro pensamento foi "a DISPLAYvariável está errada". Mas isso não.

Como se vê, no OS X 10.10 Yosemite (e de volta ao 10.8 Mountain Lion ) a DISPLAYvariável armazena um launchdcaminho de soquete:

/private/tmp/<socket name>

em vez do nome de exibição familiar:

hostname:displaynumber.screennumber

Adicionei algumas informações sobre o hostname:displaynumber.screennumberformato no final desta resposta.

Isso significa que xauthprecisa saber como lidar com essa encarnação especial da DISPLAYvariável, e como no Mavericks, mas o soquete usado em Yosemite tem um caminho diferente (mais precisamente: em /private/tmp/com.apple.launchd.XXXXvez de /private/tmp/launch-XXXX) e xauthquebras.

Este bug foi relatado à equipe do XQuartz em 18 de novembro de 2014 (há 3 meses) ( http://xquartz.macosforge.org/trac/ticket/2068 ):

O programa xauth possui código em gethost.c e parsedpy.c para procurar nomes $ DISPLAY que começam com "/ tmp / launch" e tratar isso como um soquete local. No entanto, o local parece ter mudado, agora $ DISPLAY começa com "/private/tmp/com.apple.launchd", portanto, o código que está procurando / tmp / launch não o captura. (...)

De acordo com a descrição do bug, ele deve ser resolvido no XQuartz 2.7.8, com 4 meses de atraso (consulte a página do roteiro do projeto em http://xquartz.macosforge.org/trac/roadmap ).

O patch que corrige o problema foi confirmado em 31 de dezembro de 2014 no projeto freedesktop.org ( http://cgit.freedesktop.org/xorg/app/xauth/commit/parsedpy.c?id=f990dd936b5fd1a40290bb88cde517a0ac38f823 ):

diff --git a/parsedpy.c b/parsedpy.c
index c591b77..7365224 100644
--- a/parsedpy.c
+++ b/parsedpy.c
@@ -42,6 +42,9 @@ in this Software without prior written authorization from The Open Group.
 #include <X11/Xauth.h>         /* for FamilyLocal */
 #include <X11/Xmu/SysUtil.h>

+#include <sys/stat.h>
+#include <sys/syslimits.h>
+
 #if defined(UNIXCONN) || defined(LOCALCONN)
 #define UNIX_CONNECTION "unix"
 #define UNIX_CONNECTION_LENGTH 4
@@ -158,8 +161,32 @@ parse_displayname (const char *displayname,

     if (!host) return False;

-    if(strncmp (host, "/tmp/launch", 11) == 0) {
-        family = FamilyLocal;
+    {
+        /*
+         * If using launchd socket, remove the screen number from the end
+         * of $DISPLAY and check if it is a path to a socket.
+         */
+        char path[PATH_MAX];
+        struct stat sbuf;
(...)

Portanto, é apenas uma questão de tempo até que este patch chegue ao próximo lançamento do XQuartz.

Gambiarra

(testado no OS X 10.10.2 Yosemite.)

Adicionar:

alias ssh="ln -fs $(echo $DISPLAY | sed 's:\(/private/tmp/com\.apple\.launchd\.[^/]*\)/.*:\1:') $(echo $DISPLAY | sed 's:/private/tmp/com\.apple\.launchd\.\([^/]*\)/.*:/private/tmp/launch-\1:'); ssh"

para ~/.bashrciniciar uma nova janela do Terminal ou origine-a ( . ~/.bashrc) na sua sessão atual do Terminal.

Esse alias primeiro vincula o caminho do soquete para /private/tmp/launch-XXX(por exemplo ln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS) e depois inicia ssh:

insira a descrição da imagem aqui


Para os curiosos, tradicionalmente, o nome de exibição do servidor X possui este formato ( man Xno Ubuntu): O nome de exibição do servidor X possui este formato:

hostname:displaynumber.screennumber

Onde:

   hostname
           The hostname specifies the name of the machine to which the display  is  physically
           connected.   If  the hostname is not given, the most efficient way of communicating
           to a server on the same machine will be used.

   displaynumber
           The phrase "display" is usually used to refer to  a  collection  of  monitors  that
           share a common set of input devices (keyboard, mouse, tablet, etc.).  Most worksta‐
           tions tend to only have one display.  Larger,  multi-user  systems,  however,  fre‐
           quently  have  several  displays so that more than one person can be doing graphics
           work at once.  To avoid confusion, each display on a machine is assigned a  display
           number (beginning at 0) when the X server for that display is started.  The display
           number must always be given in a display name.

   screennumber
           Some displays share their input devices among two or more monitors.  These  may  be
           configured as a single logical screen, which allows windows to move across screens,
           or as individual screens, each with their own set of windows.  If  configured  such
           that each monitor has its own set of windows, each screen is assigned a screen num‐
           ber (beginning at 0) when the X server for that display is started.  If the  screen
           number is not given, screen 0 will be used.
jaume
fonte