Содержимое
Локальный запуск X-клиентов
Существует «ручной» запуск компонент оконной системы X, что достаточно неудобно, т. к. требует установить правильное значение переменной окружения display, запустить X-сервер «до запуска первого клиента, а завершить после завершения последнего и т. д.
Поэтому для автоматизации запуска X-сервера и всех клиентов X-сеанса пользователя предназначается специальная команда xinit, проиллюстрированная в листинге ниже.
Запуск сеанса iceWM с отображением на сервере Xnest
homer@ubuntu:~$ xinit /usr/bin/icewn-session — /usr/bin/Xnest :1 &
honer@ubuntu:~$ ps f
PID TTY STAT TIME COMMAND
28163 pts/8 Ss 0:00 bash
28218 pts/0 S 0:00 \_ xinit /usr/bin/icewm-session — /usr/bin/Xnest :1
28219 pts/0 Sl 0:00 | \_ /usr/bin/Xnest 1
28226 pts/0 S 0:00 | \_ /usr/bin/icewm-session
28231 pts/0 R+ 0:00 \_ ps f
Запускатель xinit может быть сконфигурирован пользовательскими dot-файлами -/.xinitrc и ~/.xserverrc, представляющими собой сценарии командного интерпретатора, которые запускают, клиентскую и серверную части оконной системы соответственно.
В примере из листинга ниже показан сценарий .xserverrc, позволяющий xinit использовать виртуальный X-сервер Xnest по умолчанию на указанном дисплее, что сокращает командную строку запуска.
Запуск сеанса TWM с отображением на сервере «по умолчанию» (Xnest)
homer@ubuntu:~$ cat .xserverrc
#!/bin/sh
exec /usr/bin/Xnest
honer@ubuntu:~$ xinit /usr/bin/twm — :2 &
honer@ubuntu:~$ ps f
PID TTY STAT TIME COMMAND
28268 pts/1 Ss 0:00 bash
28322 pts/1 S 0:00 \_ xinit /usr/bin/twm — :2
28323 pts/1 Sl 0:01 | \_/usr/bin/Xnest :2
28330 pts/1 S 0:00 | \_ /usr/bin/twm
30112 pts/1 R+ 0:00 \_ ps f
В примере из листинга ниже показан сценарий .xinitrc, позволяющий xinit использовать X-сеанс среды KDE по умолчанию, что еще более сокращает командную строку запуска.
Запуск локальной X Window System (окружение KDE с отображением на сервере Xnest)
homer@ubuntu:~$ cat .xserverrc
#!/bin/sh
exec /usr/bin/Xnest «$@»
homer@ubuntu: ~$ cat .xinitrc
#!/btn/sh
exec startkde «$@»
homer@ubuntu:~$ xinit — :3 &
homer@ubuntu:~$ ps f
PID TTY STAT TIME COMMAND
30810 pts/2 Ss 0:00 bash
30996 pts/2 S 0:00 \_ xinit — :3
30997 pts/2 Si 0:04 | \_/usr/bin/Xnest :3
31004 pts/2 S 0:00 | \_ /bin/sh /usr/bin/startkde
31064 pts/2 S 0:00 | \_ kwrapper4 ksmserver
31179 pts/2 R+ 0:00 \_ ps f
Нужно заметить, что все три пользовательских сеанса, запущенных из листингов выше, могут существовать одновременно, т. к. используют разные экземпляры X-сервера.
Дистанционный запуск X-клиентов
Оконная система X изначально: проектировалась для распределенной работы ее компонент на различных узлах сети, что достаточно широко используется на практике, когда нужно запускать графические приложения на удаленном узле, их окна отображать на локальном дисплее.
В большинстве случаев для дистанционного запуска используется ssh. Попытка «прямого» запуска xeyes на узле centos от лица пользователя lich не увенчалась успехом потому, что в большинстве инсталляций аппаратный X-сервер на дисплее :0 не принимает сетевые соединения.
Попытка запуска локального виртуального сервера Xnest на дисплее :1 с перенаправлением ему вывода дистанционного xeyes тоже оказалась неудачной, но уже по другим причинам.
Запуск дистанционного X-клиента
homer@ubuntu:~$ ssh -f lich@centos «DISPLAY=ubuntu. local:0 xeyes»
Error: Can’t open display: ubuntu.local:0
homer@ubuntu:~$ Xnest :1 &
homer@ubuntu:~$ ssh -f lich@centos «DISPLAY=ubuntu.local:1 xeyes»
No protocol specified
Error: Can’t open display: ubuntu.local:1
При сетевом взаимодействии X-клиентов и X-сервера для аутентификации клиентских подключений используется механизм, основанный на предъявлении общего (известного обеим сторонам) «секрета», называемого «волшебной печенькой» (см. W:[magic cookie]), использование которых проиллюстрировано в примере ниже.
На стороне сервера «печеньки» всех клиентов, которым разрешено подключение, размещаются при помощи утилиты xauth в «банке с печеньками» (jar), откуда извлекаются сервером для проверки при подключении клиента. На стороне клиента «печеньки» при помощи той же утилиты xauth размещаются в «банке» -/.Xauthority, откуда извлекаются библиотекой Xlib для предъявления серверу при соединении с ним.
Аутентификация дистанционного X-клиента
homer@ubuntu:~$ mcookie
8f36c904dc0c9934c506c21ea7860eb2
homer@ubuntu:~$ xauth -f cookie-jar
xauth: file cookie-jar does not exist Using authority file cookie-jar
xauth> add ubuntu:1 MIT-MAGIC-C00KIE-1 8f36c904dc0c9934c506c21ea786Oeb2↵
xauth> exit↵
Writing authority file cookie-jar
homer@ubuntu:~$ Xnest :1 -auth cookie-jar &
homer@ubuntu:~$ ssh lich@centos
lich@centos
Last login: Fri Jan 8 17:43:04 2016 from ubuntu
[lich@centos ~]$ xauth
xauth: file /home/lich/.Xauthority does not exist
Using authority file /hone/lich/.Xauthority
xauth> add ubuntu.local:1 MIT-MAGIC-COOKIE-1 8f36c904dc0c9934c506c21ea7860eb2↵
xauth> exit↵
Writing authority file /hone/lich/.Xauthority [llch@centos ~]$ logout
onnection to centos closed.
honer@ubuntu:~$ ssh -f lich@centos «DISPLAY=ubuntu.local:1 xeyes»
Необходимость установки общего секрета и переменной окружения display и необходимость запуска дополнительного виртуального X-сервера (или необходимость активации приема сетевых соединений аппаратным сервером) делают «ручной» запуск дистанционных X-клиентов неудобным «чуть более, чем полностью».
Вместе с этим, передача «волшебных печенек» (как и любых других сообщений X-протокола) от X-клиента к X-серверу по сети происходит незащищенным образом, что может быть легко использовано злоумышленником. Именно поэтому на практике используют туннелирующие возможности протокола SSH, позволяющие удобным автоматизированным способом решить все вышеперечисленные задачи и проблемы.
В примере из листинга ниже показано поведение SSH-сервера при туннелировании X-протокола. По запросу (-x) от SSH-клиента SSH-сервер начинает эмулировать поведение X-сервера, устанавливает О переменную окружения display, указывающую на «дисплей» :10 на «том же» узле localhost, и создает «волшебную печеньку» для этого дисплея.
При последующем запуске X-клиента xeyes им будет установлено соединение с «SSH-эмулятором» X-сервера на localhost: 10, а SSH-сервер перенаправит (туннелирует) это соединение X-протокола обратно SSH-клиенту внутри зашифрованного соединения SSH.
SSH-туннелирование X-протокола (SSH-сервер)
homer@ubuntu:~$ ssh -X lich@centos
Last login: Fri Jan 8 17:48:34 2016 from ubuntu
[lich@centos ~]$ echo $DISPLAY
localhost:10.0
[lich@centos ~]$ xauth list
centos/unix:10 MIT-MAGIC-C00KIE-1 80c749073282be2001c33bd43e577aa4
[lich@centos ~]$ strace -fe connect xeyes
connect(3, {sa_family=AF_INET, sin_port=htons(6010), sin_addr_inet_addr( «127.0.0.1»)}, 16) = 0
+++ exited with 0 +++
[lich@centos ~]$ sudo lsof -nP -i 4:6010
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 14221 Itch 10u IPv4 44578 0t0 TCP 127.0.0.1:6010 (LISTEN)
[lich@centos ~]$ logout
Connection to centos closed.
Листинг ниже иллюстрирует поведение SSH-клиента в режиме (-X) X-туннелирования, при котором он эмулирует «Х-клиента» и соединяется с аппаратным (!) Х-сервером через локальный сокет /tmp/.x11-unix/X0.
При получении от SSH-сервера перенаправленных соединений X-протокола они ретранслируются SSH-эмулятором «X-клиента» локальному X-серверу, тем самым вывод дистанционных X-клиентов изображается в окнах локального X-сервера.
SSH-туннелирование X-протокола (SSH-клиент)
honer@ubuntu:~$ strace
-fe connect ssh -f |X lich@centos xeyes
connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr(«10.0.0.99»)}, 16) = 0
connect(7, {sa_family=AF_FILE, path=»/tnp/.X11-unix/X0″»•}, 110) = 0
Так как SSH-туннелирование X-протокола позволяет перенаправлять любое количество X-соединений внутри одного SSH-соединения, то дистанционно можно запускать целые сеансы пользовательских сред, таких как GNOME с использованием xinit и виртуального X-сервера Xnest.
Запуск дистанционного сеанса GNOME с отображением на локальном сервере Xnest
homer@ubuntu:~$ xinit /usr/bin/ssh -X lich@centos gnome-session — /usr/bin/Xnest :4 &
homer@ubuntu:~$ ps f
PID TTY STAT TIME COMMAND
27759 pts/0 Ss 0:00 bash
27829 pts/0 S 0:00 \_ xinit/usr/bin/ssh -X llch@centos gnomes-session — …
27830 pts/0 Sl 0:00 | \_ /usr/bin/Xnest :4
27837 pts/0 S 0:00 | \_ /usr/bin/ssh -X lich@centos gnome-session
27928 pts/0 R+ 0:00 \_ ps f
Управление X-дисплеями: XDMCP-менеджер и протокол
В большинстве современных инсталляций Linux работа пользователей в системе осуществляется сразу с использованием оконной системы X и какой-либо пользовательской среды, например GNOME.
Оконная система запускается сразу при старте операционной системы и не требует использования xinit или startx.
Если при работе в автоматически запущенной оконной системе проследить дерево процессов от командного интерпретатора до прародителя процессов init, то обнаружится менеджер дисплеев (например, lightdm), осуществляющий запуск пользовательского сеанса в (gnome-session).
Более того, аппаратный -сервер дисплея :0 тоже окажется запущенным этим менеджером.
Менеджер дисплеев является специальной компонентой оконной системы, управляющей автоматическим запуском ее X-серверов и X-сеансов. Именно он запускает аппаратные X-серверы для обслуживания дисплеев в указанном количестве (по умолчанию один дисплей :0), а затем «графическим» образом производит аутентификацию пользователя в системе и запускает менеджер сеансов пользовательской среды.
Кроме этого, менеджер дисплеев предназначен и для запуска дистанционных пользовательских X-сеансов, но делает это при помощи специального протокола W:[XDMCP], а не посредством протокола SSH, как при «ручном» дистанционном их запуске.
В листинге ниже показано дистанционное подключение виртуального X-сервера Xnest с узла terminal к узлу ubuntu.local по протоколу XDMCP (-query), в результате чего менеджер дисплеев lightdm (при помощи X-протокола) отобразил экран аутентификации пользователей в системе узла ubuntu. При успешной аутентификации пользователя будет запущен его X-сеанс на узле ubuntu.local так, что вывод всех X-клиентов будет направлен на дистанционный X-сервер узла terminal.
Дистанционный графический вход в ubuntu
homer@ubuntu:~$ sudo lsof -p 32494 -a -i4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
lightdm 32494 root 11u IPv4 3031884 0t0 UDP *:xdmcp
bart@terminal:~$ Xnest :1 -query ubuntu.local
Надо заметить, что при использовании дистанционного XDMCP-запуска данные XDMCP- и X-протоколов при передаче в публичной сети оказываются никак не защищены (включая согласование «волшебной печеньки» и ее последующее использование), поэтому на практике безальтернативно используют SSH-запуск дистанционных сеансов с туннелированием X-протокола внутри криптографически защищенного SSH-соединения.