Lorsque SSH s'installe localement sur mon ordinateur (ne demandez pas, c'est une solution de contournement), je ne peux pas démarrer d'applications graphiques sans exécuter:
export DISPLAY=:0.0
Si je lance ceci en premier puis que j'exécute une application graphique, les choses fonctionnent. Sinon, cela ne fonctionne pas, il n'y a pas d'écran auquel se connecter.
Existe-t-il une commande pour répertorier tous les affichages disponibles (c'est-à-dire: toutes les valeurs possibles) sur une machine?
Si vous souhaitez que la connexion X soit transmise 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.) Côté serveur, assurez-vous que vous disposez de X11Forwarding yes
dans /etc/sshd_config
(ou /etc/ssh/sshd_config
ou où se trouve le fichier de configuration). Côté client, passez le -X
à la commande ssh
, ou mettez ForwardX11
dans ton ~/.ssh/config
.
Si vous exécutez ssh -X localhost
, vous devriez voir que $DISPLAY
est probablement) localhost:10.0
. Contraste avec :0.0
, qui est la valeur lorsque vous n'êtes pas connecté via SSH. (Le .0
une partie peut être omise; c'est un numéro d'écran, mais plusieurs écrans sont rarement utilisés.) Il existe deux formes d'affichage X que vous êtes susceptible de rencontrer:
:
.:
.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ède au serveur via des sockets locaux et de la mémoire partagée, tandis que HOSTNAME:NUMBER
accède au serveur via TCP, ce qui est plus lent et désactive certaines extensions.
Notez que vous avez besoin d'une forme d'autorisation pour accéder à un serveur X, appelé cookie et normalement stocké en arrière-plan dans le 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 pouvez constater que DISPLAY=:0
ne fonctionne pas dans la session SSH (mais ssh -X
le sera, s'il est activé sur le serveur; vous n'avez jamais besoin de jouer avec XAUTHORITY
lorsque vous faites ssh -X
). Si c'est un problème, vous devez définir la variable d'environnement XAUTHORITY
ou obtenir les cookies de l'autre utilisateur .
Pour répondre à votre vraie question:
Les affichages locaux correspondent à une socket dans /tmp/.X11-unix
.
(cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
Les affichages à distance correspondent aux ports ouverts TCP supérieurs à 6000; l'accès au numéro d'affichage N sur la machine M se fait en se connectant à TCP port 6000 + N sur la machine M. De 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 cette puce est uniquement d'intérêt académique.)
Depuis une autre machine, vous pouvez utiliser nmap -p 6000-6099 Host_name
pour sonder les ports ouverts TCP dans la plage habituelle. Il est rare de nos jours que les serveurs X écoutent sur une socket TCP, en particulier en dehors de l'interface de bouclage).
À strictement parler, une autre application pourrait utiliser un port dans la plage habituellement utilisée par les serveurs X. Vous pouvez savoir si un serveur X écoute en vérifiant quel programme a le port ouvert.
lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
Si cela montre quelque chose d'ambigu comme sshd
, il n'y a aucun moyen de savoir avec certitude s'il s'agit d'un serveur X ou d'une coïncidence.
L'affichage est le premier argument de Xorg
. Vous pouvez ps
puis grep Xorg
out.
[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
Vous pouvez ensuite awk
ceci dans le format dont vous avez besoin.
# 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: J'ai exécuté une instance Xnest pour voir si cela l'attraperait - ce n'est pas le cas; il capture uniquement les shells de connexion ("w" est l'abréviation de "qui"). Retour à la planche à dessin pour moi.] [Edit: Trouvé:
$ ls /tmp/.X11-unix
X0 X2
$ ls /tmp/.X11-unix | tr 'X' ':'
:0
:2
]
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
fera le travail en répertoriant tous les AFFICHAGES actuels. Vous pouvez également voir les affichages attribués pour un utilisateur spécifique ($ usr) avec:
ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
Dans le /tmp
dossier, il peut également y avoir .X??-lock
fichiers avec ??
indiquant les numéros de session.
Vous devez les supprimer si vous souhaitez réutiliser un numéro de session.
Vous pouvez les voir en utilisant ls -a
comme d'habitude les fichiers commençant par un .
sont masqués.