Если вы хотите, чтобы 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 & )
.