Could not open x display

Could not open x display

After opening cygwin with X, all works great and as expected, but after a few hours I can’t open any other program that requires X display:

from cygwin

from spawned gnome-terminal

other than that all works fine

  1. Install latest cygwin with all x11 components
  2. run ssh -X $@$ -p$
  3. run gui-command (should work)
  4. wait 1-2h (maybe less) and try to start an app with gui

the remote PC is running ubuntu with openssh

Restart cygwin X server

I’ve looked into the official documentation and found this, but it is of no use as I don’t seem to have any of that software installed, and the description of the problems are very broad.

What other workarounds are there? Are there others in the same situation? Did I do something wrong? Are there better ways to use remote X11 programs on windows?

В операционной системе Linux очень жёсткий контроль полномочий для пользователей. Если пользователь не имеет прав администратора, то он не сможет сделать практически ничего дальше своей домашней папки. Но обычно графические приложения запускаются от имени рядового пользователя. Однако время от времени нужно что-то делать в графическом интерфейсе с файлами, которые не принадлежат текущему пользователю.

И тогда новички пытаются запустить нужное графическое приложение через sudo. Как правило, в таких ситуациях они получают ошибку "cannot open display :0 linux" или нечто подобное. В этой статье мы поговорим о том, что означает эта ошибка, а также как её обойти.

Что означает "cannot open display" в Linux?

Эта ошибка может выглядеть по-разному, в зависимости от приложения, которое вы будете запускать:

  • Gtk warning cannot open display :0;
  • Unable open display :0;
  • Can’t connect to display :0 No protocol specified;
Читайте также:  Asus zenfone max pro m1 asus shop

И так далее. Все эти ошибки означают одно: программа не может подключиться к графической подсистеме. Чтобы понять почему это происходит, возвращаемся к тому, что было сказано в самом начале статьи — в Linux очень жёсткий контроль прав пользователей.

В отличие от Windows, где графический интерфейс тесно интегрирован в операционную систему, в Linux это просто ещё одна программа, запущенная от имени обычного пользователя. Эта программа — графический сервер, на данный момент чаще всего используется Xorg.

Ещё одно отличие от Windows — это то, что вы можете запустить несколько графических серверов, и они будут работать не мешая друг другу, потому что каждый из них имеет свой адрес, по которому к нему можно подключиться. Эти серверы доступны глобально во всей системе (почти), но чтобы программы знали, к какому адресу им обращаться при запуске X-сервера, для текущего пользователя создаётся переменная DISPLAY с адресом графического сервера. По умолчанию для первого сервера присваивается адрес :0, для второго :1 и так далее.

Но поскольку при запуске команды через sudo для неё создаётся новое окружение с полномочиями суперпользователя и все переменные текущего пользователя из него не доступны, то наша программа просто не знает, по какому адресу ей обращаться. Это что касается ошибки, когда в конце сообщения "can’t open display" нет нуля. Если нуль есть, значит адрес известен, но X-сервер запрещает подключение. По умолчанию X-сервер разрешает подключаться к себе только пользователю, от имени которого он запущен. А теперь давайте разберём, как обойти проблему.

Как исправить "can’t open display :0"

Начнём с того, что для запуска графических приложений от имени суперпользователя существуют специальные утилиты. Программа sudo для этого не предназначена. Изначально для таких целей использовались kdesudo в KDE и gksu в Gnome. Сейчас они считаются устаревшими и поставляются по умолчанию далеко не всегда. В Ubuntu вы можете установить gksu командой:

Читайте также:  Apple usb c мощностью 29 вт

sudo apt install gksu

А затем запустить с помощью неё своё приложение:

Но надо заметить, что с дисплейным сервером Wayland эта утилита работать не будет. А полноценных альтернатив gksu не существует.

1. Использование PlicyKit

Есть утилита pkexec. Она достаточно удобная, но для каждой программы, которую вы хотите запустить с помощью неё надо создавать отдельно файл настройки. Например, чтобы запустить Nautilus, надо открыть файл ниже и добавить в него такой текст:

sudo vi /usr/share/polkit-1/actions/org.freedesktop.policykit.pkexec.policy

Это значит, что для каждого приложения нам необходимо включить параметр org.freedesktop.policykit.exec.allow_gui=true, иначе переменная DISPLAY экспортирована не будет. Теперь мы можем запустить nautilus:

Это очень неудобно для запуска новых приложений, поэтому есть ещё несколько путей. Другой вариант — вручную передать утилите нужные переменные:

pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY nautilus

2. Использование sudo

Можно попросить sudo передать все переменные нашего пользователя во временное окружение суперпользователя с помощью опции -E:

sudo -E nautilus

Тогда программа запускается.

3. Использование gvfs

Gnome Virtual Filesystem тоже позволяет получить доступ к файлам с правами администратора. Особенно если вам надо только отредактировать файл. Для этого просто добавьте в начале пути admin://. Например, так можно открыть файл /etc/group для редактирования с помощью gedit:

Смысл здесь в том, что программа запускается от имени обычного пользователя, а файл доступен ей через виртуальную файловую систему.

4. Снимаем ограничение доступа к Xorg

Обычно если переменная $XAUTHORITY содержит адрес файла аутентификации Xorg, то программа использует его для аутентификации в Xorg. Но если значение переменной не установлено, то сервер не позволит установить соединение. Например, если вы получаете ошибку подключения к Display :0, это значит, что адрес дисплейного сервера известен, но к нему нет доступа. Надо разрешить подключаться к Xorg суперпользователю. Для этого используйте команду:

Читайте также:  Hp rmn hstnn f01c

Эта команда действует только до перезагрузки, чтобы сделать её постоянной, добавьте команду в конец

#!/bin/bash
xhost +SI:localuser:root &

Выводы

В этой статье мы рассмотрели, как исправить ошибку gtk warning "cannot open display :0" в Ubuntu или другом дистрибутиве. Как видите, это не очень сложно. А вы знаете другие пути решения? Напишите в комментариях!

I’m completely new to Linux, I have installed in my computer (running on windows 7) a Virtual machine with Ubuntu desktop 14.04. I have installed some programs using apt-get install NAME_OF_THE PROGRAM . The problem is that when I try to launch the GUI of these programs from a terminal, I’m always getting problems and I don’t get to have the programs working. Now I have installed Giggle, the installation was ok but if I try to run giggle from the terminal I get:

And this problem is for all the programs that I install.

For example if I try to run xhost I get:

What is the next step to fix these problems??

Any help or recommendation would be really appreciated.

1 Answer 1

Run the following command from your terminal to fix this:

LightDM is the display manager running in Ubuntu, the first command starts this service. The second command sets the value in DISPLAY variable for exporting display on the client.

Ссылка на основную публикацию
Adblock detector