Desvendando o RealVNC para Unix

Artigo retirado do site Dicas-L, da unicamp.

Colabora??o: Ricardo Iramar dos Santos

1. Introdu??o
=============

A muito tempo utilizo o RealVNC (chamemos de VNC daqui para frente) e n?o s? eu mas o mundo inteiro tem visto uma grande evolu??o deste software que tanto nos ajuda no dia a dia.

No ?nicio, eu utilizava o vncserver que na verdade ? um script em Perl. O vncserver executa o Xvnc que cria uma outra sess?o do X no ambiente do VNC. Por?m n?o era p?ss?vel acessar via VNC sess?es do X j? iniciada utilizando o vncserver.

Ent?o um amigo me apresentou o x0vncserver (esse sim ? um bin?rio) que compartilha a sess?o do X com quase todas as op??es do Xvnc.

Em um belo dia, navegando pelo site http://www.realvnc.com (http://www.realvnc.com), encontrei uma documenta??o sobre como carregar o m?dulo do VNC no X (http://www.realvnc.com/products/free/4.1/x0.html). A implementa??o foi mais simples do que eu imaginava. Al?m disso descobri que era poss?vel acessar minha m?quina remotamente usando somente um browser com suporte a java.

Pensando nessas solu??es resolvi escrever uma documenta??o completa ? respeito. Ent?o comecei a ler mais a respeito sobre o VNC e lendo a man page do Xvnc percebi que tamb?m era poss?vel usar o Xvnc tamb?m com o inetd.

Nesta documenta??o ser? abordada todas essas formas de utiliza??o do VNC para Unix. Em todos os exemplos estarei utilizando a vers?o 4.1.1 do VNC, Slackware 10.1 e Perl 5.8.6. Por?m, vou tentar ser o mais gen?rico poss?vel para atender a outras vers?es do VNC assim como outras distribui??es Linux.

Agora chega de conversa e m?os ? obra.

2. Pr?-requisitos
=================

– VNC Free Edition for Linux (x86) 4.1.1 (vnc-4_1_1-x86_linux.tar.gz (http://www.realvnc.com/products/free/4.1/download.html)).
– Slackware Linux 10.1 (http://www.slackware.com), n?o ser? abordada a instala??o ou configura??o.
– Perl 5.8.6 (http://www.perl.com), n?o ser? abordada a instala??o ou configura??o.

3. Instala??o
=============

Fa?a o download do pacote de instala??o completo do VNC Free Edition for Linux (x86) vers?o 4.1.1 e descompacte da seguinte forma.

agent@smith:~/bin?rios/vnc$ tar zxvf vnc-4_1_1-x86_linux.tar.gz
vnc-4_1_1-x86_linux/
vnc-4_1_1-x86_linux/README
vnc-4_1_1-x86_linux/vncinstall
vnc-4_1_1-x86_linux/LICENCE.txt
vnc-4_1_1-x86_linux/vnc.so
vnc-4_1_1-x86_linux/vncviewer
vnc-4_1_1-x86_linux/vncpasswd
vnc-4_1_1-x86_linux/vncconfig
vnc-4_1_1-x86_linux/x0vncserver
vnc-4_1_1-x86_linux/Xvnc
vnc-4_1_1-x86_linux/vncviewer.man
vnc-4_1_1-x86_linux/vncpasswd.man
vnc-4_1_1-x86_linux/vncconfig.man
vnc-4_1_1-x86_linux/x0vncserver.man
vnc-4_1_1-x86_linux/Xvnc.man
vnc-4_1_1-x86_linux/vncserver
vnc-4_1_1-x86_linux/vncserver.man
vnc-4_1_1-x86_linux/java/
vnc-4_1_1-x86_linux/java/index.vnc
vnc-4_1_1-x86_linux/java/vncviewer.jar
vnc-4_1_1-x86_linux/java/logo150x150.gif
agent@smith:~/bin?rios/vnc$

Agora execute os comandos abaixo para a instala??o.

agent@smith:~/bin?rios/vnc$ cd vnc-4_1_1-x86_linux
agent@smith:~/bin?rios/vnc/vnc-4_1_1-x86_linux$ su
Password authentication bypassed.
root@smith:/home/agent/bin?rios/vnc/vnc-4_1_1-x86_linux# ./vncinstall /usr/local/bin /usr/local/man
Copying Xvnc to /usr/local/bin
Copying Xvnc.man to /usr/local/man/man1/Xvnc.1
Copying vncviewer to /usr/local/bin
Copying vncviewer.man to /usr/local/man/man1/vncviewer.1
Copying vncpasswd to /usr/local/bin
Copying vncpasswd.man to /usr/local/man/man1/vncpasswd.1
Copying vncconfig to /usr/local/bin
Copying vncconfig.man to /usr/local/man/man1/vncconfig.1
Copying vncserver to /usr/local/bin
Copying vncserver.man to /usr/local/man/man1/vncserver.1
Copying x0vncserver to /usr/local/bin
Copying x0vncserver.man to /usr/local/man/man1/x0vncserver.1
Copying vnc.so to /usr/X11R6/lib/modules/extensions
root@smith:/home/agent/bin?rios/vnc/vnc-4_1_1-x86_linux#

Se voc? pretende acessar sua m?quina usando um browser com suporte a java execute os comandos abaixo.

root@smith:/home/agent/bin?rios/vnc/vnc-4_1_1-x86_linux# mkdir -p /usr/local/vnc/classes
root@smith:/home/agent/bin?rios/vnc/vnc-4_1_1-x86_linux# cp java/* /usr/local/vnc/classes
root@smith:/home/agent/bin?rios/vnc/vnc-4_1_1-x86_linux#

Agora vamos criar o arquivo que cont?m a senha do VNC, porque n?o queremos que todo mundo acesse nosso ambiente. Digite os comandos abaixo e escolha uma senha com seis ou mais caracteres.

root@smith:/home/agent/bin?rios/vnc# exit
exit
agent@smith:~/bin?rios/vnc$ vncpasswd
Password:
Verify:
agent@smith:~/bin?rios/vnc$

Por padr?o a senha ? gerada no arquivo $HOME/.vnc/passwd.

Se voc? esta usando VNC provavelmente n?o ir? mais precisar do recurso de acesso remoto do X que por padr?o vem habilitado na maioria das distribui??es. Caso for utilizar o VNC com inetd n?o desabilite essa op??o, veja porque no item Utilizando o VNC com inetd.

Para desabilitar tal op??o, caso use GDM assim como eu, basta alterar a op??o DisallowTCP para true (exemplo: DisallowTCP=true) no arquivo /etc/X11/gdm/gdm.conf.

Caso voc? utilize o script startx para iniciar o X, basta editar a linha serverargs=””, no pr?prio arquivo startx, para serverargs=”-nolisten tcp”. Se voc? utiliza kdm ou xdm edite a linha :0 local /usr/X11R6/bin/X para :0 local /usr/X11R6/bin/X -nolisten tcp do arquivo /etc/X11/xdm/Xservers.

4. Utiliza??o
=============

Para um melhor entendimento este item foi subdividido em itens menores conforme as formas de utiliza??o do VNC.

Como a maioria das op??es do arquivo Xvnc ? v?lida para todos os itens abaixo, segue abaixo a descri??o das op??es que acho mais relevantes.

-desktop [nome]
Espec?fica o nome que ir? aparecer na janela do vncviewer. O padr?o ? x11.

-rfbport [porta]
Espec?fica a porta em que VNC ir? escutar, ideal se o firewall da sua empresa bloqueia a
porta padr?o. O padr?o ? 5900 mais o n?mero do display.

-httpd [diret?rio]
Executa um mini servidor HTTP com diret?rio raiz informado. Este diret?rio raiz deve conter
as classes java para o viewer, que por padr?o ficam em “/usr/local/vnc/classes”. Esta op??o
permite voc? acessar seu ambiente remotamente com um browser que tenha suporte a java.

-httpPort [porta]
Espec?fica a porta na qual o servidor HTTP ir? escutar. O padr?o ? 5800 mais o n?mero do
display.

-rfbauth [arquivo], -PasswordFile [arquivo]
Espec?fica o arquivo de senhas que o VNC deve consultar quando receber uma requisi??o. Voc?
deve especificar o arquivo que foi gerado atrav?s do arquivo vncpasswd conforme procedimento
acima (exemplo: “/home/agent/.vnc/passwd”).

-SendCutText
Habilita o compartilhamento da ?rea de transfer?ncia entre o ambiente do VNC para a m?quina
que esta executando o vncviewer. Esta op??o ? habilitada por padr?o. Para que esta op??o
funcione ? necess?rio executar o vncconfig no ambiente do VNC.

-AcceptCutText
Idem a anterior por?m no sentido inverso.

-DisconnectClients
Desconecta o usu?rio atual do ambiente VNC quando uma nova requisi??o n?o compartilhada ?
feita. O padr?o ? ativado. Se est? op??o for definida como “false”, novas requis?es n?o
compartilhadas ser?o recusadas enquanto o primeiro usu?rio estiver ativo. Quando est? op??o
for combinada com a op??o “NeverShared” s? ser? poss?vel ter um ?nico usu?rio por vez.

-NeverShared
Independente da configura??o do client, n?o permite conex?es compartilhadas. O padr?o ?
desativado.

-AlwaysShared
Independente da configura??o do client, sempre permite conex?es compartilhadas. O padr?o ?
desativado.

-SecurityTypes [op??o]
Define o modo de autentica??o. Atualmente s? existem as op??es “None” e “VncAuth”. O valor
padr?o ? “VncAuth”. Se voc? configurar esta op??o com “None” n?o ser? necess?rio informar
nenhuma senha no momento da requisi??o, isto ?, qualquer um ter? acesso ao seu ambiente VNC.
Portanto s? configure com “None” est?o op??o se voc? tiver certeza do que est? fazendo.

-QueryConnect
Pergunta ao usu?rio do ambiente VNC se deve aceitar ou n?o conex?es externas no momento da
requisi??o. Se voc? for usar o m?dulo do VNC ou vncserver ? necess?rio executar o vncconfig
no ambiente VNC, entretando n?o ? necess?rio para o x0vncserver.

-localhost
Aceita somente requisi??es locais. Ideal se voc? for acessar o ambiente atrav?s de um t?nel
SSH. Veja a documenta??o “Tunelando com OpenSSH” em
http://agentsmith.powerlinux.com.br/docs/doc7.html.

4.1. Utilizando o vncserver
===========================

Necessariamente voc? n?o precisa fazer nenhum configura??o inicial para usar o vncserver.

Quando o vncserver ? executado pela primeira vez ele checa a exist?ncia dos arquivos $HOME/.vnc/passwd (caso um alternativo n?o seja informado pela op??o -rfbauth ou -PasswordFile) e $HOME/.vnc/xstartup. Caso algum desses arquivos n?o exista o vncserver ir? criar um arquivo padr?o. No caso do arquivo $HOME/.vnc/passwd voc? precisa informar a senha de acesso ao ambiente do VNC.

agent@smith:~$ vncserver

You will require a password to access your desktops.

Password:
Verify:

New ‘smith:1 (agent)’ desktop is smith:1

Creating default startup script /home/agent/.vnc/xstartup
Starting applications specified in /home/agent/.vnc/xstartup
Log file is /home/agent/.vnc/smith:1.log

agent@smith:~$

Por padr?o o vncserver utiliza o display :1, sendo assim o Xvnc ir? escutar na porta 5901. Se voc? deseja saber quais op??es que foram passadas para o Xvnc execute o comando abaixo.

agent@smith:~$ ps aux | grep Xvnc
agent 436 0.1 1.4 9528 7404 pts/0 S 17:00 0:00 Xvnc :1 -desktop smith:1 (agent) -httpd /usr/local/vnc/classes -auth /home/agent/.Xauthority -geometry 1024×768 -depth 16 -rfbwait 30000 -rfbauth /home/agent/.vnc/passwd -rfbport 5901 -pn

O arquivo xstartup padr?o de longe n?o ? a melhor op??o, pois o mesmo executa o twm como gerenciador de janelas. Se voc? deseja que seja iniciado o mesmo gerenciador de janelas que ? iniciado pelo script startx substitua o arquivo xstartup com o conte?do abaixo.

#!/bin/sh

[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
vncconfig -iconic &
sh /etc/X11/xinit/xinitrc

Se voc? possui um configura??o personalizada para seu usu?rio altere a linha sh /etc/X11/xinit/xinitrc para sh $HOME/.vnc/xinitrc.

Voc? tamb?m pode utilizar todas as op??es descritas no iten Utiliza??o para o arquivo Xvnc.

agent@smith:~$ vncserver –help

usage: vncserver [:] [-name ] [-depth ]
[-geometry x]
[-pixelformat rgbNNN|bgrNNN]

vncserver -kill

Al?m das op??es descritas no item Utiliza??o voc? pode especificar as dimens?o da nova sess?o do X com a op??o -geometry. Essa op??o n?o pode ser usada com as outras formas de utiliza??o do VNC descritas nos outros itens.

-geometry [largura]x[altura]
Define as dimens?es da uma nova sess?o do X criada pelo vncserver. O padr?o ? 1024×768.

Essa op??o ? util quando voc? sabe as dimens?es do ambiente onde o vncviewer ser? executado. Desta forma voc? pode definir as dimens?es da nova sess?o do X seja menor do que as dimens?es do ambiente da m?quina onde ser? executado o vncviewer.

Para que a nova sess?o do X n?o escute na porta 6000 voc? tamb?m pode adicionar a op??o -nolisten tcp no final do comando do vncserver.

O VNC utiliza como padr?o o arquivo $HOME/.vnc/[hostname][display].log para armazenar seus logs. O $HOME/.vnc/[hostname][display].pid armazena o id do processo do Xvnc, este n?mero ? utilizado pelo comando vncserver -kill.

Para finalizar o ambiente VNC e a sess?o do X basta executar vncserver -kill seguido do display.

agent@smith:~$ vncserver -kill :1
Killing Xvnc process ID 436

4.2. Utilizando o x0vncserver
=============================

Para usar o x0vncserver voc? ser? obrigado a usar no m?nimo a op??o -rfbauth [arquivo] ou -PasswordFile [arquivo] caso voc? deseje que seu ambiente seja protegido por uma senha ou -SecurityTypes None para um acesso direto sem senha.

Se voc? estiver localmente na m?quina na qual deseja compartilhar o ambiente VNC basta executar o comando abaixo em um terminal qualquer. N?o feche este terminal pois se n?o o processo do VNC ser? finalizado tamb?m. Voc? pode criar um atalho em seu gerenciador de janela para n?o precisar deixar um terminal aberto ou colocar esse comando no arquivo ~/.xprofile para ser executa na inicializa??o da sess?o do X.

agent@smith:~$ x0vncserver PasswordFile=~/.vnc/passwd &

Ou se voc? estiver remotamente via SSH ser? necess?rio especificar o display com a op??o -display :0 da seguinte forma.

agent@smith:~$ x0vncserver PasswordFile=~/.vnc/passwd -display :0 &

Caso voc? use GDM e ao tentar usar o x0vncserver ? retornado o erro Xlib: Invalid MIT-MAGIC-COOKIE-1 key configure a v?riavel XAUTHORITY de acordo com o arquivo utilizado pelo GDM da seguinte forma.

agent@smith:~# XAUTHORITY=/var/lib/gdm/\:0.Xauth x0vncserver PasswordFile=/home/agent/.vnc/passwd -display :0 &

Se voc? iniciou a sess?o do X via startx e tamb?m tiver problemas do tipo Xlib: connection to “:0.0” refused by server utilize o comando xhost + como root antes de executar o x0vncserver.

Voc? tamb?m pode utilizar as op??es descritas no item Utiliza??o.

agent@smith:~$ x0vncserver -h

usage: x0vncserver []

Parameters can be turned on with – or off with –=0
Parameters which take a value can be specified as –
Other valid forms are===
Parameter names are case-insensitive.

Para finalizar o x0vncserver basta executar o comando abaixo.

agent@smith:~$ killall -9 x0vncserver
[1]+ Killed x0vncserver PasswordFile=~/.vnc/passwd -display :0

4.3. Utilizando o VNC como m?dulo para X
========================================

Atualmente utilizo o VNC desta forma, ela ? ideal para quem n?o usa uma m?quina compartilhada. Caso sua m?quina seja compartilhada com outros usu?rios utilize o VNC com inetd conforme item Utilizando o VNC com inetd.

Edite o arquivo /etc/X11/xorg.conf ou XF86Config e insira a linha Load “vnc” na sess?o Module.

Section “Module”

Load “vnc”
EndSection

Neste mesmo arquivo na sess?o Screen insira as op??es do Xvnc descritas no item Utiliza??o conforme desejar.

Section “Screen”

# VNC Configuration
# Option “SecurityTypes” “None”
Option “SecurityTypes” “VncAuth”
Option “UserPasswdVerifier” “VncAuth”
Option “PasswordFile” “/home/agent/.vnc/passwd”
Option “Httpd” “/usr/local/vnc/classes”
Option “Desktop” “Agent Smith VNC”
EndSection

Agora reinicie o X (Ctrl+Alt+Backspace ou killall -1 X) para carregar o m?dulo do VNC. Para descarregar o m?dulo edite o arquivo xorg.conf ou XF86Config novamente e comente a linha Load “vnc” colocando um # no in?cio.

4.4. Utilizando o VNC com inetd
===============================

O VNC com inetd ? ideal para m?quinas utilizadas por v?rios usu?rios ao mesmo tempo, pois permite multiplos logins com usu?rios diferentes ao mesmo tempo. Para isso voc? precisa ter um gerenciador de login gr?fico com suporte ? XDMCP. Al?m disso o Xvnc ser? executado somente a cada requis?o externa.

Existem dois modos no qual o VNC pode ser utilizado com o inetd chamados nowait e wait.

4.4.1. Modo nowait
==================

No modo nowait a cada requis?o externa em uma mesma porta o Xnvc ? executado. O Xvnc nunca ir? escutar a porta diretamente, portanto n?o ser? poss?vel efetuar requisi??es externas compartilhadas. Entretanto, utilizando o vncconfig ? poss?vel efetuar requisi??es reversas (do servidor para o cliente) colocando o vncviewer em modo de escuta, veja em detalhes no item Utilizando o vncconfig mais abaixo. Quando a conex?o com o vncviewer ? finalizada ou interrompida o processo do Xnvc tamb?m ? finalizado.

Para habilitar esse modo edite o arquivo /etc/inetd.conf e insir? a seguinte linha.

5900 stream tcp nowait nobody /usr/local/bin/Xvnc Xvnc -inetd -query localhost -once securitytypes=none

Neste exemplo a cada requisi??o externa o Xvnc ser? executado e o usu?rio ter? acesso da tela de login gr?fico via XDMCP, desta forma n?o precisamos configurar uma senha para o ambiente do VNC (securitytypes=none).

Para parar de usar o VNC basta comentar a linha do inetd.conf e reiniciar o inetd (/etc/rc.d/rc.inetd restart ou killall -1 inetd).

4.4.2. Modo wait
================

No modo wait, na primeira requis?o, o inetd faz com que o Xvnc seja executando escutando a porta diretamente. Isto significa que para cada porta existir? somente Xvnc executando. Portanto novas requisi??es compartilhadas poder?o ser aceitas pelo Xvnc. Mesmo quando a conex?o com o vncviewer for finalizada ou interrompida o processo do Xnvc continuar? rodando. O processo do Xnvc somente ser? finalizado quando o usu?rio efetuar um logoff da sess?o do gerenciador de login.

Para habilitar esse modo edite o arquivo /etc/inetd.conf e insir? a seguinte linha.

5900 stream tcp wait agent /usr/local/bin/Xvnc Xvnc -inetd -query localhost -once passwordFile=/home/agent/.vnc/passwd

Neste modo ? necess?rio especificar um arquivo de senha pois o Xvnc continuar? rodando at? que o usu?rio efetue o logoff. Se voc? fechar a janela do vncviewer o Xvnc ainda continuar? rodando podendo ser acessado posteriormente por qualquer usu?rio que tenha acesso a rede. Al?m disso o Xvnc poder? receber requisi??es compartilhadas.

Para parar de usar o VNC basta comentar a linha do inetd.conf e reiniciar o inetd (/etc/rc.d/rc.inetd restart ou killall -1 inetd).

5. Utilizando o vncconfig
=========================

O vncconfig possu? duas finalidades. A principal ? para controlar um Xvnc que j? esta em execu??o e a outra ? habilitar o compartilhamento da ?rea de transfer?ncia.

Segue abaixo as op??es para a fun??o principal do vncconfig.

-connect [nome ou ip]:[porta]
Faz um conex?o reversa com um vncviewer que esta escutando em [nome ou ip]. Se a op??o
:[porta] n?o for especif?cada a padr?o (5500) ser? utilizada.

-disconnect
Desconecta todos os clientes conectados ao ambiente VNC.

[-set] [op??o do Xvnc]=[valor]
Especif?ca um valor para o Xvnc que esta em execu??o. Essa op??o n?o serve para todas as
op??es do Xvnc.

-list
Lista todos as op??es que Xvnc suporta.

-get [op??o do Xvnc]
Imprime na tela o valor atual da op??o do Xvnc.

-desc [op??o do Xvnc]
Imprime na tela um pequena descri??o da op??o do Xvnc.

Segue abaixo as op??es para o compartilhamento da ?rea de transfer?ncia.

-display [display]
Especif?ca o display em que o ambiente VNC esta sendo executado.

-nowin
N?o exibe a janela de compartilhamento da ?rea de transfer?ncia.

-iconic
Executa a janela de compartilhamento da ?rea de transfer?ncia minimizada.

6. Utilizando o vncviewer ou browser
====================================

O vncviewer ? o cliente para acesso ao ambiente do VNC. Quando executa sem nenhuma op??o ? exibido uma janela para que voc? forne?a as informa??es do ambiente VNC que se deseja conectar.

Voc? tamb?m pode especif?car essas op??es via linha de comando da seguinte forma vncviewer [op??es] nome ou (ip)[:display].

? possivel executar o vncviewer em modo de escuta da seguinte forma vncviewer [op??es] -listen [porta]. Nesse modo a requisi??o ser? feita atrav?s do servidor onde se encontra o ambiente VNC em execu??o.

Cado voc? n?o especif?que o modo de condifica??o e a quantidade de cores o vncviewer ir? testar a velocidade entre o cliente e o server e selecionar? a mais adequada. Uma vez conectado voc? poder? alterar algumas dessas op??es atrav?s do menu do vncviewer precionando a tecla F8.

Segue abaixo as principais op??es que voc? pode utilizar com vncviewer via linha de comando.

-listen [porta]
Especif?ca a porta em que o o vncviewer ir? escutar. A porta padr?o ? 5500. A conex?o remota
deve ser inicia a partir do ambiente VNC utilizando o vncconfig (exemplo “vncconfig -connect
192.168.0.2:5500″).

-Shared
Envia uma requisi??o compartilhada. Por padr?o o ambiente VNC fecha todas as outras conex?es
quando recebe uma nova requisi??o n?o compartilhada.

-ViewOnly
Faz com que os eventos de teclado e mouse n?o sejam enviados para o ambiente VNC. Essa op??o
? util quando se deseja somente visualizar somente o que outro usu?rio j? conectado esta
fazendo, por isso ? ideal que essa ela seja utilizada em conjunto com a op??o “-Shared”.

-FullScreen
Inicia a sess?o em modo tela cheia.

Outras op??es do vncviewer podem ser vistas em sua man page (man vncviewer).

Para acessar um ambiente via browser, caso o servidor tenha suporte, basta digitar o endere?o seguido de dois pontos e a porta na barra de endere?os (exemplo http://192.168.0.2:5800). O unico pr?-requisito ? que o browser precisa ter suporte a java.

7. Conclus?o
============

O VNC ? mais f?cil de usar do que ele ja aparenta ser. Al?m de f?cil existe diversas formas seguras de utiliza??o.

A ?nica implementa??o que falta para o VNC ? implementar a transfer?ncia de arquivos entre o servidor e cliente. Isso j? existe para os projetos http://ultravnc.sourceforge.net e http://www.tightvnc.com por?m s? para Windows.

8. Refer?ncias
==============

– RealVNC (http://www.realvnc.com)
– Google (http://www.google.com.br)