Если вы хотите, чтобы 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переменную окружения или получить куки другого пользователя .
Чтобы ответить на ваш актуальный вопрос:
Локальные дисплеи соответствуют сокету в /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 & ).