Откройте окно на удаленном X дисплеев (почему “Не может открыть дисплей”)?

Это зависит от того, что Вы подразумеваете под “Unix”, и “Linux”.

  • UNIX является зарегистрированным товарным знаком Open Group. Товарный знак имел богатую событиями историю, и не абсолютно ясно, что это не genericized из-за широко распространенного использования “Unix”, относящегося к подобным Unix системам (см. ниже). В настоящее время Open Group предоставляет использование товарного знака к любой системе, которая передает Единственный UNIX сертификация. См. также, Почему там *, Когда существует Упоминание о Unix Всюду по Интернету?.

  • Unix является операционной системой, которая родилась в 1969 в Bell Labs. Различные компании продали, и все еще продайте, кодируйте полученный из этой исходной системы, например, AIX, HP-UX, Солярис. См. также Эволюцию Операционных систем от Unix.

  • Существует много систем, которые подобны Unix, в этом они предлагают подобные интерфейсы программистам, пользователям и администраторам. Самой старой производственной системой является Распределение программного обеспечения Беркли, которое постепенно развивалось из Основанного на Unix (т.е. содержащий код, полученный из исходной реализации) к подобному Unix (т.е. имеющий подобный интерфейс). Существует много основанных на BSD или BSD-полученных операционных систем: FreeBSD, NetBSD, OpenBSD,   Mac OS X, и т.д. Другие примеры включают OSF/1 (теперь прекращенный, это была коммерческая подобная Unix non-Unix-based система), Minix (первоначально игрушечная подобная Unix операционная система, используемая в качестве обучающего инструмента, теперь производство встроило подобную Unix систему), и наиболее заметно Linux.


  • Строго говоря Linux является ядром операционной системы, которое разработано как ядро Unix.

  • Linux обычно используется в качестве названия подобных Unix операционных систем, которые используют Linux в качестве их ядра. Поскольку многие инструменты вне ядра являются частью проекта GNU, такие системы часто известны как GNU/Linux. Все главные дистрибутивы Linux состоят из GNU/Linux и другого программного обеспечения.

  • Существуют основанные на Linux подобные Unix системы, которые не используют много инструментов GNU, особенно во встроенном мире, но я не думаю, что любой из них покончил со средствами разработки GNU, в особенности GCC.

  • Существуют операционные системы, которые имеют Linux как их ядро, но не подобны Unix. Самым известным является Android, который не сделал, чтобы подобный Unix пользователь испытал (хотя можно установить подобную Unix командную строку), или опыт администратора, или (главным образом) опыт программиста (“собственные” программы Android используют API, который полностью отличается от Unix).

81
17.03.2017, 01:33
4 ответа

(Адаптированный из Linux: wmctrl не может открыть дисплей, когда сессия инициировала через ssh+screen),

ДИСПЛЕЙ и ПОЛНОМОЧИЯ

Для X программ нужны два сведения для соединения с X дисплеями.

  • Этому нужен адрес дисплея, который обычно является :0 когда Вы зарегистрированы локально или :10, :11, и т.д., когда Вы зарегистрированы удаленно (но число может измениться в зависимости от того, сколько X соединений активны). Адрес дисплея обычно обозначается в DISPLAY переменная среды.

  • Этому нужен пароль для дисплея. X паролей дисплея называют волшебными cookie. Волшебные cookie не указаны непосредственно: они всегда хранятся в X авторитетных файлах, которые являются набором записей формы “дисплей :42 имеет cookie 123456”. X авторитетных файлов обычно обозначаются в XAUTHORITY переменная среды. Если $XAUTHORITY не установлен, использование программ ~/.Xauthority.

Вы пытаетесь действовать на окна, которые отображены на Вашем рабочем столе. Если Вы - единственный человек, использующий Вашу настольную машину, вероятно, что отображаемое имя :0. Нахождение местоположения X авторитетных файлов более трудно, потому что с gdm, как настроено под Debian сжимают или Ubuntu 10.04, это находится в файле со случайным образом сгенерированным именем. (У Вас не было проблемы прежде, потому что более ранние версии gdm использовали настройку по умолчанию, т.е. cookie, сохраненные в ~/.Xauthority.)

Получение значений переменных

Вот несколько способов получить значения DISPLAY и XAUTHORITY:

  • Можно систематически запускать экранную сессию с рабочего стола, возможно, автоматически в сценариях входа в систему (от ~/.profile; но сделайте это только если вход в систему под X: тест, если DISPLAY установлен на начало значения : (который должен покрыть все случаи, с которыми Вы, вероятно, встретитесь)). В ~/.profile:

    case $DISPLAY in
      :*) screen -S local -d -m;;
    esac
    

    Затем на ssh сессии:

    screen -d -r local
    
  • Вы могли также сохранить значения DISPLAY и XAUTHORITY в файле и отзыве значения. В ~/.profile:

    case $DISPLAY in
      :*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
    esac
    

    На ssh сессии:

    . ~/.local-display-setup.sh
    screen
    
  • Вы могли обнаружить значения DISPLAY и XAUTHORITY от рабочего процесса. Это более трудно автоматизировать. Необходимо выяснить PID процесса, это подключено к дисплею, от которого Вы хотите продолжить работать, затем получить переменные среды /proc/$pid/environ (eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')¹).

Копирование cookie

Другой подход (после предложения Arrowmaster) не должен пытаться получить значение $XAUTHORITY на ssh сессии, но вместо этого сделать X копий сессии ее cookie в ~/.Xauthority. Так как cookie сгенерированы каждый раз, когда Вы входите в систему, это не проблема, если Вы удерживаете устаревшие значения ~/.Xauthority.

Может быть проблема безопасности, если Ваш корневой каталог доступен по NFS или другой сетевой файловой системе, которая позволяет удаленным администраторам просматривать ее содержание. Они должны были бы все еще соединиться с Вашей машиной так или иначе, если Вы не включили X соединений TCP (Debian имеет их прочь по умолчанию). Таким образом для большинства людей, это любой не применяется (никакой NFS) или не является проблемой (соединения TCP № X).

Для копирования cookie, когда Вы войдете в свой рабочий стол X сессий добавьте следующие строки к ~/.xprofile или ~/.profile (или некоторый другой сценарий, который прочитан, когда Вы входите в систему):

case $DISPLAY:$XAUTHORITY in
  :*:?*)
    # DISPLAY is set and points to a local display, and XAUTHORITY is
    # set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
    XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac

¹ В принципе это испытывает недостаток в надлежащем заключении в кавычки, но в этом определенном экземпляре $DISPLAY и $XAUTHORITY не будет содержать метасимвола оболочки.

78
27.01.2020, 19:30
  • 1
    Один способ автоматизировать это состоял бы в том, чтобы создать a ~/.xprofile который должен только быть выполнен во время эти X входов в систему и иметь его, создают/обновляют ~/.Xauthority с корректной информацией. Символьная ссылка была бы достаточно? –  Arrowmaster 26.03.2011, 01:16
  • 2
    @Arrowmaster: это - хорошее предложение. Я не думал о нем. Это не будет работать во всех случаях, например, если Вы войдете больше чем в один X сессий (на различных терминалах, с vnc, …), но это просто, и это достаточно хорошо для типичного использования. Символьная ссылка является лучшим способом. Хм, на самом деле существует лучший, простой путь: можно скопировать информацию в ~/.Xauthority. –  Gilles 'SO- stop being evil' 26.03.2011, 01:21
  • 3
    Был бы, помещая что-то как xauth extract - $DISPLAY | xauth -f "$HOME/.Xauthority" merge - в ~/.xprofile решить случай нескольких $DISPLAY's? –  Arrowmaster 26.03.2011, 01:52
  • 4
    @Arrowmaster: Какую проблему Вы видите с несколькими дисплеями? В то время как Ваш код может быть немного более чистым в принципе, так как Вы только извлекаете информацию о дисплее, которым Вы интересуетесь, я не вижу ничто плохого с простым слиянием в случае автора вопроса, или действительно вне очень необычных обстоятельств. –  Gilles 'SO- stop being evil' 26.03.2011, 01:58
  • 5
    Чтение среды из существующего процесса, подключенного к дисплею, неожиданно для восхитительного зла. Я одобряю искренне. Unix. SE нужен Злой значок Genius™ для этого. –  derobert 30.11.2011, 09:22

Вы должны export DISPLAY=:0.0

7
27.01.2020, 19:30
  • 1
    номера не требует экспорта, когда переменная записана на той же строке. Та переменная является эффективной до концов строки. –  Alexis Wilke 18.05.2016, 01:29
  • 2
    Действительно, Вы правы. –  asoundmove 18.05.2016, 11:43
  • 3
    Этот ответ является явно неправильным и должен быть удален. –  Piotr Dobrogost 25.07.2017, 18:16
  • 4
    Не знал просто, что вводящий ДИСПЛЕЙ =:0.0 определит имя переменной. Спасибо @asoundmove. Однако я думаю:0.0, значение для переменной ДИСПЛЕЯ в дисплее сервера. Если Вы входите в систему от Шпаклевки, переменный ДИСПЛЕЙ должен 10 или выше. таким образом, это должен быть =:10 –  alpha_989 07.11.2017, 18:21

Я решил эту проблему путем добавления

xhost +si:localuser:$USER

кому: ~/.xprofile. Я не знаю, безопасно ли это в целом (мне очень было бы интересно слышать, какие более хорошо осведомленные люди думают), но я предполагаю, что это намного лучше, чем выключение управления доступом (с xhost +) как обычно предлагается, когда Вы гуглите для этой проблемы.

20
27.01.2020, 19:30
  • 1
    localuser интерпретируемые сервером адреса абсолютно безопасны. Debian даже делает это по умолчанию как часть процесса входа в систему (в /etc/X11/Xsession.d/35x11-common_xhost-local). Дополнительную информацию см. в странице справочника Xsecurity. –  Sam Morris 01.06.2013, 01:31
  • 2
    Если Вы находитесь на LAN, xhost + достаточно вероятно, в большинстве случаев... –  Alexis Wilke 18.05.2016, 01:39
  • 3
    ДИСПЛЕЯ, Вы смогли бы объяснить, что означает эта команда? –  alpha_989 07.11.2017, 18:33

Работает на меня, debian wheezy -> ubuntu trusty.

Примечание: в этом случае на сервере не работает дисплей-менеджер, это "безголовая" виртуальная машина без видеокарты и монитора.

bob@laptop:~$ grep -iB 1 tcp /etc/gdm3/daemon.conf
[security]
DisallowTCP = false
bob@laptop:~$ ssh -C -R 6000:127.0.0.1:6000 alice@server
X11 forwarding request failed on channel 0
alice@server:~$ export DISPLAY=:0.0
alice@server:~$ xterm

X дисплей на ноутбуке показывает вывод xterm, запущенного на сервере.

Отладка с использованием:

bob@laptop:~/tmp$ nc -v 127.0.0.1 6001
localhost [127.0.0.1] 6001 (x11-1) : Connection refused
bob@laptop:~/tmp$ nc -v 127.0.0.1 6000
localhost [127.0.0.1] 6000 (x11) open
alice@server:~$ nc -v 127.0.0.1 6000
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!*
alice@server:~$ strace xterm

strace прольет кучу кровавых подробностей о том, что он делает, вы должны быть в состоянии угадать, где он застрял - в ожидании соединения или что-то в этом роде.

В одной строке

ssh -C -R 6000:127.0.0.1:6000 alice@server "DISPLAY=:0.0 xterm"
3
27.01.2020, 19:30

Теги

Похожие вопросы