[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 227.   X: accesso remoto alla sessione di lavoro

Con un terminale a caratteri è possibile gestire una sessione di lavoro trasferibile successivamente in un altro terminale, attraverso il programma Screen (sezione 116.3); in modo simile, è possibile agire per quanto riguarda la sessione di lavoro con un servente X, attraverso VNC, (1) ovvero Virtual network computing.

È bene ricordare che X offre già la possibilità di eseguire un programma in un elaboratore, mostrandone le finestre nel servente di un altro (sezione 217.5). Diversamente da questa modalità comune di utilizzo di X, VNC consente di controllare tutto il servente grafico e il gestore di finestre (o anche il gestore di sessione) relativo. Inoltre, VNC consente anche un accesso simultaneo da parte di più terminali remoti, solitamente per permettere la visualizzazione di ciò che avviene.

VNC è uno strumento utile soprattutto nell'ambito di una rete locale protetta dall'esterno, dal momento che utilizza una comunicazione in chiaro e che l'accesso al servente è controllato semplicemente da una parola d'ordine.

227.1   Funzionamento di VNC in generale

VNC si compone essenzialmente di un programma servente, con le funzionalità grafiche di X, il quale non si collega a una stazione grafica e viene usato attraverso un programma cliente apposito. Questo servente comunica nel modo consueto, come un servente X normale (connessioni TCP alle porte 6 000+n) a cui si aggiunge la comunicazione necessaria al controllo attraverso il proprio cliente specifico, con le porte 5 900+n.

Figura 227.1. Comunicazione tra il servente e il cliente VNC.

comunicazione tra servente e cliente VNC

La figura mostra una situazione comune, in cui un elaboratore ospita un servente VNC, dinkel.brot.dg, che offre la stazione grafica virtuale :1. In tal modo, la comunicazione con il servente avviene alla porta 5 901 (ovvero 5 900 più il numero corrispondente alla stazione grafica virtuale).

Nell'elaboratore che ospita il servente VNC, l'interazione con questo non risulta apparente, a meno di avviare nello stesso un cliente VNC.

Il cliente VNC, a sua volta, potrebbe essere autonomo, oppure richiedere un servente X normale per poter funzionare. Il programma mostrato in figura è un esempio di cliente che richiede X per poter funzionare.

Un servente VNC può essere utilizzato da un solo cliente, oppure può essere consentito un accesso simultaneo da parte di più clienti; in tal caso, probabilmente, viene concesso a uno solo di interagire, mentre agli altri è permesso solo osservare. Pertanto, le situazioni più comuni di utilizzo di un sistema grafico basato su VNC sono due: l'esigenza di mantenere in funzione una sessione di lavoro grafica, a cui poter accedere da un terminale remoto, sospendendo e riprendendo la connessione anche da altre posizioni; oppure l'esigenza di fare un lavoro che altri utenti possono visualizzare, senza bisogno di un proiettore.

L'accesso a un servente VNC è controllato esclusivamente attraverso il confronto di una parola d'ordine, definita in modo indipendente dal meccanismo di riconoscimento degli utenti del sistema operativo.

227.2   Avvio e conclusione del funzionamento del servente VNC in un sistema GNU

Il funzionamento del servente VNC dipende dalla configurazione del servente X: se X non funziona correttamente a causa di un difetto di configurazione, anche il servente VNC non può funzionare. Pertanto, di solito si avvia un servente VNC da una sessione X già attiva, probabilmente da una finestra di terminale:

vncserver [:n_stazione_grafica] [opzioni]

Il programma vncserver è in realtà un involucro per controllare l'avvio di Xvnc, Xrealvnc o Xtightvnc (dipende dall'edizione e ci possono essere anche altri nomi), che è invece il vero servente VNC.

Generalmente, l'avvio del servente VNC avviene sulla stazione grafica :1, anche quando la stazione grafica :0 non risulta impegnata, salvo che sia indicato diversamente con le opzioni della riga di comando.

Quando un utente avvia per la prima volta un servente VNC nel modo descritto, questo crea la directory ~/.vnc/, in cui vengono annotate le informazioni sulle sessioni di lavoro relative, oltre a un file contenente una parola d'ordine cifrata, che serve per consentire l'accesso successivo. In ogni caso, la prima volta provvede vncserver a preparare tutto; l'esempio seguente si riferisce all'utente tizio presso l'elaboratore dinkel.brot.dg:

vncserver[Invio]

You will require a password to access your desktops.

Password: digitazione_all'oscuro[Invio]

Verify: digitazione_all'oscuro[Invio]

New 'X' desktop is dinkel:1

Starting applications specified in /etc/X11/Xsession
Log file is /home/tizio/.vnc/dinkel:1.log

Come si può intendere, viene richiesta l'indicazione e la conferma di una parola d'ordine, che non può essere troppo breve, la quale viene conservata nel file ~/.vnc/passwd in forma cifrata. Quando l'utente dovesse avviare nuovamente un servente VNC, disponendo già di questo file, non verrebbe più chiesta la parola d'ordine, rimanendo la stessa già stabilita in precedenza.

Superata questa fase, viene avviato effettivamente il servente VNC. Nell'esempio risulta avviato sulla stazione grafica virtuale :1; pertanto, per poterlo raggiungere, si deve usare un indirizzo del tipo dinkel.brot.dg:1 (in generale conviene evitare la forma abbreviata che viene suggerita da vncserver).

Al termine, vncserver ricorda dove si può trovare il file in cui sono annotate le informazioni specifiche sull'avvio del servente VNC, che diventa molto utile quando questo non si avvia come si desidera, per scoprire l'origine del problema. In generale, questo file ha la forma: ~/.vnc/nodo:n_stazione_grafica.log.

Non sono da escludere problemi di configurazione di XFree86, che XFree86 stesso è in grado di superare, mentre il servente VNC non può.

Inizialmente, il contenuto di questo file può essere simile al testo seguente:

15/12/02 09:09:00 Xvnc version 3.3.5 - built Nov 22 2002 09:33:52
15/12/02 09:09:00 Copyright (C) 2002 RealVNC Ltd.
15/12/02 09:09:00 Copyright (C) 1994-2000 AT&T Laboratories Cambridge.
15/12/02 09:09:00 All Rights Reserved.
15/12/02 09:09:00 See http://www.realvnc.com for information on VNC
15/12/02 09:09:00 Desktop name 'X' (dinkel:1)
15/12/02 09:09:00 Protocol version supported 3.3
15/12/02 09:09:00 Listening for VNC connections on TCP port 5901

Eventualmente, se sono stati installati i componenti necessari di VNC, vncserver avvia il servente VNC in modo da offrire anche un accesso HTTP alla porta 5 800+n, per mezzo del quale, con un navigatore in grado di mettere in funzione programmi Java, è possibile accedere in mancanza di un programma cliente migliore. In tal caso, si può osservare questo fatto nello stesso file appena mostrato:

15/12/02 09:09:00 Listening for HTTP connections on TCP port 5801
15/12/02 09:09:00   URL http://dinkel:5801

In questo caso, l'indirizzo per accedere è preferibilmente http://dinkel.brot.dg:5801.

Se si vuole avviare il servente VNC senza avviare prima X, le cose si complicano un po'. Infatti, quando ciò è possibile, X determina da solo alcune informazioni sul funzionamento dell'adattatore grafico e sulle capacità dello schermo reale; pertanto, quando si avvia il servente VNC da una sessione di X già attiva, le stesse informazioni vengono utilizzate da VNC, mentre in mancanza di queste, il funzionamento di VNC dipenderebbe da parametri predefiniti, spesso non gradevoli. Per esempio, avviando un servente VNC senza l'appoggio di un servente XFree86 preesistente, si ottiene una stazione grafica impostata sostanzialmente per un adattatore di tipo VGA standard (640×480 punti grafici e una profondità di colori modesta). L'esempio seguente mostra l'avvio di un servente VNC, attraverso vncserver, al di fuori di una sessione di lavoro con X, dove si specifica la dimensione della superficie grafica (1 024×768 punti grafici) e la profondità di colori (16 bit):

vncserver -depth 16 -geometry 1024x768[Invio]

Per concludere il funzionamento del servente VNC, presso l'elaboratore locale, si può usare vncserver con l'opzione -kill:

vncserver -kill :n_stazione_grafica

Al termine della descrizione dell'avvio di un servente VNC, è bene chiarire che, quando accede un cliente VNC, se già esiste un altro programma cliente collegato, generalmente questo (quello preesistente) termina di funzionare. In pratica, in condizioni normali, si suppone che l'utente che accede a un servente VNC sia l'unico autorizzato a farlo, pertanto, se è rimasta una sessione aperta, ciò è dovuto probabilmente a una dimenticanza dello stesso. Per consentire degli accessi simultanei al servente VNC, è necessaria l'opzione -alwaysshared, come descritto nella tabella seguente, che riepiloga alcune opzioni per l'avvio dell'involucro vncserver.

Tabella 227.6. Alcune opzioni della riga di comando di vncserver.

Opzione o argomento Descrizione
:n_stazione_grafica
Consente di indicare espressamente il numero di stazione grafica da utilizzare. In mancanza di questa informazione dovrebbe trattarsi di :1.
-geometry n_punti_larghezzaxn_punti_altezza
Definisce la dimensione della superficie grafica da utilizzare, in punti grafici.
-depth n_bit
Definisce la profondità di colori espressa in numero di bit.
-nevershared
-alwaysshared
Consente di impedire o consentire la condivisione multipla del servente. In pratica, la prima delle due opzioni è quella predefinita, per fare in modo che solo un accesso per volta sia permesso.
-startup programma
Avvia all'interno del servente grafico il programma o lo script indicato.
-kill :n_stazione_grafica
Conclude il funzionamento del servente, in funzione nell'elaboratore locale, controllando la stazione grafica indicata.

227.3   Avvio del servente VNC in condizioni difficili in un sistema GNU

L'impostazione effettiva di un servente X in una distribuzione GNU, può essere molto complessa. In altri termini, il funzionamento di xinit e di startx, non è perfettamente uniforme da una distribuzione all'altra, spesso per la necessità di arginare dei problemi di sicurezza. Pertanto, qualsiasi sia la ragione, può succedere che un servente VNC non si comporti come ci si aspetterebbe; si può arrivare anche a vedere funzionare il servente, ma senza un gestore di finestre o un gestore di sessione.

Di fronte a problemi di questo tipo, può essere più conveniente avviare direttamente il servente VNC senza l'aiuto dell'involucro vncserver, predisponendo uno script adatto alle proprie esigenze. Vengono mostrati qui due script: uno per controllare Xvnc, ovvero l'eseguibile del servente VNC, l'altro per controllare l'avvio di un gestore di finestre, chiamato all'interno del primo. A fianco di questi esempi, ne vengono mostrati comunque anche di equivalenti in cui si utilizza vncserver, ma in modo da ottenere lo stesso risultato, perché alle volte può essere vero il contrario, ovvero che senza vncserver non si riesca ad avviare VNC.

Come già accennato, il programma eseguibile del servente VNC può essere denominato Xvnc, Xrealvnc o Xtightvnc, a seconda dell'edizione. Tuttavia, è normale che sia disponibile almeno un collegamento simbolico che consenta l'uso del nome Xvnc.

#!/bin/sh
# vncs1024

# X fonts.
VNC_FONTS=\
/usr/lib/X11/fonts/misc,\
/usr/lib/X11/fonts/75dpi,\
/usr/lib/X11/fonts/100dpi/,\
/usr/lib/X11/fonts/Type1/,\
/usr/lib/X11/fonts/Speedo/

# Quit old VNC servers and reset personal configuration.
killall Xvnc 2> /dev/null
killall Xrealvnc 2> /dev/null
killall Xtightvnc 2> /dev/null
rm -rf    ~/.vnc
mkdir     ~/.vnc
vncpasswd ~/.vnc/passwd

# Start VNC server at screen :1, using ~/.vnc/log for log file.
Xvnc :1 -auth ~/.Xauthority -geometry 1024x768 -depth 16 \
    -rfbwait 120000 -rfbauth ~/.vnc/passwd -rfbport 5901 \
    -fp $VNC_FONTS -co /etc/X11/rgb \
    -dpi 100 2> ~/.vnc/log &

# Start the window manager inside a wrap script.
# After window manager run, the VNC server should be killed, by
# the wrap script.
vncwm &
#!/bin/sh
# vncwm
xloadimage -display :1 -onroot -fullscreen ~/.wallpaper
fvwm -display :1  2> /dev/null ; killall Xvnc ; \
                                 killall Xrealvnc ; \
                                 killall Xtightvnc

Il primo di questi due script, denominato qui vncs1024, definisce inizialmente una variabile di ambiente, contenente l'elenco delle directory dei caratteri di X (questa informazione può essere tratta eventualmente dal file di configurazione di X: /etc/X11/XF86Config*, /etc/X11/xorg.conf, ecc.). Successivamente elimina i processi avviati con il nome Xvnc, Xrealvnc o Xtightvnc, ammesso che ce ne siano, poi elimina anche il contenuto della directory ~/.vnc/; quindi chiede di definire una parola d'ordine nuova, con l'aiuto di vncpasswd.

Quando tutto è pronto, si avvia l'eseguibile Xvnc, utilizzando la stazione grafica :1 (come fa normalmente vncserver), con un elenco piuttosto lungo di opzioni, come si può vedere dall'esempio. In particolare, in questo caso, si specifica una dimensione della superficie grafica di 1 024×768 punti grafici, inviando il flusso dello standard error nel file ~/.vnc/log, per poter sapere ciò che accade. Si osservi inoltre che Xvnc viene avviato sullo sfondo in modo esplicito.

Infine si avvia uno script vncwm, il cui scopo è quello di avviare un gestore di finestre e di chiudere il funzionamento di Xvnc, Xrealvnc o Xtightvnc, al termine del funzionamento di questo. Infatti, come si vede, lo script carica un fondale e avvia Fvwm: al termine del funzionamento di Fvwm elimina tutti i processi con il nome Xvnc, Xrealvnc e Xtightvnc.

Naturalmente, in questo modo si può avviare un solo servente VNC alla volta.

Da quanto visto si intuisce la sintassi per l'avvio dell'eseguibile Xvnc:

Xvnc [:n_stazione_grafica] [opzioni]

Segue la descrizione di alcune opzioni della riga di comando.

Tabella 227.9. Alcune opzioni della riga di comando di Xvnc. Si osservi che a seconda della realizzazione di VNC, alcune opzioni potrebbero non funzionare.

Opzione o argomento Descrizione
:n_stazione_grafica
Consente di indicare espressamente il numero di stazione grafica da utilizzare. In mancanza di questa informazione si tenta di usare :0.
-auth file
Definisce il nome del file usato per l'autenticazione di X.
-geometry n_punti_larghezzaxn_punti_altezza
Definisce la dimensione della superficie grafica da utilizzare, in punti grafici.
-depth n_bit
Definisce la profondità di colori espressa in numero di bit.
-nevershared
-alwaysshared
Consente di impedire o consentire la condivisione multipla del servente. In pratica, la prima delle due opzioni è quella predefinita, per fare in modo che solo un accesso per volta sia permesso.
-rfbwait n_millisecondi
Definisce il tempo massimo di attesa, in millisecondi, per un cliente VNC.
-rfbauth file
Definisce il file contenente la parola d'ordine cifrata che serve per consentire l'accesso.
-rfbport n_porta
Definisce il numero della porta usata per la comunicazione con i clienti VNC.
-fp stringa
Definisce l'elenco dei percorsi delle directory contenenti informazioni sui caratteri tipografici da usare.
-co file
Definisce il file contenente le informazioni sui colori, senza l'estensione .txt. Generalmente si ricopia il percorso indicato nella direttiva RgbPath del file /etc/X11/XF86Config[-4] o /etc/X11/xorg.conf.
-dpi n_punti
Definisce la risoluzione in punti per pollice.

In alternativa all'avvio diretto di Xvnc, il comando di avvio potrebbe essere sostituito così:

...
# Start VNC server at screen :1, using ~/.vnc/log for log file.
vncserver :1 -auth ~/.Xauthority -geometry 1024x768 -depth 16 \
    -rfbwait 120000 -rfbauth ~/.vnc/passwd -rfbport 5901 \
    -fp $VNC_FONTS -co /etc/X11/rgb \
    -dpi 100 \
    -startup true 2> ~/.vnc/log &
...

Si può osservare la comparsa dell'opzione -startup, con la quale si vuole evitare che vncserver avvii autonomamente un gestore di sessione o altro, che comunque viene già controllato all'interno del proprio script.

227.4   Configurazione e utilizzo dei caratteri tipografici

Non esiste una configurazione vera e propria del servente VNC; esiste piuttosto una configurazione di vncserver, che di solito si lascia commentata completamente. In ogni caso, si tratta del file /etc/vnc.conf ed eventualmente di ~/.vncrc.

L'utilizzo di questi file diventa utile, quindi, solo se si avvia il servente VNC attraverso vncserver e si sono manifestati dei problemi a cui si pone rimedio solo con la configurazione.

Una situazione in cui è necessario intervenire nella configurazione è la presenza di direttive FontPath nel file di configurazione di X (/etc/X11/XF86Config*, /etc/X11/xorg.conf, ecc.), che fanno riferimento a caratteri tipografici non esistenti; per esempio quando queste informazioni sono fornite da un servente di caratteri che in quel momento non risulta rispondere. In tal caso, si può specificare nella configurazione quali percorsi sono sicuri, tralasciando il superfluo.

227.5   Accesso a un servente VNC

Si può accedere a un servente VNC con diversi programmi, ma in un sistema GNU dovrebbe essere preferibile farlo attraverso xvncviewer. Come lascia intuire il nome, si tratta di un programma che richiede l'uso di un servente X già attivo, che mostra poi la stazione grafica remota in una finestra di quella locale.

Di solito è necessario avviare xvncviewer da una finestra di terminale, per poter specificare a quale nodo e a quale stazione grafica collegarsi. Si utilizza la sintassi seguente:

xvncviewer [opzioni] nodo:n_stazione_grafica

Se nella riga di comando non viene specificata l'opzione -passwd (con la quale si indica un file contenente una parola d'ordine cifrata), è necessario inserire la parola d'ordine per l'accesso al servente VNC:

xvncviewer dinkel.brot.dg:1[Invio]

VNC viewer version 3.3.5 - built Nov 22 2002 09:31:25
Copyright (C) 2002 RealVNC Ltd.
Copyright (C) 1994-2000 AT&T Laboratories Cambridge.
See http://www.realvnc.com for information on VNC.
VNC server supports protocol version 3.3 (viewer 3.3)

Password: digitazione_all'oscuro[Invio]

Successivamente vengono visualizzate altre informazioni, quindi appare la finestra relativa alla comunicazione con il servente VNC.

Se quello che si vede è solo uno sfondo grigio, senza applicazioni attive, dove premendo i tasti del mouse non si ottiene nulla, è probabile che il servente VNC sia stato avviato senza un gestore di finestre o un gestore di sessione.

Quando si vuole visualizzare semplicemente ciò che accade in un servente VNC, senza poter interferire, mentre un altro cliente VNC sta interagendo, si può usare l'opzione -viewonly, assieme a -shared. Eventualmente, dalla parte del servente si può usare l'opzione -alwaysshared per garantire che sia consentito l'accesso simultaneo da parte di più clienti (questa opzione vale sia per l'avvio diretto di Xvnc, sia per l'involucro vncserver):

xvncviewer -viewonly dinkel.brot.dg:1[Invio]

Segue la descrizione di alcune opzioni.

Tabella 227.12. Alcune opzioni della riga di comando di xvncviewer.

Opzione o argomento Descrizione
nodo:n_stazione_grafica
Consente di indicare il nodo e il numero di stazione grafica da utilizzare.
-shared
Richiede una connessione a un servente VNC, consentendo esplicitamente la condivisione dello stesso con altri clienti.
-viewonly
Richiede una connessione a un servente VNC per la sola visualizzazione di ciò che accade. Di solito si usa assieme all'opzione -shared.
-fullscreen
Fa in modo di funzionare occupando tutta la superficie disponibile, senza il contorno di una finestra.
-passwd file
Consente di specificare un file contenente una parola d'ordine cifrata, che dovrebbe corrispondere a quanto utilizzato dallo stesso servente, in modo da non richiedere all'utente l'inserimento della stessa.

227.5.1   Utilizzo di «svncviewer»

Se il proprio sistema GNU/Linux dispone della libreria SVGAlib (capitolo 215) configurata correttamente, è possibile usare il programma svncviewer (2) per accedere a un servente VNC senza bisogno di X:

svncviewer [opzioni] nodo:n_stazione_grafica

Come ogni programma che richieda di accedere direttamente all'adattatore grafico, anche questo deve essere avviato con i privilegi dell'utente root, pertanto, può essere necessario attribuirgli il permesso SUID associato all'utente root (SUID-root).

Le opzioni principali e gli argomenti per l'uso di questo programma sono abbastanza simili a quelle di xvncviewer, come annotato nella tabella successiva.

Tabella 227.13. Alcune opzioni della riga di comando di svncviewer.

Opzione o argomento Descrizione
nodo:n_stazione_grafica
Consente di indicare il nodo e il numero di stazione grafica da utilizzare.
-shared
Richiede una connessione a un servente VNC, consentendo esplicitamente la condivisione dello stesso con altri clienti.
-passwd file
Consente di specificare un file contenente una parola d'ordine cifrata, che dovrebbe corrispondere a quanto utilizzato dallo stesso servente, in modo da non richiedere all'utente l'inserimento della stessa.

227.6   Utilizzo comune di VNC

La situazione in cui è più comune l'utilizzo di VNC è quella dell'utente che si trova lontano dal proprio elaboratore, al quale può comunque accedere attraverso la rete. In generale, in questo elaboratore remoto non è già in funzione alcun servente VNC, pertanto conviene avviare X nell'elaboratore di cui si dispone temporaneamente; quindi, da lì, con una finestra di terminale, si può contattare l'elaboratore remoto e avviare il servente VNC. Se tutto funziona correttamente, il servente VNC viene avviato con caratteristiche compatibili alla grafica di cui si dispone effettivamente; quindi ci si può collegare con un cliente VNC.

elaboratore_localessh tizio@dinkel.brot.dg[Invio]

In questo modo ci si collega all'elaboratore dinkel.brot.dg utilizzando l'utenza tizio. Successivamente si avvia il servente VNC presso l'elaboratore remoto:

elaboratore_remotovncserver[Invio]

Quindi, se tutto ha funzionato correttamente ci si collega con un cliente VNC:

elaboratore_remotoexit[Invio]

elaboratore_localexvncviewer dinkel.brot.dg:1[Invio]

227.7   VNC attraverso un tunnel cifrato con il protocollo SSH

Attraverso Secure Shell (capitolo 400) è possibile creare un tunnel cifrato, per utilizzare con più tranquillità l'accesso a un servente VNC. Viene riproposto l'esempio di utilizzo comune, utilizzando un tunnel del genere:

elaboratore_localessh tizio@dinkel.brot.dg[Invio]

In questo modo ci si collega all'elaboratore dinkel.brot.dg utilizzando l'utenza tizio. Successivamente si avvia il servente VNC presso l'elaboratore remoto:

elaboratore_remotovncserver[Invio]

Dall'elaboratore locale ci si collega nuovamente con l'elaboratore remoto per creare un tunnel cifrato:

elaboratore_remotoexit[Invio]

elaboratore_localessh -N -L 5901:dinkel.brot.dg:5901[Invio]

A questo punto, invece di contattare direttamente l'elaboratore remoto dinkel.brot.dg, è invece sufficiente collegarsi a quello locale; prima però, conviene mettere il programma ssh sullo sfondo:

[Ctrl z]

elaboratore_localebg[Invio]

elaboratore_localexvncviewer localhost:1[Invio]

227.8   Inserire VNC automaticamente all'avvio di X

È possibile realizzare uno script con cui si avvia un servente VNC e subito dopo X con un cliente VNC, a tutto schermo, che punta esattamente al servente locale, senza interferire con l'utente. Questo tipo di tecnica può servire in un laboratorio didattico in due casi: quando l'insegnante vuole avviare una sessione di lavoro grafica, pronta subito perché gli studenti vi si possano collegare, evitando così di utilizzare una lavagna luminosa; quando si vuole fare avviare agli studenti la sessione di lavoro grafica in modo che l'insegnante abbia la possibilità di intervenire sul loro lavoro, senza doversi spostare fisicamente dalla sua postazione.

#!/bin/sh
# vncsc1024

# X fonts.
VNC_FONTS=\
/usr/lib/X11/fonts/misc,\
/usr/lib/X11/fonts/75dpi,\
/usr/lib/X11/fonts/100dpi/,\
/usr/lib/X11/fonts/Type1/,\
/usr/lib/X11/fonts/Speedo/

# Quit old VNC servers and reset personal configuration.
killall Xvnc 2> /dev/null
killall Xrealvnc 2> /dev/null
killall Xtightvnc 2> /dev/null
rm -rf    ~/.vnc
mkdir     ~/.vnc
vncpasswd ~/.vnc/passwd

# Start VNC server at screen :1, using ~/.vnc/log for log file.
Xvnc :1 -auth ~/.Xauthority -geometry 1024x768 -depth 16 \
    -rfbwait 120000 -rfbauth ~/.vnc/passwd -rfbport 5901 \
    -fp $VNC_FONTS -co /etc/X11/rgb \
    -alwaysshared nologo -dpi 100 2> ~/.vnc/log &

# Start the window manager inside a wrap script.
# After window manager run, the VNC server should be killed, by
# the wrap script.
vncwm &

# Start xinit with xvncviewer as a client
xinit /usr/bin/xvncviewer -fullscreen -passwd ~/.vnc/passwd localhost:1

Come si può osservare, questo esempio è molto simile a quanto già visto in una sezione precedente, dove la novità sta nell'avviare, dopo lo script vncwm, xinit specificando l'avvio di xvncviewer al posto del solito gestore di finestre. Naturalmente, lo script vncwm rimane tale e quale a prima:

#!/bin/sh
# vncwm
xloadimage -display :1 -onroot -fullscreen ~/.wallpaper
fvwm -display :1  2> /dev/null ; killall Xvnc ; \
                                 killall Xrealvnc ; \
                                 killall Xtightvnc

Come si può intuire, lo script che qui è stato chiamato vncsc1024 è adatto per l'insegnante (o il relatore) che vuole consentire l'accesso ai suoi studenti, a cui deve comunicare anche la parola d'ordine per accedere, che come si vede viene sostituita ogni volta. Diversamente, se si vuole realizzare uno script da fare usare agli studenti al posto del solito startx, si deve fare in modo che il file della parola d'ordine sia già stato preparato e sia «standard»; l'estratto seguente mostra solo le istruzioni salienti da modificare:

# Quit old VNC servers and reset personal configuration.
killall Xvnc 2> /dev/null
killall Xrealvnc 2> /dev/null
killall Xtightvnc 2> /dev/null
rm -rf    ~/.vnc
mkdir     ~/.vnc
cp /etc/vnc/sharedx.passwd ~/.vnc/passwd
chmod 0600 ~/.vnc/passwd

Anche qui è possibile utilizzare vncserver con l'aggiunta dell'opzione -startup:

...
# Start VNC server at screen :1, using ~/.vnc/log for log file.
Xvnc :1 -auth ~/.Xauthority -geometry 1024x768 -depth 16 \
    -rfbwait 120000 -rfbauth ~/.vnc/passwd -rfbport 5901 \
    -fp $VNC_FONTS -co /etc/X11/rgb \
    -alwaysshared nologo -dpi 100 \
    -startup true 2> ~/.vnc/log &
...

227.9   RealVNC e TightVNC

I due filoni principali dello sviluppo di VNC sono rappresentati da RealVNC e da TightVNC. In generale, questi lavori sono abbastanza compatibili tra di loro, comunque vale la pena di conoscere i nomi con cui potrebbero essere distinti i programmi e gli script che li riguardano:

VNC VNC4 RealVNC TightVNC
Xvnc Xvnc4 Xrealvnc Xtightvnc
vncserver vnc4server realvncserver tightvncserver
xvncviewer xvnc4viewer xrealvncviewer xtightvncviewer
vncconnect vnc4connect realvncconnect tightvncconnect
vncpasswd vnc4passwd vncpasswd.real --

227.10   Script «vncrc»

La distribuzione nanoLinux (volume XXVI) includeva uno script, denominato vncrc (oggi incorporato in nanorc), con lo scopo di facilitare l'uso di VNC (RealVNC o TightVNC), nelle situazioni più comuni. Viene proposta qui una versione semplificata di quello script, che potrebbe essere utile anche al di fuori del contesto particolare di nanoLinux. Una copia dovrebbe essere disponibile anche qui: <allegati/a2/vncrc>).

#!/bin/sh
##
## Multipurpose script to use VNC.
##
#
# Main variables.
#
TEMPORARY=`tempfile`
touch $TEMPORARY
SELECTION=""
#
GEOMETRY=""
DEPTH=""
#
VNC_REMOTE_SERVER=`cat /etc/nanoLinux/all/VNC_REMOTE_SERVER 2> /dev/null`
VNC_REMOTE_SERVERS=`cat /etc/nanoLinux/all/VNC_REMOTE_SERVERS 2> /dev/null`
#
# Encripted default password.
# bla bla bla: zxdftipe
#
ENCRIPTED_PASSWORD="zxdftipe"   
PASSWORD_FILE="$HOME/.vnc/passwd"
#
# X fonts.
#
VNC_FONTS=\
/usr/lib/X11/fonts/misc/,\
/usr/lib/X11/fonts/75dpi/:unscaled,\
/usr/lib/X11/fonts/100dpi/:unscaled,\
/usr/lib/X11/fonts/75dpi/,\
/usr/lib/X11/fonts/100dpi/,\
/usr/lib/X11/fonts/Type1/,\
/usr/lib/X11/fonts/Speedo/
#
# Command line arguments.
#
PROGRAM_NAME=`basename $0`
ARGUMENTS="$@"
#
# Main menu.
#
# srvr  = server
# cclnt = controlling client
# vclnt = viewing client
#
main_menu () {
    if dialog   \
        --clear \
        --title "VNC run commands" \
        --menu "VNC server works at \":1\" and X works at \":0\"" \
        0 0 0 \
        "vncs"            "srvr             + new password" \
        "vncsc"           "srvr + cclnt + X + new password" \
        "vnccx"           "       cclnt + X + password \"$PASSWORD_FILE\"" \
        "vncvx"           "       vclnt + X + password \"$PASSWORD_FILE\"" \
        "vncc"            "       cclnt + X + password \"$PASSWORD_FILE\"" \
        "vncv"            "       vclnt + X + password \"$PASSWORD_FILE\"" \
        "sharedx"         "srvr + cclnt + X + default password" \
        "takesharedx"     "       cclnt + X + default password" \
        "viewsharedx"     "       vclnt + X + default password" \
        2> $TEMPORARY
    then
        SELECTION=`cat $TEMPORARY`
        echo "" > $TEMPORARY
        #
        # Test if the command can be done
        #
        if false
        then
            #
            # There are troubles... (to be done).
            #
            dialog --msgbox "There are unknown troubles..." 0 0
        else
            #
            # Continue as run with this command name (arguments included).
            #
            PROGRAM_NAME="$SELECTION"
        fi
    fi
}
#
# sharedx.
#
start_shared_x () {
    #
    # Quit old VNC servers and reset personal configuration.
    #
    killall Xvnc 2> /dev/null
    killall Xrealvnc 2> /dev/null
    killall Xtightvnc 2> /dev/null
    rm -f    $PASSWORD_FILE
    echo "$ENCRIPTED_PASSWORD" > $PASSWORD_FILE
    chmod 0600 $PASSWORD_FILE
    #
    # Start VNC server at screen :1, using ~/.vnc/log for log file.
    #
    Xvnc :1 -auth ~/.Xauthority -geometry $GEOMETRY -depth $DEPTH \
        -rfbwait 120000 -rfbauth $PASSWORD_FILE -rfbport 5901 \
        -fp $VNC_FONTS -co /etc/X11/rgb \
        -alwaysshared nologo -dpi 100 2> `dirname $PASSWORD_FILE`/log &
    #
    # If it does not work, start it with vncserver:
    #
    # vncserver :1 -auth ~/.Xauthority -geometry $GEOMETRY -depth $DEPTH \
    #    -rfbwait 120000 -rfbauth $PASSWORD_FILE -rfbport 5901 \
    #    -fp $VNC_FONTS -co /etc/X11/rgb \
    #    -alwaysshared nologo -dpi 100 \
    #    -startup true 2> `dirname $PASSWORD_FILE`/log &
    #
    # Window manager.
    #
    start_vnc_window_manager &
    #
    # Start xinit with xvncviewer as a client
    #
    xinit /usr/bin/xvncviewer -fullscreen -passwd $PASSWORD_FILE localhost:1
}
#
# vncs.
#
start_vncs () {
    #
    # Quit old VNC servers and reset personal configuration.
    #
    killall Xvnc 2> /dev/null
    killall Xrealvnc 2> /dev/null
    killall Xtightvnc 2> /dev/null
    rm -f    $PASSWORD_FILE
    #
    if ! vncpasswd $PASSWORD_FILE
    then
        #
        dialog --msgbox "The password is not valid, sorry." 0 0
        #
        exit
        #
    fi
    #
    # Start VNC server at screen :1, using ~/.vnc/log for log file.
    #
    Xvnc :1 -auth ~/.Xauthority -geometry $GEOMETRY -depth $DEPTH \
        -rfbwait 120000 -rfbauth $PASSWORD_FILE -rfbport 5901 \
        -fp $VNC_FONTS -co /etc/X11/rgb \
        -alwaysshared nologo -dpi 100 2> `dirname $PASSWORD_FILE`/log &
    #
    # If it does not work, start it with vncserver:
    #
    # vncserver :1 -auth ~/.Xauthority -geometry $GEOMETRY -depth $DEPTH \
    #    -rfbwait 120000 -rfbauth $PASSWORD_FILE -rfbport 5901 \
    #    -fp $VNC_FONTS -co /etc/X11/rgb \
    #    -alwaysshared nologo -dpi 100 \
    #    -startup true 2> `dirname $PASSWORD_FILE`/log &
    #
    # Window manager.
    #
    start_vnc_window_manager &
}
#
# vncwm.
#
start_vnc_window_manager () {
    #
    xsetroot -display :1 -solid NavyBlue
    #
    if [ -f ~/.backgroundcolor ]
    then
        xsetroot -display :1 -solid `cat ~/.backgroundcolor`
    fi
    #
    if [ -f ~/.wallpaper ]
    then
        display -display :1 -window root -backdrop ~/.wallpaper
    fi
    #
    # Start fvwm and kill VNC when it dies.
    #
    fvwm2 -display :1  2> /dev/null ; killall Xvnc 2> /dev/null ; \
                                      killall Xrealvnc 2> /dev/null ; \
                                      killall Xtightvnc 2> /dev/null
    #
}
#
# Common viewer procedure
#
vnc_viewer_procedure () {
    #
    # The default password file will be used if available.
    #
    if [ -f $PASSWORD_FILE ]
    then
        #
        dialog --msgbox "There is already a file $PASSWORD_FILE. \
If authentication fails, try to remove it." 0 0
        #
    else
        if ! vncpasswd $PASSWORD_FILE
        then
            #
            dialog --msgbox "The password is not valid, \
I will try with a default one." 0 0
            #
            # Try with default password.
            #
            echo "$ENCRIPTED_PASSWORD" > $PASSWORD_FILE
        fi
    fi
    #
    # Check for arguments.
    #
    if [ "$ARGUMENTS" = "" ]
    then
        #
        # Give address.
        #
        if dialog  \
            --title "remote VNC server address" \
            --inputbox \
                "Please insert the remote VNC server address. \
The connection will be tried at screen \":1\"." \
            0 0 \
            "$VNC_REMOTE_SERVER" \
            2> $TEMPORARY
        then
            ARGUMENTS=`cat $TEMPORARY`
            echo "" > $TEMPORARY
        fi
    fi
    #
    # Save data.
    #
    VNC_REMOTE_SERVER="$ARGUMENTS"
    rm -f /etc/nanoLinux/all/VNC_REMOTE_SERVER
    echo "$VNC_REMOTE_SERVER" > /etc/nanoLinux/all/VNC_REMOTE_SERVER
}
#
# Take/view shared x procedure
#
vnc_viewer_shared_x_procedure () {
    #
    # Default password
    #
    rm -f    $PASSWORD_FILE
    echo "$ENCRIPTED_PASSWORD" > $PASSWORD_FILE
    chmod 0600 $PASSWORD_FILE
    #
    # Check for arguments.
    #
    if [ "$ARGUMENTS" = "" ]
    then
        #
        # Give address.
        #
        if dialog  \
            --title "remote VNC server addresses" \
            --inputbox \
                "Please insert the remote VNC server addresses. \
The connection will be tried at screen \":1\"." \
            0 0 \
            "$VNC_REMOTE_SERVERS" \
            2> $TEMPORARY
        then
            ARGUMENTS=`cat $TEMPORARY`
            echo "" > $TEMPORARY
        fi
    fi
    #
    # Save data.
    #
    VNC_REMOTE_SERVERS="$ARGUMENTS"
    rm -f /etc/nanoLinux/all/VNC_REMOTE_SERVERS
    echo "$VNC_REMOTE_SERVERS" > /etc/nanoLinux/all/VNC_REMOTE_SERVERS
}
#
# Geometry selection.
#
select_geometry () {
    if dialog   \
        --clear \
        --title "geometry" \
        --menu "Select VNC server geometry:" \
        0 0 0 \
        "1024x768"              "default" \
        "1440x1080"             "" \
        "1408x1056"             "" \
        "1376x1032"             "" \
        "1344x1008"             "" \
        "1312x984"              "" \
        "1280x960"              "" \
        "1248x936"              "" \
        "1216x912"              "" \
        "1184x888"              "" \
        "1152x864"              "" \
        "1120x840"              "" \
        "1088x816"              "" \
        "1056x792"              "" \
        "1024x768"              "usual resolution" \
        "992x744"               "" \
        "960x720"               "" \
        "928x696"               "" \
        "896x672"               "" \
        "864x648"               "" \
        "832x624"               "" \
        "800x600"               "old SVGA resolution" \
        "768x576"               "" \
        "736x552"               "" \
        "704x528"               "" \
        "672x504"               "" \
        "640x480"               "old VGA resolution" \
        "608x456"               "" \
        "576x432"               "" \
        "544x408"               "" \
        "512x384"               "" \
        "480x360"               "" \
        2> $TEMPORARY
    then
        SELECTION=`cat $TEMPORARY`
        echo "" > $TEMPORARY
        GEOMETRY="$SELECTION"
    else
        #
        # Set to a default
        #
        GEOMETRY="1024x768"
    fi
}
#
# Write to log.
#
log_vnc_view () {
    logger "User $USER trying to view VNC server $1"
}
log_vnc_control () {
    logger "User $USER trying to control VNC server $1"
}
#
# Start the command selection
#
if [ "$PROGRAM_NAME" = "vncrc" ]
then
    main_menu
fi
#
# Now the program name might be changed.
#
if   [ "$PROGRAM_NAME" = "sharedx" ]
then
    select_geometry
    DEPTH="16"
    start_shared_x
elif [ "$PROGRAM_NAME" = "vncs" ]
then
    select_geometry
    DEPTH="16"
    start_vncs
elif [ "$PROGRAM_NAME" = "vnccx" ]
then
    #
    vnc_viewer_procedure
    #
    # Please note that you cannot put it in background!
    #
    xinit /usr/bin/xvncviewer -fullscreen -passwd $PASSWORD_FILE \
        $VNC_REMOTE_SERVER:1
    #
elif [ "$PROGRAM_NAME" = "vncvx" ]
then
    #
    vnc_viewer_procedure
    #
    log_vnc_view $VNC_REMOTE_SERVER:1
    #
    # Please note that you cannot put it in background!
    #
    xinit /usr/bin/xvncviewer -viewonly -fullscreen -passwd $PASSWORD_FILE \
        $VNC_REMOTE_SERVER:1
    #
elif [ "$PROGRAM_NAME" = "vncc" ]
then
    #
    vnc_viewer_procedure
    #
    log_vnc_control $VNC_REMOTE_SERVER:1
    #
    /usr/bin/xvncviewer -passwd $PASSWORD_FILE $VNC_REMOTE_SERVER:1 &
    #
elif [ "$PROGRAM_NAME" = "vncv" ]
then
    #
    vnc_viewer_procedure
    #
    log_vnc_view $VNC_REMOTE_SERVER:1
    #
    /usr/bin/xvncviewer -viewonly -passwd $PASSWORD_FILE $VNC_REMOTE_SERVER:1 &
    #
elif [ "$PROGRAM_NAME" = "vncsc" ]
then
    select_geometry
    DEPTH="16"
    start_vncs
    xinit /usr/bin/xvncviewer -fullscreen -passwd $PASSWORD_FILE localhost:1
    #
elif [ "$PROGRAM_NAME" = "takesharedx" ]
then
    #
    vnc_viewer_shared_x_procedure
    #
    for a in $ARGUMENTS
    do
        #
        log_vnc_control $a:1
        #
        /usr/bin/xvncviewer -passwd $PASSWORD_FILE "$a:1" -title "$a:1" &
    done
    #
elif [ "$PROGRAM_NAME" = "viewsharedx" ]
then
    #
    vnc_viewer_shared_x_procedure
    #
    for a in $ARGUMENTS
    do
        #
        log_vnc_view $a:1
        #
        /usr/bin/xvncviewer -viewonly -passwd $PASSWORD_FILE "$a:1" \
            -title "$a:1" &
    done
    #
fi

227.11   Conclusione

VNC è un lavoro che ha prodotto diversi filoni di sviluppo, per esigenze differenti. Oltre a quanto descritto in questo capitolo esistono diversi altri programmi che possono essere di un certo interesse. Di tale disponibilità è bene tenerne conto, per sapere che può essere utile una ricerca approfondita prima di organizzare il proprio lavoro in modo sistematico con VNC.

227.12   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) VNC   GNU GPL

2) Svncviewer   GNU GPL


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome x_accesso_remoto_alla_sessione_di_lavoro.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!