¿Hay un comando para enumerar todas las pantallas abiertas en una máquina?

76

Cuando SSH se localiza en mi computadora (no pregunte, es una solución alternativa), no puedo iniciar aplicaciones gráficas sin ejecutar:

export DISPLAY=:0.0

Si ejecuto esto primero y luego ejecuto una aplicación gráfica, todo funciona. Si no, no funciona, no hay pantalla para adjuntar.

¿Existe un comando para enumerar todas las pantallas disponibles (es decir, todos los valores posibles) en una máquina?

Naftuli Kay
fuente
Una forma más limpia de iniciar aplicaciones desde un terminal es ( DISPLAY=:0 yourapp & ).
nobar 01 de
3
Para obtener ese número de pantalla de un script de línea de comando, intente w. Más información: ¿ enumerar los nombres para mostrar X existentes?
aexl

Respuestas:

80

Si desea que la conexión X se reenvíe por SSH, debe habilitarla tanto en el lado del servidor como en el lado del cliente. (Dependiendo de la distribución, puede habilitarse o deshabilitarse de manera predeterminada). En el lado del servidor, asegúrese de tener X11Forwarding yesdentro /etc/sshd_config( /etc/ssh/sshd_configo donde esté el archivo de configuración). En el lado del cliente, pase la -Xopción al sshcomando o ingrese ForwardX11su ~/.ssh/config.

Si corres ssh -X localhost, deberías ver que $DISPLAYes (probablemente) localhost:10.0. Contraste con :0.0, que es el valor cuando no está conectado a través de SSH. (La .0parte se puede omitir; es un número de pantalla, pero rara vez se usan varias pantallas). Hay dos formas de pantallas X que probablemente encontrará:

  • Pantallas locales, sin nada antes de la :.
  • TCP muestra, con un nombre de host antes de :.

Con ssh -X localhost, puede acceder al servidor X a través de ambas pantallas, pero las aplicaciones utilizarán un método diferente: :NUMBERaccede al servidor a través de sockets locales y memoria compartida, mientras que HOSTNAME:NUMBERaccede al servidor a través de TCP, que es más lento y desactiva algunas extensiones.

Tenga en cuenta que necesita una forma de autorización para acceder a un servidor X, llamada cookie y que normalmente se almacena detrás de escena en el archivo ~/.Xauthority. Si está utilizando ssh para acceder a una cuenta de usuario diferente, o si su distribución coloca las cookies en un archivo diferente, es posible que DISPLAY=:0no funcione dentro de la sesión SSH (pero lo ssh -Xhará, si está habilitado en el servidor; nunca Necesito meterse con XAUTHORITYal hacer ssh -X). Si eso es un problema, debe configurar la XAUTHORITYvariable de entorno u obtener las cookies del otro usuario .

Para responder a su pregunta real:

  • Las pantallas locales corresponden a un zócalo /tmp/.X11-unix.

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • Las pantallas remotas corresponden a puertos TCP abiertos superiores a 6000; El acceso al número de pantalla N en la máquina M se realiza mediante la conexión al puerto TCP 6000 + N en la máquina M. Desde la máquina M:

    netstat -lnt | awk '
      sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
        print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
      }'
    

    (El resto de este punto es de interés académico únicamente).

    Desde otra máquina, puede usar nmap -p 6000-6099 host_namepara sondear puertos TCP abiertos en el rango habitual. Es raro hoy en día tener servidores X escuchando en un socket TCP, especialmente fuera de la interfaz de bucle invertido.

    Estrictamente hablando, otra aplicación podría estar usando un puerto en el rango generalmente utilizado por los servidores X. Puede saber si un servidor X está escuchando comprobando qué programa tiene abierto el puerto.

    lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
    

    Si eso muestra algo ambiguo sshd, no hay forma de saber con certeza si es un servidor X o una coincidencia.

Gilles 'SO- deja de ser malvado'
fuente
15

La pantalla es el primer argumento para Xorg. psEntonces puedes explotar Xorg.

[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

Luego puede awkhacerlo en cualquier formato que necesite.

Vitor Py
fuente
10
Esto no detecta pantallas creadas por un servidor que no sea Xorg, por ejemplo, Xvnc .
cjm
55
ps aux |grep Xfuncionó mejor para mí
nobar 01 de
66
wmuestra a todos los que han iniciado sesión y su pantalla.
Plenus Franckly
2
Tenga en cuenta que el argumento para Xorg es (al menos ahora, en 2016) opcional y (al menos en Fedora) generalmente ausente, por lo que este método ya no funciona en absoluto.
BRPocock
Si por alguna razón solo configurar el entorno var no siempre funciona ... intente anteponerlo a un comando DISPLAY=:0 netsurf "https://medium.com/"... o use export DISPLAY=:0para compartir el var con el proceso, no solo el 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

[Editar: ejecuté una instancia de Xnest para ver si esto podría atraparlo, no lo hace; solo captura shells de inicio de sesión ('w' es la abreviatura de 'who'). De vuelta al tablero de dibujo para mí.] [Editar: Lo encontré:

$ ls /tmp/.X11-unix

X0 X2

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

]

Fordi
fuente
1
Eso es ... extraño ... Me pregunto cuál es la explicación.
Fordi
(con respecto a GDM ejecutándose en la pantalla 1024 para mí) No pude replicarlo por segunda vez. En ese momento estaba probando xrdp, reenvío X11 en ventana y algunos clientes VNC. Parece que en una instalación típica, GDM se ejecutará en X0 ... o X1 si ha presionado el botón "iniciar sesión como otro usuario" en la pantalla de bloqueo. Tu segundo método funcionó para mí en Fedora 23
Ray Foss
Encontré algo en la Pantalla 1024 usando su comando, pero no veo nada ejecutándose allí ... usando ps xeww | grep DISPLAY=:1024ahora eso es extraño. También estoy ejecutando chrome-remote-desktop en la pantalla 20.
Ray Foss
wno funciona si no se está ejecutando ninguna aplicación en el servidor x (incluido el administrador de ventanas y el escritorio) Pero ls /tmp/.X11-unixfunciona.
12431234123412341234123
4
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

hará el trabajo enumerando todas las PANTALLAS actuales. También puede ver las pantallas asignadas para un usuario específico ($ usr) con:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
lenroc
fuente
¿Ese segundo está destinado a ser ps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u?
Alexx Roche
0

En la /tmpcarpeta también puede haber .X??-lockarchivos que ??indiquen los números de sesión.

Debe eliminarlos si desea reutilizar un número de sesión.

Puede verlos usando ls -anormalmente los archivos que comienzan con a .están ocultos.

usuario177936
fuente
¿Esas son las sesiones de exhibición?
phk