Це доповнює інші відповіді інформацією, специфічною з Windows-підсистеми для Linux. Загальноприйнятий відповідь правильний: ваша DISPLAY
змінна налаштована неправильно. Однак не зовсім зрозуміло, чому так відбувається саме з цієї відповіді, тому я виправляю цю відповідь.
Якщо ви працюєте з cygwin або Windows-підсистемою для Linux, а ваш сервер X11 базується на вікнах (наприклад 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()
дзвінки в журналах прострочок із запуску вашої графічної програми. Це, як правило, відбудеться рано, перш ніж з’явиться головне вікно програми.
Така резервна поведінка не відбувається, коли 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.