De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Desvendando o RealVNC para Unix

Colaboração: Ricardo Iramar dos Santos

Data de Publicação: 14 de Junho de 2005

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, encontrei uma documentação sobre como carregar o módulo do VNC no X. 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

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 1024x768 -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 [:<number>] [-name <desktop-name>] [-depth <depth>]
  [-geometry <width>x<height>]
  [-pixelformat rgbNNN|bgrNNN]
  <Xvnc-options>...
  
  vncserver -kill <X-display>

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 é 1024x768.

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>]
  
  Parameters can be turned on with -<param> or off with -<param>=0
  Parameters which take a value can be specified as -<param> <value>
  Other valid forms are <param>=<value> -<param>=<value> --<param>=<value>
  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[: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


Dúvidas, críticas e sugestões devem ser enviadas para agent.smith@globo.com.

Quer saber mais um pouco sobre o autor desta documentação? Acesse minha home page em http://agentsmith.powerlinux.com.br.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Ricardo Iramar dos Santos