Gibt es einen Befehl, um alle offenen Anzeigen auf einer Maschine aufzulisten?

76

Wenn sich SSH lokal auf meinem Computer befindet (fragen Sie nicht, es ist eine Problemumgehung), kann ich grafische Anwendungen nicht starten, ohne Folgendes auszuführen:

export DISPLAY=:0.0

Wenn ich dies zuerst ausführe und dann eine grafische Anwendung ausführe, funktionieren die Dinge. Wenn nicht, funktioniert es nicht, es gibt kein Display zum Anhängen.

Gibt es einen Befehl zum Auflisten aller verfügbaren Anzeigen (dh aller möglichen Werte) auf einer Maschine?

Naftuli Kay
quelle
Eine sauberere Möglichkeit, Anwendungen von einem Terminal aus zu starten, ist ( DISPLAY=:0 yourapp & ).
Nobar
3
Versuchen Sie, diese Anzeigenummer aus einem Befehlszeilenskript abzurufen w. Weitere Informationen: Vorhandene X-Anzeigenamen auflisten?
Aexl

Antworten:

80

Wenn Sie die X-Verbindung über SSH weiterleiten möchten, müssen Sie sie sowohl auf der Server- als auch auf der Clientseite aktivieren. (Je nach Distribution ist sie möglicherweise standardmäßig aktiviert oder deaktiviert.) Stellen Sie auf der Serverseite sicher, dass Sie sich X11Forwarding yesin /etc/sshd_config( /etc/ssh/sshd_configoder wo auch immer sich die Konfigurationsdatei befindet) befinden. Übergeben Sie auf der Clientseite die -XOption an den sshBefehl , oder geben Sie ForwardX11Ihre ein ~/.ssh/config.

Wenn du rennst ssh -X localhost, solltest du sehen, dass $DISPLAYdas (wahrscheinlich) ist localhost:10.0. Im Gegensatz dazu :0.0ist dies der Wert, wenn Sie nicht über SSH verbunden sind. (Der .0Teil kann weggelassen werden; es handelt sich um eine Bildschirmnummer, aber es werden selten mehrere Bildschirme verwendet.) Es gibt zwei Arten von X-Anzeigen, auf die Sie wahrscheinlich jemals stoßen werden:

  • Lokale Anzeigen, mit nichts vor dem :.
  • TCP wird angezeigt, mit einem Hostnamen vor dem :.

Mit ssh -X localhostkönnen Sie über beide Anzeigen auf den X-Server zugreifen, die Anwendungen verwenden jedoch eine andere Methode: Sie greifen :NUMBERüber lokale Sockets und gemeinsam genutzten Speicher HOSTNAME:NUMBERauf den Server zu , während der Zugriff auf den Server über TCP langsamer ist und einige Erweiterungen deaktiviert.

Beachten Sie, dass Sie eine Form der Autorisierung benötigen, um auf einen X-Server zuzugreifen, der als Cookie bezeichnet wird und normalerweise hinter den Kulissen in der Datei gespeichert wird ~/.Xauthority. Wenn Sie ssh verwenden ein anderes Benutzerkonto zugreifen zu können , oder wenn die Verteilung der Cookies in einer anderen Datei legt, können Sie feststellen , dass DISPLAY=:0nicht innerhalb der SSH - Sitzung funktioniert (aber ssh -Xwird, wenn es auf dem Server aktiviert ist, Sie nie müssen Chaos mit , XAUTHORITYwenn tun ssh -X). Wenn dies ein Problem ist, müssen Sie die XAUTHORITYUmgebungsvariable festlegen oder die Cookies des anderen Benutzers abrufen .

So beantworten Sie Ihre eigentliche Frage:

  • Lokale Anzeigen entsprechen einem Socket-In /tmp/.X11-unix.

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • Fernanzeigen entsprechen offenen TCP-Ports über 6000; Der Zugriff auf die Anzeigenummer N auf Maschine M erfolgt durch Verbinden mit dem TCP-Port 6000 + N auf Maschine M. Von Maschine M aus:

    netstat -lnt | awk '
      sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
        print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
      }'
    

    (Der Rest dieses Punktes ist nur von akademischem Interesse.)

    Auf einem anderen Computer können Sie nmap -p 6000-6099 host_nameoffene TCP-Ports im üblichen Bereich prüfen. Heutzutage ist es selten, dass X-Server einen TCP-Socket überwachen, insbesondere außerhalb der Loopback-Schnittstelle.

    Genau genommen könnte eine andere Anwendung einen Port in dem Bereich verwenden, der normalerweise von X-Servern verwendet wird. Sie können feststellen, ob ein X-Server empfangsbereit ist, indem Sie prüfen, bei welchem ​​Programm der Port geöffnet ist.

    lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
    

    Wenn das etwas Zweideutiges wie zeigt sshd, gibt es keine Möglichkeit, sicher zu wissen, ob es ein X-Server oder ein Zufall ist.

Gilles
quelle
15

Die Anzeige ist das erste Argument für Xorg. Sie können psdann herausgreifen Xorg.

[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

Sie können dies dann awkin jedes gewünschte Format umwandeln.

Vitor Py
quelle
10
Dies erkennt keine Anzeigen, die von einem anderen Server als Xorg erstellt wurden, z . B. Xvnc .
cjm
5
ps aux |grep Xfunktionierte besser für mich
nobar
6
wZeigt alle angemeldeten Benutzer und deren Anzeige an.
Plenus Franckly
2
Beachten Sie, dass das Argument für Xorg (zumindest jetzt, in 2016) optional ist und (zumindest auf Fedora) normalerweise fehlt, sodass diese Methode überhaupt nicht mehr funktioniert.
BRPocock
Wenn es aus irgendeinem Grund nicht immer funktioniert, nur die Umgebungsvariable festzulegen, stellen Sie sie einem Befehl voran, DISPLAY=:0 netsurf "https://medium.com/"oder verwenden Sie export DISPLAY=:0, um die Variable für den Prozess freizugeben , nicht nur für die 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

[Bearbeiten: Ich habe eine Xnest-Instanz ausgeführt, um zu prüfen, ob dies auffällt. es werden nur Login-Shells erfasst ('w' steht für 'who'). Zurück zum Zeichenbrett für mich.] [Bearbeiten: Gefunden:

$ ls /tmp/.X11-unix

X0 X2

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

]

Fordi
quelle
1
Das ist ... seltsam ... ich frage mich, was die Erklärung dafür ist.
Fordi
(In Bezug auf GDM, das für mich auf Display 1024 ausgeführt wird) Ich konnte es nicht ein zweites Mal replizieren. Zu der Zeit habe ich xrdp ausprobiert, X11 Forwarding und ein paar VNC Clients. In einer typischen Installation wird GDM anscheinend unter X0 ... oder X1 ausgeführt, wenn Sie auf dem Sperrbildschirm auf die Schaltfläche "Als anderer Benutzer anmelden" geklickt haben. Ihre zweite Methode hat bei Fedora 23
Ray Foss
Ich habe mit Ihrem Befehl etwas auf Display 1024 gefunden, aber dort läuft nichts ps xeww | grep DISPLAY=:1024. Ich starte Chrome-Remote-Desktop auch auf Display 20.
Ray Foss
wfunktioniert nicht, wenn auf dem x-Server keine Anwendung ausgeführt wird (einschließlich Fenstermanager und Desktop). Funktioniert aber ls /tmp/.X11-unix.
12431234123412341234123
3
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

erledigt die Aufgabe durch Auflisten aller aktuellen DISPLAYS. Außerdem sehen Sie die zugewiesenen Anzeigen für einen bestimmten Benutzer ($ usr) mit:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
lenroc
quelle
Soll das die zweite sein ps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u?
Alexx Roche
0

In dem /tmpOrdner können sich auch .X??-lockDateien befinden, in denen ??die Sitzungsnummern angegeben sind.

Sie müssen diese löschen, wenn Sie eine Sitzungsnummer wiederverwenden möchten.

Sie können sie ls -awie gewohnt sehen, wenn Dateien, die mit einem beginnen, .ausgeblendet werden.

user177936
quelle
Das sind die Anzeigesitzungen?
Phk