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.
( DISPLAY=:0 yourapp & ).