Якщо ви хочете, щоб з'єднання 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 & ).