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 yesin /etc/sshd_config( /etc/ssh/sshd_configou où que se trouve le fichier de configuration). Du côté client, passez l’ -Xoption à la sshcommande , ou insérez ForwardX11votre ~/.ssh/config.
Si vous courez ssh -X localhost, vous devriez voir que $DISPLAYc'est (probablement) localhost:10.0. Contraste avec :0.0, qui est la valeur lorsque vous n'êtes pas connecté via SSH. (La .0partie 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: :NUMBERaccéder au serveur via des sockets locales et la mémoire partagée, alors que l’ HOSTNAME:NUMBERaccè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=:0cela ne fonctionne pas dans la session SSH (mais ssh -Xque, s'il est activé sur le serveur, vous ne le ferez jamais. besoin de XAUTHORITYjouer avec en faisant ssh -X). Si cela pose un problème, vous devez définir la XAUTHORITYvariable 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_namepour 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 & ).