Якщо ви хочете, щоб з'єднання X пересилалось через SSH, вам потрібно включити його як на стороні сервера, так і на стороні клієнта. (Залежно від дистрибутиву, він може бути включений або відключений за замовчуванням.) На стороні сервера переконайтеся, що ви перебуваєте X11Forwarding yes
у /etc/sshd_config
( /etc/ssh/sshd_config
або де б не був конфігураційний файл). На стороні клієнта передайте -X
параметр ssh
команді або ForwardX11
введіть свою ~/.ssh/config
.
Якщо ви біжите ssh -X localhost
, ви повинні побачити, що $DISPLAY
це (мабуть) localhost:10.0
. На відміну від цього :0.0
, це значення, коли ви не підключені через SSH. ( .0
Частина може бути опущена; це номер екрана, але кілька екранів використовуються рідко.) Є дві форми X-дисплеїв, з якими ви, швидше за все, стикаєтесь:
- Локальні дисплеї, перед цим нічого немає
:
.
- Відображається TCP з ім'ям хоста перед
:
.
З допомогою ssh -X localhost
ви можете отримати доступ до сервера X через обидва екрани, але програми використовуватимуть інший метод: :NUMBER
доступ до сервера через локальні сокети та спільну пам'ять, тоді як HOSTNAME:NUMBER
доступ до сервера через TCP, який повільніше і вимикає деякі розширення.
Зауважте, що вам потрібна форма авторизації для доступу до X-сервера, що називається файлом cookie і зазвичай зберігається поза кадром у файлі ~/.Xauthority
. Якщо ви використовуєте ssh для доступу до іншого облікового запису користувача, або якщо ваш дистрибутив розміщує файли cookie в іншому файлі, ви можете виявити, що DISPLAY=:0
він не працює в сеансі SSH (але ssh -X
буде, якщо це включено на сервері; ви ніколи потрібно возитися, XAUTHORITY
коли робите ssh -X
). Якщо це проблема, вам потрібно встановити XAUTHORITY
змінну середовища або отримати файли cookie іншого користувача .
Щоб відповісти на власне запитання:
Локальні дисплеї відповідають розетці в /tmp/.X11-unix
.
(cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
Віддаленим дисплеям відповідають відкриті порти TCP вище 6000; доступ до номера дисплея N на машині M здійснюється шляхом підключення до порту TCP 6000 + N на машині M. Від самого машини M:
netstat -lnt | awk '
sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
}'
(Решта цього пункту питання є лише академічним.)
На іншій машині ви можете nmap -p 6000-6099 host_name
зондувати відкриті порти TCP у звичайному діапазоні. В даний час дуже рідко X серверів слухати на TCP-розетці, особливо поза інтерфейсом зворотного зв'язку.
Власне кажучи, інша програма може використовувати порт у діапазоні, який зазвичай використовують X-сервери. Ви можете визначити, чи слухає X-сервер, перевіривши, у якої програми відкритий порт.
lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
Якщо це показує щось неоднозначне на кшталт sshd
, немає способу точно знати, чи це X-сервер чи збіг.
( DISPLAY=:0 yourapp & )
.