Как определить display linux
Guido любит Линукс не только из-за того, что ему интересно разбираться в том, как работают операционные системы, но так же из-за людей, которые участвуют в его создании
Запуск удаленных приложений в Х11
Многие пользователи при знакомстве с Линуксом думают, что его графический рабочий стол это просто еще одна " Windows" в которой можно запускать приложения в отдельных окнах. Некоторые, конечно, замечают, что можно иметь несколько рабочих столов, но все равно им кажется, что это Windows. X Window System (X11) это что-то гораздо большее! Это сетевая оконная система. Мы увидим, какие новые возможности она нам предлагает.
Общее понятие дисплея
Каждое графическое приложение X Window при запуске считывает переменную окружения DISPLAY, что бы выяснить на какой компьютерный экран посылать графические данные. Это, вместе с сетевыми возможностями системы X Window делает возможным удаленный запуск графических приложений. То есть вы используете ресурсы процессора одной машины при работе с приложением на другой. Весь GUI (графический интерфейс пользователя) появляется на той машине, с которой вы им управляете. Вы даже не замечаете, что используете два компьютера. Конечно, определенную роль здесь играет скорость передачи данных, но нормальной 10-мегабитной локальной сети вполне достаточно.
Для чего это вам?
Существует множество сетевых графических приложений. Компании используют их для управления оборудованием находящимся может быть за тысячи километров, и вы можете использовать такие же приложения так, как если бы они были на вашем компьютере.
Допустим, у вас есть два компьютера: одна быстрая гигагерцевая машина и еще старенький Pentium-133 - вы вполне сможете оценить скорость вашей новой машины, даже не садясь за нее. Возможно, ваша сестра заняла быстрый компьютер - но вы все равно пользуете его.
Как это работает?
Все приложения X Window (такие как например Gimp, Xterm, Konquerer, Netscape и т. д.) в действительности являются сетевыми клиентами, которые присоединяются к X-серверу. В задачу X-сервера входят: взаимодействие с графическим аппаратным обеспечением, рисование картинок на вашем экране, считывание данных с мышки и клавиатуры. Программы-клиенты (gimp, netscape) посылают серверу указания о том, как рисовать рамки и кнопки. Взамен они принимают от сервера команды с мышки и клавиатуры. Само собой разумеется, что потребуется аутентификация, иначе кто угодно может испортить чей-нибудь экран. Существуют две программы для управления доступом:
- xhost: используя эту программу, вы можете допустить любого пользователя с определенной машины передавать графику на ваш дисплей. Например: Вы работаете на машине с именем philosophus. Что бы дать доступ на ваш дисплей любой программе с хоста movietux вам нужно набрать команду:
xhost +movietux
Это должно быть набрано в оболочке philosophus'а
- xauth: Это более сложная программа, основанная на cookie. С ее помощью вы можете предоставлять доступ определенным пользователям, тем самым эта программа обладает более высоким уровнем безопасности, чем xhost. Аутентификация использует cookie из файла .Xauthority в домашней директории пользователя. Доступ дается только если удаленная машина содержит нужный cookie в этом файле. Что бы скопировать этот cookie с вашей машины (philosophus) на хост с которого вы хотите запускать программу (movietux), вы можете использовать один из следующих методов:
xauth extract - philosophus:0.0 | ssh movietux /usr/X11R6/bin/xauth merge
или
scp
- Клиент проверяет переменную DISPLAY для поиска сервера или пытается подключиться к серверу на локальном хосте.
- Сервер проверяет, имеет ли клиент допуск к передаче "картинок" к нему. Если имеет - тогда сервер рисует графику.
bash:export DISPLAY=hostname:displaynumber.screennumber
tcsh:setenv DISPLAY hostname:displaynumber.screennumber
Я не буду говорить о displaynumber и screennumber, обычно это 0.0. Вот пример для bash:
Запуск удаленного приложения
- Сообщите вашему X-серверу, что клиенты с movietux имеют допуск к рисованию картинок на вашем экране:
xhost +movietux - Заходите на удаленный хост movietux:
slogin -l username movietux - Теперь вы вошли на movietux, и все ваши команды исполняются на нем
- export DISPLAY=philosophus:0.0
- Запускайте программу напр.
netscape &
Перенос дисплея на удаленный хост
- Если вы используете ssh для входа на удаленный хост, тогда переменная DISPLAY устанавливается автоматически. Существуют так же и другие программы поддерживающие DISPLAY, но ssh наиболее распространенная.
- Если же вы используете slogin или другие команды, тогда на удаленный хост вы можете установить следующие скрипты:
Для tcsh:
/.login
set whoami=`who -ml`
set remhost=`expr "$whoami" : '.*(\(.*\))'`
if ( "$remhost" != "" ) then
setenv DISPLAY "$remhost":0.0
endif
этот скрипт получает имя удаленного хоста из команды "who -ml". Команда возвращает что-то вроде
если вы используете bash вам нужен такой скрипт:
/.bash_profile
whoami=`who -ml`
remhost=`expr "$whoami" : '.*(\(.*\))'`
if [ -n "$remhost" ]; then
DISPLAY="$remhost":0.0
export DISPLAY
fi
Мы перевели игровой процесс TGS Hyrule Warriors: Age of Calamity! Теперь на 100% больше английских субтитров!
Я использую Arch Linux, и все не так просто, когда вы пытаетесь обнаружить текущий Xorg DISPLAY (не через переменную env).
Вот рабочий пример:
В некоторых случаях это работает, в других - нет:
Сеанс гостя (tty3) был запущен с использованием pts (псевдотерминала).
Я использую gdm, и он запускает серверы xorg без конкретной команды (не уточняя номер дисплея).
Итак, вопрос на миллион: как узнать текущий (используемый) номер XServer DISPLAY? Текущий, потому что, как указано выше, у нас может быть несколько серверов (несколько пользователей).
Вы можете попробовать использовать loginctl list-sessions чтобы получить список сеансов, а затем используйте loginctl show-session -p Display -p Active на каждом из них, чтобы получить номер дисплея X11, связанный с текущим активным сеансом.
Примерно так (в bash):
Здесь $TARGET_DISPLAY - это массив, потому что гипотетически может быть более одного активного сеанса (в многопользовательской системе). Если в вашей конфигурации это невозможно, вы можете сделать ее простой переменной и добавить break 2 оператор после присваивания для выхода из обоих циклов.
. это больше не работает с GDM, потому что в этом случае запускается X-сервер внутри сеанс (с правами пользователя) и /usr/bin/gdm-x-session не передает эту информацию обратно logind (из-за отсутствия для этого API).
В других случаях (когда X-сервер запускается DM до создания сеанса) это, скорее всего, сработает. Извините, мне не известны другие методы.
- Привет @intelfx, здесь не сработало: loginctl list-sessions возвращается c1, c2 и c3 как СЕССИИ. Так loginctl show-session -p Display c1 или же c2 или даже c3 всегда возвращается Дисплей =
- @geyslan: Извините, я неправильно запомнил информацию, которую возвращает loginctl list-sessions - нет столбца "АКТИВНЫЙ" . И, на самом деле, ситуация оказывается хуже, чем я думал: начиная с 3.16 GDM перестал передавать номер дисплея X11 в logind из-за структурной переработки. Хотя это может работать с другими совместимыми DM.
- Нет проблем @intelfx. В любом случае спасибо за вашу помощь.
- @intelfx: очень хороший подход. В 1-2 основных релизах мне может понравиться вот это * d материал. Просто чтобы подбросить другую идею: однажды мне пришлось сопоставить XDisplays с именами пользователей. Я создаю кое-что, что просматривает все входящие TCP-соединения с различными X-серверами и голосует большинством за пользователей, которым принадлежат процессы соединения. Достаточно хорошо работает с современными DE.
Ну как ток я имею в виду активный Отображение сервера XOrg. Помните, что у нас может быть несколько запущенных серверов XOrg, и они могут быть многоголовыми, что усложняет манипулирование ими.
Другое важное замечание - переменная DISPLAY в некоторых случаях недоступна (например, systemd).
После некоторого обсуждения в commandlinefu я получил такой результат:
Этот фрагмент выполняет итерацию по списку всех процессов (фактически их идентификаторов), в которых установлен управляющий терминал, и соответствует терминалу этого процесса. Он проверяет среду каждого процесса на наличие DISPLAY переменной и удовлетворяется, как только находит ее. Найдя DISPLAY переменная прекращает повторение списка и echo результат.
Это напечатает активный дисплей, на котором запущен сценарий.
Следующий скрипт перечисляет имя пользователя и номер дисплея для вошедших в систему пользователей, когда соответствующий терминал активен.
Это мое решение, основанное на других ответах:
Это проверяет все сеансы входа в систему, которые также имеют X-сеансы. Если tty также совпадает, мы можем быть уверены, что это активный сеанс X, иначе мы используем 1-й.
Этот сценарий может быть расширен, чтобы соответствовать текущему пользователю, если вы хотите.
Вот пример с двумя серверами, работающими на одном хосте. я использовал startx чтобы запустить их обоих, как видно из вывода pstree -pl ниже. Первый дочерний процесс с $DISPLAY набор .xinitrc :
Это команда; если у вас другая настройка, вы можете изменить .xinitrc к чему-то еще здесь:
Числа показывают время простоя каждого дисплея в миллисекундах. В верхней строке отображается последний активный (наименее простаивающий) дисплей.
Как я могу найти номер дисплея, который мне назначен?
Или список открытых в данный момент дисплеев и их пользователей?
Если вам известен один идентификатор процесса, запущенный в сеансе пользователя, и у вас есть разрешение на доступ к информации этого процесса, вы можете использовать его среду для переменной DISPLAY :
Например, чтобы вывести список всех основных дисплеев, используемых вашим UID на текущем компьютере, используйте:
Если вы вошли только в один сеанс X, вышеприведенное должно выводить только одну строку с чем-то вроде :0 .
В сеансе X вы всегда можете обратиться к переменной окружения DISPLAY чтобы узнать текущий номер дисплея ( echo $DISPLAY ).
Узнать номера показа других людей сложнее. Я не думаю, что есть какой-либо стандартный способ получения информации, кроме как опросить всех пользователей, с которыми они связаны, поэтому любая попытка получить эту информацию требует некоторого рода хакерских действий и не будет работать во всех случаях.
В SE есть несколько опций, но они не будут работать, например, в Debian Wheezy. Однако перечислить активные в данный момент дисплеи несложно, как показано в посте, на который я ссылался выше:
ps axu | grep "X " покажет вам процессы X, которые в данный момент выполняются, что-то вроде следующего:
Первый параметр после /usr/bin/X - это номер дисплея с префиксом двоеточия, а следующий показывает виртуальный терминал, назначенный сеансу.
Вы можете получить ответ, посмотрев на список процессов, хотя:
ps axu |grep -3 "X "
Посмотрите на строки после /usr/bin/X - когда начинается сеанс X, оконный менеджер обычно запускается как пользователь, которому принадлежит сеанс, и там вы получаете имя пользователя. В моем случае user_1 использует KDE, а user_2 использует LXDE. Однако это решение основано исключительно на том факте, что ядро назначает новые идентификаторы процессов в возрастающей последовательности, что может быть не всегда.
Я новичок в сценариях оболочки. Я не понимаю, что такое $DISPLAY переменная среды.
У меня Ubuntu 13.10 и я использую /bin/bash shell. У меня есть два монитора.
Команда echo $DISPLAY напечатает :0.0 на моей машине (на обоих мониторах). Что это значит?
В каких случаях $DISPLAY переменная будет пустой или NULL?
Есть ли какие-либо статьи или учебники по этому вопросу?
Волшебное слово в системе X Window - DISPLAY. Дисплей состоит (упрощенно) из:
Дисплей управляется серверной программой, известной как X-сервер. Сервер предоставляет возможности отображения другим программам, которые к нему подключаются.
Значение переменной среды отображения:
hostname - это имя компьютера, на котором работает X-сервер. Опущенное имя хоста означает localhost.
D - порядковый номер (обычно 0). Его можно изменить, если к одному компьютеру подключено несколько дисплеев.
S - номер экрана. Дисплей может иметь несколько экранов. Обычно есть только один экран, хотя по умолчанию 0.
hostname:D.S означает экран S на дисплее D имени хоста; X-сервер для этого дисплея прослушивает TCP-порт 6000 + D.
host/unix:D.S означает экран S на дисплее D хоста хоста; X-сервер для этого дисплея прослушивает сокет домена UNIX /tmp/.X11-unix/XD (поэтому он доступен только с хоста).
:D.S эквивалентно host / unix: DS, где host - локальное имя хоста.
: 0.0 означает, что мы говорим о первом экране, прикрепленном к вашему первому дисплею на вашем локальном хосте
Читайте больше здесь и здесь и здесь .
Со страницы руководства X (7):
В обычном режиме это не должно происходить, если на вашем дисплее нет проблемы. В основном, перезапуск диспетчера дисплеев решит проблему. Но это не действие по умолчанию. @ChandrayyaGK Например, когда я не использую какую-либо рабочую среду, такую как GNOME или KDE, но напрямую захожу с TTY (вроде /dev/tty1 ), я получаю пустое место $DISPLAY . @Maythux Иногда номер экрана опускается, когда он равен 0. Мой GNOME дает :0 для $DISPLAY .С точки зрения пользователя, каждый X-сервер имеет отображаемое имя формы:
Имя хоста: displaynumber.screennumber
Эта информация используется приложением для определения того, как ему следует подключаться к серверу и какой экран следует использовать по умолчанию (на дисплеях с несколькими мониторами):
hostname hostname указывает имя машины, к которой физически подключен дисплей. Если имя хоста не указано, будет использован наиболее эффективный способ связи с сервером на том же компьютере. displaynumber Фраза «display» обычно используется для обозначения коллекции мониторов, которые имеют общую клавиатуру и указатель (мышь, планшет и т. д.). Большинство рабочих станций, как правило, имеют только одну клавиатуру и, следовательно, только один дисплей. Большие многопользовательские системы, однако, часто имеют несколько дисплеев, так что несколько человек могут одновременно выполнять графическую работу. Чтобы избежать путаницы, каждому дисплею на машине назначается номер дисплея (начиная с 0), когда X-сервер для этого дисплея запускается. Номер дисплея всегда должен указываться в имени дисплея. screennumber Некоторые дисплеи совместно используют одну клавиатуру и указатель между двумя или более мониторами. Поскольку каждый монитор имеет свой собственный набор окон, каждому экрану присваивается номер экрана (начиная с 0), когда X-сервер для этого дисплея запускается. Если номер экрана не указан, будет использоваться экран 0.
Существующие ответы не соответствуют более широкой картине.
Если вы не используете графическое окружение (то есть вы входите в системную консоль без окон и т. Д .; вы входите удаленно с текстового терминала через SSH или аналогичный, например, с компьютера под управлением Windows, на котором установлен PuTTY), тогда GUI не задействован и DISPLAY обычно не устанавливается. Единственным средством связи с компьютером является командная строка (хотя могут быть способы перехода в сеанс графического интерфейса, если вы знаете, как).
Если вы входите в систему через консоль с графическим интерфейсом (в Ubuntu обычно используется GDM-приветствие) или с помощью графического терминала (например, с компьютера под управлением Windows, на котором работает eXceed или mobaX, или с помощью программного обеспечения для удаленного рабочего стола, такого как клиент VNC), DISPLAY переменная устанавливается программой, которая управляет вашим графическим сеансом, чтобы указать графическим клиентам, к каким устройствам ввода / вывода подключаться.
На X11 хост-часть DISPLAY может быть удаленным сервером, и вы будете использовать свой компьютер Ubuntu в качестве «графического терминала» для доступа к файлам и программам на этом удаленном сервере (в этом случае ваш компьютер является «сервером», который служит клавиатурой мыши и одного или нескольких устройств отображения для «клиентских» программ, запущенных на удаленном . сервере). Чаще всего на вашем компьютере работают сервер X11 (или Mir, или Wayland) и клиентские программы (менеджер рабочего стола и различные графические клиенты, такие как веб-браузер, почтовый клиент, программа-календарь и т. Д.). На это указывает «серверная» часть DISPLAY значения, которая в последнем случае обычно пуста (что подразумевает значение по умолчанию localhost ).
Сервер X11 может запустить один или несколько графических сеансов - например, ваш логин консоли и удаленный сеанс VNC могут выполняться одновременно. В этом случае (если ими управляет один и тот же экземпляр сервера X11) у вас есть несколько «отображений» в терминах X11. На практике один сеанс (одно событие входа в систему и экземпляр рабочего стола, порожденный этим) - это один дисплей в X11.
Один такой дисплей может иметь один или несколько экранов. Традиционно это означало один монитор, хотя в оригинальной архитектуре были некоторые прискорбные черты, такие как невозможность перемещения окна с одного экрана на другой. Надстройки, такие как Xinerama и Xrandr, еще больше запутали ситуацию до такой степени, что один экран часто соединяет несколько мониторов различными способами.
Если вы играли с системами с несколькими мониторами, вы, вероятно, обнаружили, что вы можете расположить мониторы различными способами и получить прямоугольную область, где ваши мониторы отображают некоторые ее части, а другие части не назначаются никаким мониторам. Это «экран», который создает X11, и если у вас более одной видеокарты, у вас может быть несколько таких экранов, каждый из которых назначен одному или нескольким мониторам (или теоретически работает без монитора; Xvfb использует это для разрешения чтобы запустить X11 без каких-либо мониторов, просто сопоставьте графический интерфейс с областью памяти для любых целей).
Читайте также: