web-dev-qa-db-fra.com

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

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?

78
Naftuli Kay

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:

  • Affichages locaux, sans rien avant le :.
  • TCP s'affiche, 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è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.

16
Vitor Py
# 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

]

7
Fordi
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
4
lenroc

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.

0
user177936