Wie bekomme ich die Displaynummer, die mir von X zugewiesen wurde?

19

Aus X (7) Manpages

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.

Wie finde ich die mir zugewiesene Anzeigenummer?

Oder aktuell geöffnete Displays und deren Benutzer auflisten?

Ricab
quelle

Antworten:

28

Wenn Sie eine Prozess-ID kennen, die in der Benutzersitzung ausgeführt wird, und über die Berechtigung verfügen, auf die Informationen dieses Prozesses zuzugreifen, können Sie dessen Umgebung nach der DISPLAYVariablen durchsuchen:

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

Verwenden Sie beispielsweise Folgendes, um alle Hauptanzeigen aufzulisten, die von Ihrer UID auf dem aktuellen Computer verwendet werden:

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

Wenn Sie nur in einer X-Sitzung angemeldet sind, sollte das oben Gesagte nur eine Zeile mit so etwas wie ausgeben :0.

Amir
quelle
Hinweis: Wenn Sie dies in einer Zeile verwenden möchten, müssen Sie ein ;vor dem hinzufügen done.
not2qubit
@ user1147688 danke, aber ein Newline-Zeichen funktioniert genauso gut, zumindest in den von mir verwendeten Shells (Bash und Dash).
Amir
Genial! Vielen Dank. Ich habe dies für unix.stackexchange.com/a/429162/12574 mit einigen Verbesserungen gestohlen ;)
Gilles Quenot
11

In der X-Sitzung können Sie immer die DISPLAYUmgebungsvariable konsultieren , um die aktuelle Anzeigenummer zu erhalten ( echo $DISPLAY).

Das Herausfinden der Anzeigenummern anderer ist schwieriger. Ich glaube nicht, dass es eine Standardmethode gibt, um die Informationen abzurufen, außer dass alle Benutzer gefragt werden, mit welchem ​​Display sie verbunden sind. Daher erfordert jeder Versuch, diese Informationen abzurufen, eine Art Hackerangriff und funktioniert nicht in allen Fällen.

Es gibt einige Optionen, die an anderer Stelle in SE angegeben sind, aber sie funktionieren beispielsweise nicht für Debian Wheezy. Das Auflisten der derzeit aktiven Anzeigen ist jedoch einfach, wie in dem Beitrag gezeigt, den ich oben verlinkt habe:

ps axu | grep "X " zeigt Ihnen die aktuell ausgeführten X-Prozesse, etwa wie folgt:

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

Der erste Parameter nach /usr/bin/Xist die durch Doppelpunkt gekennzeichnete Anzeigenummer, und der nächste zeigt Ihnen das der Sitzung zugewiesene virtuelle Terminal.

Möglicherweise erhalten Sie eine Antwort, wenn Sie sich die Prozessliste ansehen:

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

Schauen Sie sich die folgenden Zeilen an /usr/bin/X: Beim Start der X-Sitzung wird in der Regel ein Fenstermanager als der Benutzer gestartet, zu dem die Sitzung gehört, und dort erhalten Sie den Benutzernamen. In meinem Fall verwendet Benutzer_1 KDE und Benutzer_2 LXDE. Diese Lösung beruht jedoch nur auf der Tatsache, dass der Kernel zufällig neue Prozess-IDs in aufsteigender Reihenfolge zuweist, was möglicherweise nicht immer der Fall ist.

Zagrimsan
quelle
Danke, DISPLAY zu konsultieren ist die Antwort, denke ich. Die Variable DISPLAY ist jedoch möglicherweise veraltet. Dies ist mir beim erneuten Anschließen einer Bildschirmsitzung passiert . Es führte dazu, dass grafische Dinge nicht funktionierten. Ich habe es gelöst, indem ich DISPLAY gelöst, erneut angeschlossen und DISPLAY auf den neuen Wert gesetzt habe.
Ricab
Linux enthüllt die Umgebung jedes Prozesses unter /proc/$pid/environ, wie in cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. Siehe meine Antwort für ein anderes Verwendungsbeispiel.
Amir
2

Diese Antwort ist einzeilig und basiert auf who& grep

/ubuntu//a/230838/152287

who kann abgekürzt werden als w

Sie können mehr unter dem Link lesen, einschließlich eines Einzeilers, um den Wert zu erhalten.

Es klappt. Hier ist die Ausgabe von raspberrypi (rasbian), wobei der Anzeigewert in der FROM-Spalte steht

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
Tim Richardson
quelle
1

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

termsql ist ein gutes Werkzeug, um solche Informationen zu extrahieren.

Das Herausfinden der DISPLAY-Nummer ist eines der Beispiele:

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

(Setzen Sie die Umgebungsvariable DISPLAY auf die Anzeige, auf der X gerade ausgeführt wird, vorausgesetzt, die X-Binärdatei wird aufgerufen. Xorg.bin)

Ano
quelle
1

Eine kleine Variation von Amirs Antwort.

ps esedGibt die Umgebung jedes Befehls mit einem getrennten Leerzeichen aus, sodass sie direkt an das Herausfiltern von DISPLAY übergeben werden kann. Dies ergibt einen einfacheren Befehl als das direkte Lesen von / proc / PID / environ. (Um die Umgebungen anderer Benutzer lesen zu können, benötigen Sie jedoch weiterhin Root-Berechtigungen.)

Dieser Code gibt die Namen aller angemeldeten Benutzer mit X-Sitzungen und deren DISPLAY-Nummern aus:

#!/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
Johnraff
quelle