Existe um comando para listar todas as exibições abertas em uma máquina?

66

Quando o SSH é inserido localmente em meu computador (não pergunte, é uma solução alternativa), não consigo iniciar aplicativos gráficos sem executar:

export DISPLAY=:0.0

Se eu executar isso primeiro e depois executar um aplicativo gráfico, as coisas funcionam. Se não, não funciona, não há exibição para anexar.

Existe um comando para listar todos os displays disponíveis (isto é: todos os valores possíveis) em uma máquina?

    
por Naftuli Kay 23.07.2011 / 03:42

5 respostas

71

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.

por 23.07.2011 / 14:58
13

A exibição é o primeiro argumento para Xorg . Você pode ps e depois grep Xorg out.

[braga@coleman teste_geom]$ ps aux | grep Xorg
root      1584  5.3  1.0 156628 41708 tty1     Rs+  Jul22  22:56 /usr/bin/Xorg :0 -background none -verbose -auth /var/run/gdm/auth-for-gdm-a3kSKB/database -nolisten tcp vt1
braga     9110  0.0  0.0 109104   804 pts/1    S+   00:26   0:00 grep --color=auto Xorg

Você pode usar awk em qualquer formato necessário.

    
por 23.07.2011 / 05:28
4
# Show all active login shells, with displays
$ w -oush

trunc-us tty1                      23:02  -bash
trunc-us tty7     :0                4days /sbin/upstart --user
trunc-us pts/4    :0                      w -oush

# Capture the Display part
$ w -oush | grep -Eo ' :[0-9]+'

 :0
 :0

# only unique lines
$ w -oush | grep -Eo ' :[0-9]+' | uniq

 :0

# trim off the leading space
$ w -oush | grep -Eo ' :[0-9]+' | uniq | cut -d \  -f 2

[Edit: eu corri uma instância Xnest para ver se isso iria pegá-lo - isso não acontece; ele apenas captura shells de login ('w' é a abreviação de 'who'). De volta à prancheta para mim.] [Edit: Encontrou:

$ ls /tmp/.X11-unix

X0 X2

$ ls /tmp/.X11-unix | tr 'X' ':'
:0
:2

]

    
por 05.04.2016 / 23:46
1
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

fará o trabalho listando todos os DISPLAYs atuais. Além disso, você pode ver as exibições atribuídas para um usuário específico ($ usr) com:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
    
por 21.08.2017 / 13:42
0

Na pasta /tmp , também pode haver .X??-lock arquivos com ?? indicando os números da sessão.

Você precisa excluí-los se quiser reutilizar um número de sessão.

Você pode vê-los usando ls -a , pois normalmente os arquivos que começam com . estão ocultos.

    
por 03.07.2016 / 12:25

Tags