Existe um comando para listar todas as telas abertas em uma máquina?

76

Quando o SSH localmente no 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, tudo dará certo. Caso contrário, não funcionará, não há tela para anexar.

Existe um comando para listar todas as telas disponíveis (ou seja: todos os valores possíveis) em uma máquina?

Naftuli Kay
fonte
Uma maneira mais limpa de iniciar aplicativos a partir de um terminal é ( DISPLAY=:0 yourapp & ).
Nobar
3
Para obter esse número de exibição a partir de um script de linha de comando, tente w. Mais informações: lista os nomes de exibição X existentes?
Aexl

Respostas:

80

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 yesdentro /etc/sshd_config( /etc/ssh/sshd_configou onde quer que esteja o arquivo de configuração). No lado do cliente, passe a -Xopção para o sshcomando ou insira ForwardX11seu ~/.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 .0peç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: :NUMBERacessa o servidor por soquetes locais e memória compartilhada, enquanto HOSTNAME:NUMBERacessa 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=:0isso não funciona na sessão SSH (mas ssh -Xfuncionará, se estiver ativado no servidor; você nunca precisa mexer XAUTHORITYao fazer ssh -X). Se isso for um problema, você precisará definir a XAUTHORITYvariá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_namepara 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.

Gilles
fonte
15

A exibição é o primeiro argumento para Xorg. Você pode psentão Xorgsair.

[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 fazer awkisso em qualquer formato que seja necessário.

Vitor Py
fonte
10
Isso não detecta telas criadas por um servidor que não seja o Xorg, por exemplo, o Xvnc .
Cjm
5
ps aux |grep Xfuncionou melhor para mim
nobar
6
wmostra todos os que estão conectados e sua exibição.
Plenus Franckly
2
Note que o argumento para o Xorg é (pelo menos agora, em 2016) opcional e (pelo menos no Fedora) geralmente está ausente, portanto esse método não funciona mais.
BRPocock 29/08/16
Se, por algum motivo, apenas definir o ambiente var nem sempre funcionar ... tente anexá-lo a um comando DISPLAY=:0 netsurf "https://medium.com/"... ou use export DISPLAY=:0para compartilhar o var com o processo, não apenas com o shell
Ray Foss
7
# 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 executei uma instância do Xnest para ver se isso seria detectado - não é; captura apenas shells de login ('w' é a abreviação de 'who'). De volta à prancheta para mim.] [Edit: Found it:

$ ls /tmp/.X11-unix

X0 X2

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

]

Fordi
fonte
1
Isso é ... estranho ... Gostaria de saber qual é a explicação.
Fordi
(em relação ao GDM em exibição no display 1024 para mim) não consegui replicá-lo pela segunda vez. Naquela época, eu estava testando o xrdp, encaminhando janelas X11 e alguns clientes VNC. Parece que em uma instalação típica, o GDM será executado em X0 ... ou X1 se você clicar no botão "fazer login como outro usuário" na tela de bloqueio. Seu segundo método funcionou para mim no Fedora 23
Ray Foss
Encontrei algo no Display 1024 usando o seu comando, mas não vejo nada funcionando lá ... usando ps xeww | grep DISPLAY=:1024agora isso é estranho. Estou executando o chrome-remote-desktop na tela 20 também.
Ray Foss
wnão funciona se nenhum aplicativo estiver sendo executado no servidor x (incluindo nenhum gerenciador de janelas e nenhuma área de trabalho). Mas ls /tmp/.X11-unixfunciona.
12431234123412341234123
4
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

fará o trabalho listando todos os displays atuais. Também é possível ver as telas atribuídas para um usuário específico ($ usr) com:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
lenroc
fonte
Esse segundo deveria ser ps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u?
Alexx Roche
0

Na /tmppasta também pode haver .X??-lockarquivos ??indicando os números da sessão.

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

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

user177936
fonte
Essas são as sessões de exibição?
Phd #