Si vous souhaitez que la connexion X soit transférée via SSH, vous devez l'activer à la fois côté serveur et côté client. (Selon la distribution, il peut être activé ou désactivé par défaut.) Sur le côté serveur, assurez-vous que vous avez X11Forwarding yes
in /etc/sshd_config
( /etc/ssh/sshd_config
ou où que se trouve le fichier de configuration). Du côté client, passez l’ -X
option à la ssh
commande , ou insérez ForwardX11
votre ~/.ssh/config
.
Si vous courez ssh -X localhost
, vous devriez voir que $DISPLAY
c'est (probablement) localhost:10.0
. Contraste avec :0.0
, qui est la valeur lorsque vous n'êtes pas connecté via SSH. (La .0
partie peut être omise; c'est un numéro d'écran, mais plusieurs écrans sont rarement utilisés.) Il existe deux formes d'écrans X que vous risquez de rencontrer:
- Affichages locaux, avec rien avant le
:
.
- Les affichages TCP, avec un nom d’hôte avant le
:
.
Avec ssh -X localhost
, vous pouvez accéder au serveur X via les deux écrans, mais les applications utiliseront une méthode différente: :NUMBER
accéder au serveur via des sockets locales et la mémoire partagée, alors que l’ HOSTNAME:NUMBER
accès au serveur via TCP est plus lent et désactive certaines extensions.
Notez que vous avez besoin d’un formulaire d’autorisation pour accéder à un serveur X, appelé cookie, qui est normalement stocké dans les coulisses du fichier ~/.Xauthority
. Si vous utilisez ssh pour accéder à un autre compte utilisateur ou si votre distribution place les cookies dans un fichier différent, vous constaterez que DISPLAY=:0
cela ne fonctionne pas dans la session SSH (mais ssh -X
que, s'il est activé sur le serveur, vous ne le ferez jamais. besoin de XAUTHORITY
jouer avec en faisant ssh -X
). Si cela pose un problème, vous devez définir la XAUTHORITY
variable d'environnement ou obtenir les cookies de l'autre utilisateur .
Pour répondre à votre question actuelle:
Les affichages locaux correspondent à un socket en /tmp/.X11-unix
.
(cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
Les affichages distants correspondent aux ports TCP ouverts supérieurs à 6000; l'accès au numéro d'affichage N sur la machine M se fait en se connectant au port TCP 6000 + N sur la machine M. À partir de la machine M elle-même:
netstat -lnt | awk '
sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
}'
(Le reste de ce point est d'intérêt académique seulement.)
À partir d’une autre machine, vous pouvez utiliser nmap -p 6000-6099 host_name
pour détecter les ports TCP ouverts dans la plage habituelle. De nos jours, il est rare que les serveurs X écoutent sur un socket TCP, en particulier en dehors de l'interface de bouclage.
À proprement parler, une autre application pourrait utiliser un port de la gamme habituellement utilisée par les serveurs X. Vous pouvez savoir si un serveur X est à l'écoute en vérifiant quel programme a le port ouvert.
lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
Si cela indique quelque chose d'ambigu sshd
, par exemple, il est impossible de savoir avec certitude s'il s'agit d'un serveur X ou d'une coïncidence.
( DISPLAY=:0 yourapp & )
.