Jeśli chcesz, aby połączenie X było przekazywane przez SSH, musisz włączyć je zarówno po stronie serwera, jak i klienta. (W zależności od dystrybucji, może być włączona lub wyłączona domyślnie). Po stronie serwera, upewnij się, że masz X11Forwarding yesw /etc/sshd_config(lub /etc/ssh/sshd_configlub wszędzie tam, gdzie jest plik konfiguracyjny). Po stronie klienta przekaż -Xopcję do sshpolecenia lub wprowadź ForwardX11swoją ~/.ssh/config.
Jeśli uruchomisz ssh -X localhost, powinieneś zobaczyć $DISPLAY(prawdopodobnie) localhost:10.0. Porównaj z :0.0, co jest wartością, gdy nie masz połączenia przez SSH. ( .0Część można pominąć; jest to numer ekranu, ale rzadko używa się wielu ekranów.) Istnieją dwie formy wyświetlaczy X, z którymi możesz się kiedykolwiek spotkać:
- Wyświetlacze lokalne, bez niczego przed
:.
- Wyświetla się TCP z nazwą hosta przed
:.
Za pomocą ssh -X localhostmożna uzyskać dostęp do serwera X za pośrednictwem obu ekranów, ale aplikacje będą używać innej metody: :NUMBERuzyskuje dostęp do serwera za pośrednictwem lokalnych gniazd i pamięci współużytkowanej, podczas gdy HOSTNAME:NUMBERuzyskuje dostęp do serwera przez TCP, który jest wolniejszy i wyłącza niektóre rozszerzenia.
Pamiętaj, że potrzebujesz formy autoryzacji dostępu do serwera X, zwanej ciasteczkiem i zwykle przechowywanej za kulisami w pliku ~/.Xauthority. Jeśli używasz ssh, aby uzyskać dostęp do innego konta użytkownika lub jeśli twoja dystrybucja umieszcza pliki cookie w innym pliku, może się okazać, że DISPLAY=:0to nie działa w sesji SSH (ale ssh -Xbędzie, jeśli jest włączone na serwerze; nigdy nie trzeba zadzierać z XAUTHORITYkiedy robi ssh -X). Jeśli to jest problem, musisz ustawić XAUTHORITYzmienną środowiskową lub uzyskać pliki cookie drugiego użytkownika .
Aby odpowiedzieć na twoje aktualne pytanie:
Lokalne wyświetlacze odpowiadają gniazdu wejściowemu /tmp/.X11-unix.
(cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
Zdalne wyświetlacze odpowiadają otwartym portom TCP powyżej 6000; dostęp do numeru N na komputerze M odbywa się poprzez połączenie z portem TCP 6000 + N na komputerze M. Z samego komputera M:
netstat -lnt | awk '
sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
}'
(Reszta tego punktu jest interesująca tylko dla naukowców.)
Z innego komputera możesz użyć nmap -p 6000-6099 host_namedo sondowania otwartych portów TCP w zwykłym zakresie. W dzisiejszych czasach rzadko serwery X nasłuchują na gnieździe TCP, szczególnie poza interfejsem pętli zwrotnej.
Ściśle mówiąc, inna aplikacja może korzystać z portu w zakresie zwykle używanym przez serwery X. Możesz stwierdzić, czy serwer X nasłuchuje, sprawdzając, który program ma otwarty port.
lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
Jeśli pokazuje to coś niejednoznacznego sshd, nie ma sposobu, aby się upewnić, czy jest to serwer X, czy przypadek.
( DISPLAY=:0 yourapp & ).