LINUX.ORG.RU

xvfb и x11vnc

 , ,


1

1

На линуксовой машине (Debian Stretch) в Докере на 99-м экране запускается Xvfb, под которым открывается окно, которое ожидает нажатия OK:

xvfb-run -n 99 bash winetricks vcrun2005
Требуется нажать кнопку с машины под управлением Windows.

Вхожу в тот же контейнер вторым bash-ем и запускаю x11vnc. Получаю ошибку:

# x11vnc -auth /home/root/.Xauthority -display :99 -rfbauth
26/02/2019 16:30:16 passing arg to libvncserver: -rfbauth
26/02/2019 16:30:16 x11vnc version: 0.9.13 lastmod: 2011-08-10  pid: 8655
No protocol specified
26/02/2019 16:30:16 XOpenDisplay(":99") failed.
26/02/2019 16:30:16 Trying again with XAUTHLOCALHOSTNAME=localhost ...
No protocol specified

26/02/2019 16:30:16 ***************************************
26/02/2019 16:30:16 *** XOpenDisplay failed (:99)

*** x11vnc was unable to open the X DISPLAY: ":99", it cannot continue.
*** There may be "Xlib:" error messages above with details about the failure.

В чём проблема? Куда копать?

P.S. На x11vnc -find -rfbauth ругается «unrecognized option(s)»

Ответ нашел сам: надо явно указать файл authority для xvfb; кроме того, -rfbauth иногда нужно явно указывать имя дефолтного файла /root/.vnc/passwd

Остался без ответа второй вопрос: когда VNC-сервер запустится, как подключиться к нему с виндовой машины при помощи TightVNC? Указал IP хоста, дефолтный порт, но до ввода пароля (который в /root/.vnc/passwd контейнера) не доходит, пишет «No connection could be made because the target machine actively refused it.» Какие нужны дополнительные действия?

Пока нашёл следующее:

Запуская докер добавить к «docker run» что-то вроде "-p 5900:5900". Если контейнер уже запущен, выяснить его адрес на хосте командой

docker inspect keen_beaver | grep IPAddress
и настроить фаервол (подставить нужный IP):
sudo /sbin/iptables -t nat -A DOCKER -p tcp --dport 5900 -j DNAT --to-destination 172.17.0.3:5900

После этого VNC-сервер будет виден на порту 5900.

И да, на этом порту что-то видно — curl servername:5900 отваливается не через 2 секунды, а через 22, и с ошибкой не «Connection refused», а «Timed out». Telnet тоже на этом порту что-то видит, но не получает ответа.

Но подключиться не получается. TightVNC пишет «A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.» noVNC выдаёт «Failed to connect to server» в браузере и коды 404 и 111 «Connection refused» в консоли.

В чём может быть дело?

Ответ 2: начало нормально отвечать после перезагрузки хоста.

Ещё выяснилось, что необходимо запускать x11vnc с ключами "-visual TrueColor" и "-forever" Первый нужен клиентам, не понимающим 8-битный цвет, второй — чтобы сервер не отключался при закрытии соединения с клиентом.

★★★

Последнее исправление: olegd (всего исправлений: 5)
Ответ на: комментарий от bass

winetricks -q

Спасибо, но это был только пример. Есть другие программы, где нужно нажимать кнопки.

olegd ★★★
() автор топика

1. Нужно было явно указать файл authority для xvfb-run. Запустил

xvfb-run -n 99 -f /root/.Xa99 xterm
Подключался как
x11vnc -rfbauth -auth /root/.Xa99 -display :99 -allow 21.22.23.24
Выдало новую ошибку: *** unrecognized option(s) *** [1] 20

Это следовало трактовать как «явно укажите файл с паролем».

2. По

x11vnc -rfbauth /root/.vnc/passwd -auth /root/.Xa99 -display :99 -allow ...
наконец, сервер запустился.

Но TightVNC Viewer пишет «No connection could be made because the target machine actively refused it.»

olegd ★★★
() автор топика
Последнее исправление: olegd (всего исправлений: 2)
Ответ на: комментарий от olegd

Но TightVNC Viewer пишет «No connection could be made because the target machine actively refused it.

А что у Вас с настройками firewall? Порт-то в контейнере доступен, куда подключаетесь клиентом?

Serge10 ★★★★★
()
Ответ на: комментарий от Serge10

А что у Вас с настройками firewall?

На машине с докером — отсутствует. На виндовой порты VNC должны быть открыты.

Порт-то в контейнере доступен, куда подключаетесь клиентом?

Как это можно проверить?

olegd ★★★
() автор топика
Ответ на: комментарий от AEP

Спасибо!

Вспомнить бы ещё, как это сделать без перезапуска контейнера.

P.S.

$ docker inspect keen_beaver | grep IPAddress
 "IPAddress": "172.17.0.3"
$ sudo /sbin/iptables -t nat -A DOCKER -p tcp --dport 5900 -j DNAT --to-destination 172.17.0.3:5900

Теперь клиент не говорит об активном отказе, а отваливается по таймауту.

olegd ★★★
() автор топика
Последнее исправление: olegd (всего исправлений: 1)
Ответ на: удаленный комментарий

Не туда соединяется?

Вообще такое отлаживают с помощью tcpdump.

AEP ★★★★★
()
Ответ на: комментарий от AEP

Прошу вывод такой команды в контейнере:

netstat -nltp

AEP ★★★★★
()
Ответ на: комментарий от AEP

Ночью кто-то перезагрузил хостовую машину, после чего всё заработало. Установить, почему не работало раньше, невозможно.

Если интересно:

# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      460/x11vnc
tcp6       0      0 :::5900                 :::*                    LISTEN      460/x11vnc

Но когда я попробовал подключиться, TightVNC Viewer упал и уронил VNC-сервер. Обновление TightVNC не помогло.

Оказалось, проблем две. Во-первых, TightVNC, как и многие другие клиенты, не может работать с произвольной глубиной цвета. Конкретно TightVNC падает от 8-битного. Решилось ключом x11vnc -visual TrueColor

Во-вторых, x11vnc автоматически завершает работу при отключении клиента. Смысл в таком поведении неясен. Решилось ключом x11vnc -forever

Теперь всё работает.

olegd ★★★
() автор топика
Ответ на: комментарий от olegd

У нас в компании на удаленных рабочих столах для разработчиков тоже используется x11vnc в связке с noVNC, правда не в docker-контейнере, а в LXC, и не на Xvfb, а на обычном Xorg с драйверами dummy и void (у них лучше совместимость со всяким придирчивым софтом). Запускаем с такими параметрами:

x11vnc -N -no6 -rfbportv6 -1 -allow 10.0.3.1 -passwdfile read:.vnc/passwdfile -alwaysshared -shared -forever -repeat -nowireframe -cursor_drag -noscr -nocursorshape -skip_lockkeys

Смысл:

-N = выбирать порт исходя из номера X-дисплея

-no6 -rfbportv6 -1 = запрещаем прямые подключения по IPv6

-allow 10.0.3.1 = разрешаем подключения по IPv4 только от websockify

-passwdfile read:.vnc/passwdfile = там динамический OTP-совместимый пароль (обновляется из systemd-таймера раз в 30 секунд, хочешь кого-либо пригласить посмотреть на свой экран - передаешь текущий пароль через чат)

-alwaysshared -shared = чтобы можно было держать несколько подключений

-forever = чтобы не завершалось при отключении клиента

-repeat = чтобы работал автоповтор клавиш

-nowireframe -cursor_drag = чтобы можно было видеть окно, которое таскаешь по экрану, и курсор в нем

-noscr = не падать (обходим баги в коде определения прокрутки)

-nocursorshape = чтобы твой курсор было видно другим подключившимся

-skip_lockkeys = чтобы не было путаницы из-за CAPS LOCK

Еще можно добавить всякие скрипты на -afteraccept и -gone, мы это используем для вывода уведомлений о подключении и для сброса залипших клавиш, вот с этим скриптом

#!/bin/sh
x11vnc -usepw -clear_all -rfbport -1 -rfbportv6 -1 2>/dev/null
notify-send -a x11vnc "VNC users connected: $RFB_CLIENT_COUNT"
AEP ★★★★★
()
Ответ на: комментарий от AEP

Спасибо за советы. С dummy собирался попробовать в следующий раз, про void не знал.

А какой командой запускаете иксы?

olegd ★★★
() автор топика
Ответ на: комментарий от olegd

systemd-сервис, сохранить как /etc/systemd/system/vnc@.service:

[Unit]
Description=X server for %i
After=nss-user-lookup.target

[Service]
Environment=DISPLAY=
EnvironmentFile=/etc/systemd/system/vnc/%i.conf
ExecStart=/bin/su - %i -c '. /etc/environment ; exec /usr/bin/startx -- $DISPLAY'
TimeoutStopSec=5
RestartSec=5
Restart=always

[Install]
WantedBy=graphical.target

Конфиг к нему, сохранить как /etc/systemd/system/vnc/aep.conf:

DISPLAY=:67

Конфиг иксов, сохранить как /etc/X11/xorg.conf.d/10-dummy.conf :

# For details, please see:
# https://xpra.org/Xdummy.html

Section "ServerFlags"
  Option "DontVTSwitch" "true"
  Option "AllowMouseOpenFail" "true"
  Option "PciForceNone" "true"
  Option "AutoEnableDevices" "false"
  Option "AutoAddDevices" "false"
  Option "AutoAddGPU" "false"
EndSection

Section "InputDevice"
  Identifier "dummy_mouse"
  Option "CorePointer" "true"
  Driver "void"
EndSection

Section "InputDevice"
  Identifier "dummy_keyboard"
  Option "CoreKeyboard" "true"
  Driver "void"
EndSection

Section "Device"
  Identifier "dummy_videocard"
  Driver "dummy"
  VideoRam 65536
EndSection

Section "Monitor"
  Identifier "dummy_monitor"
  HorizSync   30-1000
  VertRefresh 23-61

  Modeline "3840x2160" 266.75  3840 4056 4456 5072  2160 2163 2168 2192 -hsync +vsync
  Modeline "3200x1800" 233.00  3200 3384 3720 4240  1800 1803 1808 1834 -hsync +vsync
  Modeline "2560x1440" 146.25  2560 2680 2944 3328  1440 1443 1448 1468 -hsync +vsync
  Modeline "1920x1200" 193.25  1920 2056 2256 2592  1200 1203 1209 1245 -hsync +vsync
  Modeline "1920x1080" 173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
  Modeline "1600x900"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync
  Modeline "1366x768"   84.75  1366 1432 1568 1776  768 771 781 798 -hsync +vsync
  Modeline "1280x800"   83.50  1280 1352 1480 1680  800 803 809 831 -hsync +vsync
  Modeline "1280x768"   79.50  1280 1344 1472 1664  768 771 781 798 -hsync +vsync
  Modeline "1280x720"   74.50  1280 1344 1472 1664  720 723 728 748 -hsync +vsync

  DisplaySize 423 238
  Option "PreferredMode" "1600x900"
  Option "DefaultModes" "false"
EndSection

Section "Screen"
  Identifier "dummy_screen"
  Device "dummy_videocard"
  Monitor "dummy_monitor"
  DefaultDepth 24
EndSection

Section "ServerLayout"
  Identifier   "dummy_layout"
  Screen       "dummy_screen"
  InputDevice  "dummy_mouse"
  InputDevice  "dummy_keyboard"
EndSection

Затем:

systemctl enable vnc@aep.service
systemctl start vnc@aep.service

x11vnc запускается через desktop-файл /etc/xdg/autostart/x11vnc.desktop, содержащий команду из предыдущего комментания. Еще есть скрипт, генерирующий динамические пароли для x11vnc.

AEP ★★★★★
()
Последнее исправление: AEP (всего исправлений: 1)
Ответ на: комментарий от AEP

Спасибо, на следующей неделе попробую.

olegd ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.