четверг, 10 сентября 2020 г.

Linux+Windows: Доступ из MS Windows к оконным приложениям X Windows

Захотелось поработать удалённо с оконными приложениями линукса. Насколько я знаю, линукс позволяет такие штуки - когда программа выполняется на одной машине, а окна рисует на другой - поэтому надеялся обойтись без средств удаленного доступа типа TeamViewer или VNC, и эта надежда отчасти оправдалась. Нужна лишь небольшая настройка.

1. Настраиваем линукс, на котором будут выполняться программы. У меня Slackware, но, думаю, под другими вариантами настройка будет примерно такой же. Нужно в конфигурационном файле /etc/ssh/sshd_config найти и раскомментировать следующие строки:

X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

2. Настраиваем Windows, которая будет заниматься отрисовкой окон. Оконные приложения в X11, как я понял, устроены хитро: приложение является клиентом, а окнами занимается сервер, которому, в принципе, всё равно где работать - на этой же машине или на соседней. Поэтому нужно поднять сервер X11. Мой выбор пал на Cygwin/X.

2.1. Устанавливаем Cygwin/X. Это несложный процесс: запускаем установщик cygwin, в которм выбираем для установки пакеты:

xorg-server
xinit
xorg-docs
xlaunch

2.2. Настраиваем Cygwin/X. Как выяснилось, "из коробки" у него не очень хорошо с подключениями tcp, переключением раскладки клавиатуры и глубиной цвета в rdp-сессии.

2.2.1. Переключение раскладки клавиатуры: в папке путь_установки_cygwin/home/имя_пользователя/ создаём файл .XWinrc с таким содержимым:

XKBLayout   us,ru
XKBModel    evdev
XKBOptions  grp:alt_shift_toggle
XKBRules    base
XKBVariant  ,winkeys 

Клавиатура будет переключаться по Alt+Shift. Если хотим Ctr+Shift, надо в XKBOptions указать grp:ctrl_shift_toggle.

2.2.2. Доступ по tcp: изменяем ярлык запуска сервера, дописывая в него параметр -listen tcp после двойного минуса (перед двойным минусом перечисляются параметры, относящиеся к клиенту, после него - к серверу):

путь_установки_cygwin\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; exec /usr/bin/startxwin -- -listen tcp"

Сервер будет ожидать входящие подключения на 6000 порту.

2.2.3. Корректировка глубины цвета: если работа с Windows производится в RDP-сессии, как у меня, то окна отрисовываются почему-то с минимальной глубиной цвета, чуть ли не в 16-цветной палитре. Исправляет это параметр -nocompositewm. То есть, окончательно команда ярлыка запуска сервера приобретает следующий вид:

путь_установки_cygwin\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; exec /usr/bin/startxwin -- -listen tcp -nocompositewm"

2.3. Настраиваем PuTTY. Переходим в категорию Connection -> SSH -> X11 и выставляем там параметры:

Enable X11 Forwarding              -> true
X11 Location                       -> :0.0
Remote X11 authentication protocol -> MIT-Magic-Cookie-1
X authority file for local display -> путь_установки_cygwin\cygwin\home\имя_пользователя\.Xauthority

После всех настроек можно заходить через PuTTY на линуксовую машину и запускать на ней оконные приложения (xclock, xlogo, firefox и т.д.). Работает всё, правда, небыстро, но тут уж - как есть...

Литература:

http://tolik-punkoff.com/2016/11/21/nastrojka-x11-forwarding-cherez-ssh-s-pomoshhyu-putty-i-xming/

https://datacadamia.com/ssh/x11/cygwinx_remote_client#with_putty

https://stackoverflow.com/questions/34932495/forward-x11-failed-network-error-connection-refused

https://x.cygwin.com/docs/ug/setup.html#setup-cygwin-x-installing

http://cygwin.1069669.n5.nabble.com/X-colormap-problem-when-viewed-via-Microsoft-Remote-Desktop-td132076.html