Existe-t-il une commande permettant de répertorier tous les écrans ouverts sur une machine?

76

Lorsque SSH avait installé 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 d'abord cette application, puis une application graphique, les choses se passent bien. Sinon, cela ne fonctionne pas, il n'y a pas d'affichage à attacher.

Existe-t-il une commande permettant de répertorier tous les affichages disponibles (c.-à-d. Toutes les valeurs possibles) sur une machine?

Naftuli Kay
la source
Une façon plus propre de lancer des applications depuis un terminal est ( DISPLAY=:0 yourapp & ).
novembre
3
Pour obtenir ce numéro d'affichage à partir d'un script de ligne de commande, essayez w. Plus d'infos: liste des noms d'affichage X existants?
aexl

Réponses:

80

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.

Gilles, arrête de faire le mal
la source
15

L'affichage est le premier argument de Xorg. Vous pouvez psalors Xorgsortir.

[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 le awkplacer dans le format de votre choix.

Vitor Py
la source
10
Cela ne détecte pas les affichages créés par un serveur autre que Xorg, par exemple Xvnc .
cjm
5
ps aux |grep Xa fonctionné mieux pour moi
nobar
6
waffiche toutes les personnes connectées et leur affichage.
Plenus Franckly
2
Notez que l'argument de Xorg est (du moins à présent, en 2016) facultatif et (du moins sur Fedora) généralement absent, de sorte que cette méthode ne fonctionne plus du tout.
BRPocock
Si, pour une raison quelconque, configurer l'environnement var ne fonctionnera pas toujours ... essayez de l'ajouter à une commande DISPLAY=:0 netsurf "https://medium.com/"... ou utilisez-le export DISPLAY=:0pour partager le var avec le processus, pas uniquement le 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

[Edit: j'ai couru une instance de Xnest pour voir si cela l'attraperait - ce n'est pas; il ne capture que les coquilles de connexion ('w' est l'abréviation de 'who'). Retour à la planche à dessin pour moi.] [Edit: Trouvé le:

$ ls /tmp/.X11-unix

X0 X2

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

]

Fordi
la source
1
C'est ... bizarre ... Je me demande quelle est l'explication.
Fordi
(en ce qui concerne GDM fonctionnant sur mon écran 1024), je ne pouvais pas le répliquer une seconde fois. À l'époque, j'essayais xrdp, le transfert X11 sous fenêtre et quelques clients VNC. Il semble que dans une installation typique, GDM s'exécutera sur X0 ... ou X1 si vous avez cliqué sur le bouton "Se connecter en tant qu'autre utilisateur" sur l'écran de verrouillage. Votre deuxième méthode a fonctionné pour moi sur Fedora 23
Ray Foss le
J'ai trouvé quelque chose sur l'affichage 1024 en utilisant votre commande, mais je ne vois rien courir là-bas ... en utilisant ps xeww | grep DISPLAY=:1024maintenant c'est bizarre. J'exécute chrome-remote-desktop sur l'écran 20 ainsi.
Ray Foss
wne fonctionne pas si aucune application n'est en cours d'exécution sur le serveur x (y compris aucun gestionnaire de fenêtres et aucun bureau). Mais ls /tmp/.X11-unixça marche.
12431234123412341234123
4
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

fera le travail en listant tous les DISPLAY actuels. Vous pouvez aussi voir les affichages assignés à un utilisateur spécifique ($ usr) avec:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
Lenroc
la source
Est-ce que le second est censé être ps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u?
Alexx Roche
0

Dans le /tmpdossier, il peut également y avoir des .X??-lockfichiers avec ??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 -anormalement les fichiers commençant par un .sont cachés.

utilisateur177936
la source
Ce sont les sessions d'affichage?
phk