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 yes
dentro /etc/sshd_config
( /etc/ssh/sshd_config
o donde esté el archivo de configuración). En el lado del cliente, pase la -X
opción al ssh
comando o ingrese ForwardX11
su ~/.ssh/config
.
Si corres ssh -X localhost
, deberías ver que $DISPLAY
es (probablemente) localhost:10.0
. Contraste con :0.0
, que es el valor cuando no está conectado a través de SSH. (La .0
parte 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: :NUMBER
accede al servidor a través de sockets locales y memoria compartida, mientras que HOSTNAME:NUMBER
accede 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=:0
no funcione dentro de la sesión SSH (pero lo ssh -X
hará, si está habilitado en el servidor; nunca Necesito meterse con XAUTHORITY
al hacer ssh -X
). Si eso es un problema, debe configurar la XAUTHORITY
variable 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_name
para 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.
( DISPLAY=:0 yourapp & )
.