Это дополняет другие ответы информацией, специфичной для 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.