VNC X server DISPLAY :0

Для подключения к активной сесии DISPLAY :0 нужно использовать x11vnc

[root@vnc-host ~]# yum install x11vnc

Вывод программы
Loaded plugins: fastestmirror, langpacks, presto, refresh-packagekit
Loading mirror speeds from cached hostfile
updates/metalink                                                                                                                      | 4.3 kB     00:00     
 * fedora:
 * rpmfusion-free:
 * rpmfusion-free-updates:
 * rpmfusion-nonfree:
 * rpmfusion-nonfree-updates:
 * updates:
adobe-linux-i386                                                                                                                      |  951 B     00:00     
rpmfusion-free-updates                                                                                                                | 3.3 kB     00:00     
rpmfusion-nonfree-updates                                                                                                             | 3.3 kB     00:00     
Resolving Dependencies
--> Running transaction check
---> Package x11vnc.i686 0:0.9.13-1.fc16 will be installed
--> Processing Dependency: Xvfb for package: x11vnc-0.9.13-1.fc16.i686
--> Running transaction check
---> Package xorg-x11-server-Xvfb.i686 0:1.11.4-3.fc16 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

 Package                                       Arch                          Version                                  Repository                        Size
 x11vnc                                        i686                          0.9.13-1.fc16                            updates                          811 k
Installing for dependencies:
 xorg-x11-server-Xvfb                          i686                          1.11.4-3.fc16                            updates                          770 k

Transaction Summary
Install  1 Package (+1 Dependent package)

Total download size: 1.5 M
Installed size: 4.4 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): x11vnc-0.9.13-1.fc16.i686.rpm                                                                                                  | 811 kB     00:00     
(2/2): xorg-x11-server-Xvfb-1.11.4-3.fc16.i686.rpm                                                                                    | 770 kB     00:00     
Total                                                                                                                        1.8 MB/s | 1.5 MB     00:00     
Running Transaction Check
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : xorg-x11-server-Xvfb-1.11.4-3.fc16.i686                                                                                                   1/2 
  Installing : x11vnc-0.9.13-1.fc16.i686                                                                                                                 2/2 
  Verifying  : xorg-x11-server-Xvfb-1.11.4-3.fc16.i686                                                                                                   1/2 
  Verifying  : x11vnc-0.9.13-1.fc16.i686                                                                                                                 2/2 

  x11vnc.i686 0:0.9.13-1.fc16                                                                                                                                

Dependency Installed:
  xorg-x11-server-Xvfb.i686 0:1.11.4-3.fc16                                                                                                                  


Для интереса смотрим какие файлы были установлены с пакетами

[root@vnc-host ~]# rpm -ql x11vnc.i686
[root@vnc-host ~]# rpm -ql xorg-x11-server-Xvfb.i686

Настройка Firewall

Ручной IPTABLESNetwork manager
[root@vnc-host ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
:VNC - [0:0]

-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 5900:5910 -j VNC
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

-A VNC -j REJECT --reject-with icmp-host-prohibited
[root@vnc-host ~]# firewall-cmd --permanent --zone=public --add-service vnc-server

Пытаемся запустить

[root@vnc-host ~]# x11vnc -display :0
Вывод программы
15/02/2015 23:30:02 passing arg to libvncserver: -rfbauth
15/02/2015 23:30:02 passing arg to libvncserver: /root/.vnc/passwd
15/02/2015 23:30:02 x11vnc version: 0.9.13 lastmod: 2011-08-10  pid: 25130
No protocol specified
15/02/2015 23:30:02 XOpenDisplay(":0") failed.
15/02/2015 23:30:02 Trying again with XAUTHLOCALHOSTNAME=localhost ...
No protocol specified

15/02/2015 23:30:02 ***************************************
15/02/2015 23:30:02 *** XOpenDisplay failed (:0)

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

Some tips and guidelines:

** An X server (the one you wish to view) must be running before x11vnc is
   started: x11vnc does not start the X server.  (however, see the -create
   option if that is what you really want).

** You must use -display <disp>, -OR- set and export your $DISPLAY
   environment variable to refer to the display of the desired X server.
 - Usually the display is simply ":0" (in fact x11vnc uses this if you forget
   to specify it), but in some multi-user situations it could be ":1", ":2",
   or even ":137".  Ask your administrator or a guru if you are having
   difficulty determining what your X DISPLAY is.

** Next, you need to have sufficient permissions (Xauthority) 
   to connect to the X DISPLAY.   Here are some Tips:

 - Often, you just need to run x11vnc as the user logged into the X session.
   So make sure to be that user when you type x11vnc.
 - Being root is usually not enough because the incorrect MIT-MAGIC-COOKIE
   file may be accessed.  The cookie file contains the secret key that
   allows x11vnc to connect to the desired X DISPLAY.
 - You can explicitly indicate which MIT-MAGIC-COOKIE file should be used
   by the -auth option, e.g.:
       x11vnc -auth /home/someuser/.Xauthority -display :0
       x11vnc -auth /tmp/.gdmzndVlR -display :0
   you must have read permission for the auth file.
   See also '-auth guess' and '-findauth' discussed below.

** If NO ONE is logged into an X session yet, but there is a greeter login
   program like "gdm", "kdm", "xdm", or "dtlogin" running, you will need
   to find and use the raw display manager MIT-MAGIC-COOKIE file.
   Some examples for various display managers:

     gdm:     -auth /var/gdm/:0.Xauth
              -auth /var/lib/gdm/:0.Xauth
     kdm:     -auth /var/lib/kdm/A:0-crWk72
              -auth /var/run/xauth/A:0-crWk72
     xdm:     -auth /var/lib/xdm/authdir/authfiles/A:0-XQvaJk
     dtlogin: -auth /var/dt/A:0-UgaaXa

   Sometimes the command "ps wwwwaux | grep auth" can reveal the file location.

   Starting with x11vnc 0.9.9 you can have it try to guess by using:

              -auth guess

   (see also the x11vnc -findauth option.)

   Only root will have read permission for the file, and so x11vnc must be run
   as root (or copy it).  The random characters in the filenames will of course
   change and the directory the cookie file resides in is system dependent.

See also:
Проверяем по пунктам всё что было в диагостическом выводе.

[root@vnc-host ~]# echo $DISPLAY
[root@vnc-host ~]# ls -l /var/run/kdm/
total 8
-rw-------. 1 root root 44 Feb 14 08:09 A:0-NVTXPb
-rw-r--r--. 1 root root  5 Feb 14 08:09
[root@vnc-host ~]# ps wwwwaux | grep auth
root      1272  0.6  1.8  56900 19176 tty1     Ss+  Feb14  18:52 /usr/bin/X :0 vt1 -background none -nolisten tcp -auth /var/run/kdm/A:0-NVTXPb
user002   2069  0.0  0.2  98468  2580 ?        Sl   Feb14   0:00 /usr/libexec/kde4/polkit-kde-authentication-agent-1
root     31269  0.0  0.0   4604   796 pts/1    S+   11:07   0:00 grep --color=auto auth
[root@vnc-host ~]# x11vnc -findauth

Нужно с параметром -auth передать полученный файл /var/run/kdm/A:0-NVTXPb. Но с версии x11vnc 0.9.9 появился более удобный ключ -auth guess который автоматически найдёт нужный файл.

[root@vnc-host ~]# x11vnc -auth guess -display :0

Для однократного соединения с VNC сервером можно использовать такой вариант команды:

[root@vnc-host ~]# x11vnc -rfbauth /root/.vnc/passwd -auth guess -display :0

Он самостоятельно найдёт и использует XAUTHORITY=/var/run/kdm/A:0-NVTXPb, запустится на порту 5900, возьмёт пароль из файла /root/.vnc/passwd, подождёт одного соединения клиента и когда клиент завершит сессию сервер также завершится.
Забегая вперёд, до инсталяции VNC клиента, приведу удобную команду для однократного запуска vnc сервера через ssh туннель на удалённой машине.

[user001@home ~]$ ssh -L localhost:5900:localhost:5900 root@ 'x11vnc -quiet -once -timeout 20 -localhost -auth guess -display :0 -rfbauth /root/.vnc/passwd'& sleep 5; vncviewer localhost:0; sleep 1; echo

Здесь устанавливается ssh канал на хост и через него пробрасывается локальный порт 5900 на удалённый 5900 и там запускается x11vnc.
x11vnc ждёт 20 секунд соединения от клиента (-timeout 20). Если клиент не соединится x11vnc завершится.
Выжидается 5 секунд чтобы с удалённой стороны x11vnc успел стартануть и открыть порт и на этой стороне запускается vncviewer на открытый локальный порт 5900.
После завершения vncviewer выжидается 1 секунда и печатается эхо чтобы пользователю стало видно что команда завершилась.
Со стороны удалённой машины x11vnc отваливается самостоятельно когда обнаружит отсоединение клиента (-once она ставит и по умолчанию) и как только это происходит завершается и сам туннель.
Это позволяет не запоминать PID ssh туннеля и затем “убивать” его после завершения vncviewer.
-quiet — уменьшает количество диагностических сообщений;
-rfbauth /root/.vnc/passwd — задаёт файл с паролем для аутентификации (без неё vnc откроется без пароля)

Для того чтобы x11vnc запустился как фоновый процесс и многократно ждал соединений нужно использовать такую команду:

[root@vnc-host ~]# x11vnc -many -background -auth guess -display :0 -rfbauth /root/.vnc/passwd

Такую команду можно запускать при каждом старте X сервера.
После запуска можем посмотреть процесс и порт.

[root@vnc-host ~]# ps afx | grep -v grep | grep x11vnc
25374 ?        Ss     0:07 x11vnc -many -background -rfbauth /root/.vnc/passwd -auth guess -display :0

[root@vnc-host ~]# netstat -nlp -A inet | grep 5900
tcp        0      0      *                   LISTEN      25374/x11vnc        

И теперь подключаемся с другой машины.

[user001@home ~]$ sudo yum install tigervnc
[user001@home ~]$ vncviewer

TigerVNC Viewer 32-bit v1.3.0 (20140319)
Built on Mar 19 2014 at 17:09:08
Copyright (C) 1999-2011 TigerVNC Team and many others (see README.txt)
See for information on TigerVNC.

Sun Feb 15 23:33:45 2015
 CConn:       connected to host port 5900
 CConnection: Server supports RFB protocol version 3.8
 CConnection: Using RFB protocol version 3.8

Sun Feb 15 23:33:49 2015
 PlatformPixelBuffer: Using default colormap and visual, TrueColor, depth 24.
 CConn:       Using pixel format depth 24 (32bpp) little-endian rgb888
 CConn:       Using Tight encoding

Материалы для детального изучения.
man x11vnc
Как запустить VNC на виртуальном DISPLAY :1 читайте статью.

Leave a Reply