Se você quiser que a conexão X seja encaminhada pelo SSH, será necessário ativá-la no lado do servidor e no lado do cliente. (Dependendo da distribuição, pode ser ativado ou desativado por padrão.) No lado do servidor, certifique-se de ter X11Forwarding yes
em /etc/sshd_config
(ou /etc/ssh/sshd_config
ou onde quer que o arquivo de configuração esteja). No lado do cliente, passe a opção -X
para o ssh
command , ou coloque ForwardX11
no seu ~/.ssh/config
.
Se você executar ssh -X localhost
, verá que $DISPLAY
é (provavelmente) localhost:10.0
. Contraste com :0.0
, que é o valor quando você não está conectado por SSH. (A parte .0
pode ser omitida; é um número de tela, mas várias telas raramente são usadas.) Há duas formas de exibição X que você provavelmente encontrará:
- Exibições locais, sem nada antes do
:
. - Exibe TCP, com um nome de host antes do
:
.
Com ssh -X localhost
, você pode acessar o servidor X através de ambos os displays, mas os aplicativos usarão um método diferente: :NUMBER
acessa o servidor via sockets locais e memória compartilhada, enquanto HOSTNAME:NUMBER
acessa o servidor via TCP, que é mais lento e desativa algumas extensões.
Note que você precisa de um formulário de autorização para acessar um servidor X, chamado cookie e normalmente armazenado nos bastidores do arquivo ~/.Xauthority
. Se você estiver usando ssh para acessar uma conta de usuário diferente, ou se sua distribuição colocar os cookies em um arquivo diferente, você verá que DISPLAY=:0
não funciona na sessão SSH (mas ssh -X
será, se estiver habilitado no servidor, você nunca precisa mexer com XAUTHORITY
ao fazer ssh -X
). Se isso for um problema, você precisará definir a variável de ambiente XAUTHORITY
ou obtenha o cookies de outros usuários .
Para responder à sua pergunta real:
-
As exibições locais correspondem a um soquete em
/tmp/.X11-unix
.ls /tmp/.X11-unix cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done
-
Visores remotos correspondem a portas TCP abertas acima de 6000; acessando o número de exibição N na máquina M é feito conectando-se à porta TCP 6000 + N na máquina M. Da própria máquina M:
netstat -lnt netstat -lnt | awk ' sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 { print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000) }'
(O restante deste tópico é de interesse acadêmico apenas).
De outra máquina, você pode usar
nmap -p 6000-6099 host_name
para testar portas TCP abertas no intervalo normal. É raro hoje em dia ter servidores X ouvindo em um soquete TCP, especialmente fora da interface de loopback.Estritamente falando, outro aplicativo pode estar usando uma porta no intervalo normalmente usado pelos servidores X. Você pode dizer se um servidor X está escutando, verificando qual programa tem a porta aberta.
lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
Se isso mostrar algo ambíguo como
sshd
, não há como saber com certeza se é um servidor X ou uma coincidência.