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 yes
in /etc/sshd_config
( /etc/ssh/sshd_config
oder wo auch immer sich die Konfigurationsdatei befindet) befinden. Übergeben Sie auf der Clientseite die -X
Option an den ssh
Befehl , oder geben Sie ForwardX11
Ihre ein ~/.ssh/config
.
Wenn du rennst ssh -X localhost
, solltest du sehen, dass $DISPLAY
das (wahrscheinlich) ist localhost:10.0
. Im Gegensatz dazu :0.0
ist dies der Wert, wenn Sie nicht über SSH verbunden sind. (Der .0
Teil 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 localhost
kö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:NUMBER
auf 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=:0
nicht innerhalb der SSH - Sitzung funktioniert (aber ssh -X
wird, wenn es auf dem Server aktiviert ist, Sie nie müssen Chaos mit , XAUTHORITY
wenn tun ssh -X
). Wenn dies ein Problem ist, müssen Sie die XAUTHORITY
Umgebungsvariable 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_name
offene 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.
( DISPLAY=:0 yourapp & )
.