web-dev-qa-db-fra.com

Comment obtenir le numéro d'affichage qui m'a été attribué par X

De X(7) _ pages de manuel

DISPLAY NAMES
       From the user's perspective, every X server has a display name of the form:

                                  hostname:displaynumber.screennumber
[...]

displaynumber
    [...]
    To avoid confusion, each display on a machine is assigned a display
    number (beginning at 0) when the X server for that display is started.

Comment trouver le numéro d'affichage qui m'a été attribué?

Ou liste des écrans actuellement ouverts et leurs utilisateurs?

17
ricab

Si vous connaissez un ID de processus en cours d’exécution dans la session de l’utilisateur et que vous êtes autorisé à accéder aux informations de ce processus, vous pouvez grep son environnement pour la variable DISPLAY:

cat /proc/$pid/environ | tr '\0' '\n' | grep '^DISPLAY='

Par exemple, pour répertorier tous les écrans principaux utilisés par votre UID sur l'ordinateur actuel, utilisez:

ps -u $(id -u) -o pid= | \
    while read pid; do
        cat /proc/$pid/environ 2>/dev/null | tr '\0' '\n' | grep '^DISPLAY=:'
    done | grep -o ':[0-9]*' | sort -u

Si vous êtes uniquement connecté à une session X, les opérations ci-dessus ne doivent générer qu'une seule ligne avec quelque chose comme :0.

24
Amir

Dans la session X, vous pouvez toujours consulter la variable d’environnement DISPLAY pour obtenir votre numéro d’affichage actuel (echo $DISPLAY).

Il est plus difficile de connaître les chiffres affichés . Je ne pense pas qu'il existe un moyen standard d'obtenir les informations autres que de demander à tous les utilisateurs à quel écran ils sont connectés. Toute tentative d'obtention de ces informations nécessite donc une sorte de piratage informatique et ne fonctionnera pas dans tous les cas.

Certaines options sont données ailleurs dans SE , mais elles ne fonctionneront pas sous Debian Wheezy, par exemple. Toutefois, il est facile de répertorier les affichages actuellement actifs, comme le montre le message ci-dessus lié:

ps axu | grep "X " vous montrera les processus X en cours d'exécution, à peu près comme suit:

root      2354  0.0  0.5  23380 18292 tty8     Ss+  Sep15   2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root      7901  0.0  0.3  17044 12072 tty7     Ss+  Sep14   5:58 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a

Le premier paramètre après /usr/bin/X est le numéro d'affichage préfixé par le signe deux-points, et le suivant indique le terminal virtuel affecté à la session.

Vous obtiendrez peut-être votre réponse en consultant la liste des processus:

ps axu |grep -3 "X "

root      1990  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      1991  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      1992  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      2354  0.0  0.5  23380 18292 tty8     Ss+  Sep15   2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root      2359  0.0  0.0   5264  2228 ?        S    Sep15   0:00 -:1            
user_1     2378  0.0  0.0   4920  1348 ?        Ss   Sep15   0:00 /bin/sh /usr/bin/startkde
user_1     2443  0.0  0.0   3868   348 ?        Ss   Sep15   0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/openbox-kde-session
--
root      7500  0.0  0.0   6460  1080 ?        Ss   Sep14   0:00 /usr/sbin/sshd
ntp       7841  0.0  0.0   5352  1760 ?        Ss   Sep14   0:17 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:111
root      7882  0.0  0.0   3964   716 ?        Ss   Sep14   0:00 /usr/bin/kdm -config /var/run/kdm/kdmrc
root      7901  0.0  0.3  17044 12072 tty7     Ss+  Sep14   5:59 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a
root      7906  0.0  0.0   5260  2224 ?        S    Sep14   0:00 -:0            
user_2    7925  0.0  0.0  12924  1560 ?        Ssl  Sep14   0:00 /usr/bin/lxsession -s LXDE -e LXDE
user_2    7990  0.0  0.0   3868   348 ?        Ss   Sep14   0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/startlxde

Examinez les lignes après /usr/bin/X - au démarrage de la session X, un gestionnaire de fenêtres est généralement lancé en tant qu'utilisateur auquel la session appartient et vous obtenez alors le nom d'utilisateur. Dans mon cas, l'utilisateur_1 utilise KDE et l'utilisateur_2 utilise LXDE. Cependant, cette solution repose uniquement sur le fait que le noyau attribue de nouveaux ID de processus en ordre croissant, ce qui peut ne pas toujours être le cas.

11
zagrimsan

Cette réponse a une ligne, basée sur who & grep

https://askubuntu.com/a/230838/152287

who peut être abrégé en w

vous pouvez en savoir plus sur le lien, y compris une ligne pour obtenir la valeur.

Ça marche. Voici la sortie raspberrypi (rasbian), où la valeur d'affichage est dans la colonne FROM

tim@raspberrypi:~ $ w
 19:19:30 up  8:15,  2 users,  load average: 0.12, 0.11, 0.09
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
pi       tty7     :0               11:04    8:15m  1:15   0.89s /usr/bin/lxsess
tim      pts/0    192.168.0.29     19:17    0.00s  1.00s  0.09s w
2
Tim Richardson

https://gitorious.org/termsql/pages/Home

termsql est un bon outil pour extraire de telles informations.

Trouver le numéro d’AFFICHAGE est l’un des exemples:

export DISPLAY=$(ps aux | termsql "select COL11 from tbl where COL10 like '%Xorg.bin%' limit 1")

(définissez la variable d'environnement DISPLAY sur l'affichage actuellement utilisé par X, en supposant que le fichier binaire X s'appelle Xorg.bin)

1
Ano

Une petite variation sur la réponse d'Amir.

ps e affichera l'environnement de chaque commande, séparé par des espaces, de sorte qu'il puisse être passé directement à sed pour filtrer DISPLAY, donnant une commande plus simple que de lire directement/proc/PID/environ. (Cependant, pour lire les environnements d'autres utilisateurs, vous avez toujours besoin d'autorisations root.)

Ce code affichera les noms de tous les utilisateurs connectés avec des sessions X et leurs numéros DISPLAY:

#!/bin/bash
declare -A disps usrs
usrs=()
disps=()

for i in $(users);do
    [[ $i = root ]] && continue # skip root
    usrs[$i]=1
done # unique names

for u in "${!usrs[@]}"; do
    for i in $(Sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
        disps[$i]=$u
    done
done

for d in "${!disps[@]}";do
    echo "User: ${disps[$d]}, Display: $d"
done
1
johnraff