Это дополняет другие ответы информацией, специфичной для Windows-Subsystem for Linux. Общепринятый ответ правилен: ваша DISPLAY
переменная настроена неправильно. Однако не совсем понятно, почему это так, исходя из одного ответа, поэтому я исправляю этот ответ.
Если вы используете Cygwin или Windows-Subsystem для Linux, и ваш сервер X11 работает на базе Windows (например VcXsrv
, или XMing
), более вероятно, что ваш сервер X11 прослушивает порт TCP (например, 127.0.0.1
на портах TCP 6000-6010
), чем на сокет домена Unix по умолчанию ( /tmp/.X11-unix/X0
). Unix-сокеты не очень хорошо поддерживаются в Windows на данный момент, даже внутри WSL. Взаимодействие между программами в среде, подобной Linux, и программами, работающими непосредственно на хосте Windows, также обычно проще по сравнению с IP-сокетами.
Когда вы запускаете графические приложения локально (например, из среды Cygwin или WSL вашего хоста), и ваша DISPLAY
переменная установлена в значение по умолчанию (т.е. DISPLAY=:0.0
), приложения сначала будут пытаться подключиться к X-серверу через сокет Unix /tmp/.X11-unix/X0
. Это не удастся, но большинство приложений затем откатятся к TCP-соединению localhost
, которое должно преуспеть в достижении сервера, если ваш X-сервер настроен по умолчанию.
Вы можете подтвердить, что это происходит, посмотрев connect()
вызовы в журналах strace из прогона вашего графического приложения. Обычно это происходит на ранних этапах, до того, как появится главное окно приложения.
Такое аварийное поведение не происходит, когда ssh перенаправляет соединение с удаленной стороны, поэтому вы получаете эту ошибку. sshd
действительно перенаправляет соединение на локальную сторону, но локальное соединение клиента ssh заходит в тупик, поскольку он не может связаться с сервером через сокет Unix. Вы тогда получаете ENOENT
ошибку.
В таких случаях изменение вашей DISPLAY
переменной для использования синтаксиса TCP вместо :0.0
синтаксиса может решить проблему:
DISPLAY=127.0.0.1:0 ssh remote some-gui-application
Как и в других ответах, вы также можете в интерактивном режиме экспортировать эту переменную из командной строки:
$ export DISPLAY=127.0.0.1:0
...
$ ssh remote some-gui-application
Вы также можете сохранить этот параметр более постоянно, добавив эту строку в скрипт инициализации профиля оболочки входа (например ~/.bash_profile
).
Примечание. В некоторых оболочках есть разные сценарии инициализации для сеансов входа и не входа в систему. Например, с помощью bash вы можете записать эту строку в сценарий без входа в систему, то есть ~/.bashrc
вместо ~/.bash_profile
. Если вы это сделаете, будьте осторожны, чтобы не переопределить любое пользовательское значение, которое могло быть установлено ssh. Это было бы так, если бы вы сначала подключились к своему хосту через ssh, а затем снова подключились к другому хосту (таким образом, вложив пересылку X11).
strace -fo /tmp/trace ssh....
чтобы проверить, что он пытается подключить этот сокет домена Unix.