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 yes
w /etc/sshd_config
(lub /etc/ssh/sshd_config
lub wszędzie tam, gdzie jest plik konfiguracyjny). Po stronie klienta przekaż -X
opcję do ssh
polecenia lub wprowadź ForwardX11
swoją ~/.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. ( .0
Część 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 localhost
można uzyskać dostęp do serwera X za pośrednictwem obu ekranów, ale aplikacje będą używać innej metody: :NUMBER
uzyskuje dostęp do serwera za pośrednictwem lokalnych gniazd i pamięci współużytkowanej, podczas gdy HOSTNAME:NUMBER
uzyskuje 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=:0
to nie działa w sesji SSH (ale ssh -X
będzie, jeśli jest włączone na serwerze; nigdy nie trzeba zadzierać z XAUTHORITY
kiedy robi ssh -X
). Jeśli to jest problem, musisz ustawić XAUTHORITY
zmienną ś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_name
do 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 & )
.