Se você deseja que a conexão X seja encaminhada por SSH, é necessário ativá-la no servidor e no cliente. (Dependendo da distribuição, ela pode ser ativada ou desativada por padrão.) No lado do servidor, verifique se você está X11Forwarding yes
dentro /etc/sshd_config
( /etc/ssh/sshd_config
ou onde quer que esteja o arquivo de configuração). No lado do cliente, passe a -X
opção para o ssh
comando ou insira ForwardX11
seu ~/.ssh/config
.
Se você executar ssh -X localhost
, deverá ver que $DISPLAY
é (provavelmente) localhost:10.0
. Contraste com :0.0
, que é o valor quando você não está conectado por SSH. (A .0
peça pode ser omitida; é um número de tela, mas várias telas raramente são usadas.) Existem duas formas de exibições X que você provavelmente encontrará:
- Monitores locais, sem nada antes do
:
.
- O TCP é exibido, com um nome de host antes do
:
.
Com ssh -X localhost
, você pode acessar o servidor X pelos dois monitores, mas os aplicativos usarão um método diferente: :NUMBER
acessa o servidor por soquetes locais e memória compartilhada, enquanto HOSTNAME:NUMBER
acessa o servidor por TCP, que é mais lento e desativa algumas extensões.
Observe que você precisa de uma forma 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ê poderá descobrir que DISPLAY=:0
isso não funciona na sessão SSH (mas ssh -X
funcionará, se estiver ativado no servidor; você nunca precisa mexer XAUTHORITY
ao fazer ssh -X
). Se isso for um problema, você precisará definir a XAUTHORITY
variável de ambiente ou obter os cookies do outro usuário .
Para responder sua pergunta real:
As exibições locais correspondem a um soquete /tmp/.X11-unix
.
(cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
Os monitores remotos correspondem às portas TCP abertas acima de 6000; o acesso ao número de exibição N na máquina M é feito conectando-se à porta TCP 6000 + N na máquina M. Na própria máquina M:
netstat -lnt | awk '
sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
}'
(O restante deste item é apenas de interesse acadêmico.)
De outra máquina, você pode usar nmap -p 6000-6099 host_name
para analisar as portas TCP abertas no intervalo usual. Atualmente, é raro ter servidores X escutando em um soquete TCP, especialmente fora da interface de loopback.
A rigor, outro aplicativo pode estar usando uma porta no intervalo normalmente usado pelos servidores X. Você pode saber 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 mostra algo ambíguo sshd
, não há como saber com certeza se é um servidor X ou uma coincidência.
( DISPLAY=:0 yourapp & )
.