[successivo] [precedente] [inizio] [fine] [indice generale] [licenze] [indice analitico] [tomo] [parte]


Capitolo 79.   X: funzionamento e accesso

Con le distribuzioni GNU/Linux normali, dopo la configurazione del servente X, dovrebbe essere sufficiente avviare lo script startx, senza argomenti, per vedere funzionare questo ambiente grafico.

startx[Invio]

Avendo avviato il servente X, vale la pena di provare a cambiare la risoluzione di visualizzazione attraverso la combinazione [Ctrl+Alt+num(+)] («control», «alt», «+ del tastierino numerico») e [Ctrl+Alt+num(-)] («control», «alt», «- del tastierino numerico»).

Per passare dal servente X a una console virtuale, è sufficiente utilizzare la combinazione [Ctrl+Alt+F1], oppure [Ctrl+Alt+F2],... invece del solito [Alt+F n] che non potrebbe funzionare. Il servente X occupa normalmente la posizione della prima console virtuale libera, che solitamente è la settima; per cui si raggiunge con la combinazione [Ctrl+Alt+F7].

Per concludere l'esecuzione del servente X ci sono due modi:

L'interruzione dell'esecuzione del servente X con la combinazione [Ctrl+Alt+Backspace] è il modo più brutale, ma può essere opportuno quando non si vede più nulla, specie quando si è avviato X dopo una configurazione sbagliata.

79.1   Procedura di avvio

Nelle sezioni precedenti si è accennato al modo con cui è possibile avviare e concludere il funzionamento del servente X. Dovrebbe essere chiaro che per avviare X si utilizza normalmente lo script startx, ma questo non è l'unico modo, e in ogni caso, da questo script si articola una struttura piuttosto articolata che è opportuno conoscere.

Il servente grafico è un programma distinto a seconda del tipo di scheda grafica. Teoricamente sarebbe necessario avviare il sistema grafico utilizzando il programma adatto al proprio hardware, in pratica, il sistema di configurazione provvede a creare un collegamento simbolico in modo da poter avviare il servente utilizzando semplicemente il nome X.

Se si avvia semplicemente il servente, utilizzando il nome X oppure quello specifico di una particolare scheda grafica, si ottiene solo una superficie grafica su cui fare scorre il mouse. Per poter fare qualcosa, occorre almeno avere in funzione un programma che consenta di avviarne altri. Occorrono cioè dei clienti.(1)

Per risolvere questo problema si deve utilizzare il programma xinit, attraverso il quale si possono definire alcuni clienti di partenza (per esempio un gestore di finestre), il tipo di servente da utilizzare e le sue opzioni eventuali.

79.1.1   $ xinit

xinit [[cliente]opzioni] [ -- [servente] [stazione_grafica]opzioni]

xinit viene usato per avviare il servente X e un primo programma cliente. Quando questo programma cliente termina la sua esecuzione, xinit invia un segnale di interruzione al servente X e quindi, a sua volta, termina la sua esecuzione.

Se non viene indicato un programma cliente specifico, xinit tenta di avviare il file ~/.xinitrc, che di solito dovrebbe corrispondere a uno script, e se questo manca, tenta di avviare il programma xterm nel modo seguente:

xterm -geometry +1+1 -n -login -display :0

Se non viene indicato un programma servente specifico, xinit tenta di avviare il file ~/.xserverrc, e se questo manca, tenta di avviare il programma X nel modo seguente:

X :0

Quando si vuole fare in modo che il servente X venga avviato inizialmente con un gruppetto di programmi clienti, si fa in modo che xinit utilizzi per questo uno script. Di solito si tratta proprio del file ~/.xinitrc, quello che verrebbe avviato in modo predefinito. All'interno di questo script, i programmi dovrebbero essere avviati sullo sfondo, con la possibile eccezione di quelli che terminano immediatamente la loro funzione. L'ultimo di questi programmi deve funzionare in primo piano (foreground), in modo che la sua conclusione corrisponda con quella dello script stesso.

Di solito, xinit viene avviato senza l'indicazione esplicita di cliente e servente. Se si intende utilizzare questa possibilità, i nomi di questi devono comprendere il percorso per raggiungerli: devono cioè inziare con un punto (.) oppure con una barra obliqua (/). Diversamente non verrebbero riconosciuti come tali, ma come opzioni per il programma cliente o per il programma servente, a seconda che si trovino a sinistra o a destra dei due trattini di separazione (--).

Esempi

xinit

Avvia xinit con i valori predefiniti. In questo modo xinit tenta di avviare il servente X utilizzando il programma o lo script ~/.xinitrc come cliente, oppure il programma xterm in sua mancanza.

xinit -- /usr/X11R6/bin/X86_SVGA

Si richiede a xinit di avviare il servente /usr/X11R6/bin/X86_SVGA. Per quanto riguarda il cliente, si utilizzano i valori predefiniti.

xinit -- -bpp 16

xinit avvia il servente X predefinito, con l'argomento -bpp 16, attraverso cui si richiede una profondità di colori di 16 bit per pixel (216 = 65 535). Per quanto riguarda il cliente, si utilizzano i valori predefiniti.

Interdipendenza

Il modo migliore per verificare cosa accade quando si avvia xinit è quello di verificare l'interdipendenza tra i processi attraverso pstree. Supponendo di avere avviato xinit senza argomenti, e che questo abbia potuto utilizzare lo script ~/.xinitrc, si dovrebbe ottenere uno schema simile a quello seguente:

...---xinit-+-.xinitrc---fvwm-+-FvwmPager
            |                 `-GoodStuff
            `-X

In questo caso si può osservare che ~/.xinitrc avvia il gestore di finestre fvwm che a sua volta si occupa di avviare altre cose.

79.1.2   $ startx

Nella sezione precedente si è visto che è possibile avviare il servente X attraverso xinit. Questo modo potrebbe però risultare scomodo quando si ha la necessità di utilizzare sistematicamente determinati attributi. Il sistema grafico dovrebbe essere avviato attraverso lo script startx, che è predisposto per xinit nel modo più adatto alle esigenze particolari del proprio sistema.

Di solito la distribuzione GNU/Linux fornisce uno script adattato alla sua impostazione, oppure in futuro, lo stesso programma di configurazione di X potrebbe predisporre da solo questo file. In ogni caso, l'amministratore del sistema dovrebbe rivedere questo script ed eventualmente ritoccarlo.

La sintassi di startx, quando si tratta di una versione aderente all'impostazione originale di X, è praticamente uguale a quella di xinit.

startx [[cliente]opzioni] [ -- [servente]opzioni]

startx offre però la possibilità di predisporre delle opzioni predefinite per cliente e servente.

#!/bin/sh

# $XConsortium: startx.cpp,v 1.4 91/08/22 11:41:29 rws Exp $
# $XFree86: xc/programs/xinit/startx.cpp,v 3.0 1994/05/22 00:02:28 dawes Exp $
# 
# This is just a sample implementation of a slightly less primitive 
# interface than xinit.  It looks for user .xinitrc and .xserverrc
# files, then system xinitrc and xserverrc files, else lets xinit choose
# its default.  The system xinitrc should probably do things like check
# for .Xresources files and merge them in, startup up a window manager,
# and pop a clock and several xterms.
#
# Site administrators are STRONGLY urged to write nicer versions.
# 

userclientrc=$HOME/.xinitrc
userserverrc=$HOME/.xserverrc
sysclientrc=/usr/X11R6/lib/X11/xinit/xinitrc
sysserverrc=/usr/X11R6/lib/X11/xinit/xserverrc
clientargs=""
serverargs=""

if [ -f $userclientrc ]; then
    clientargs=$userclientrc
else if [ -f $sysclientrc ]; then
    clientargs=$sysclientrc
fi
fi

if [ -f $userserverrc ]; then
    serverargs=$userserverrc
else if [ -f $sysserverrc ]; then
    serverargs=$sysserverrc
fi
fi

whoseargs="client"
while [ "x$1" != "x" ]; do
    case "$1" in
        /''*|\.*)       if [ "$whoseargs" = "client" ]; then
                    clientargs="$1"
                else
                    serverargs="$1"
                fi ;;
        --)     whoseargs="server" ;;
        *)      if [ "$whoseargs" = "client" ]; then
                    clientargs="$clientargs $1"
                else
                    serverargs="$serverargs $1"
                fi ;;
    esac
    shift
done

xinit $clientargs -- $serverargs

Nell'esempio appena visto, è sufficiente modificare le prime righe per definire delle opzioni predefinite, attribuendo un valore alle variabili clientargs e serverargs. La prima si riferisce alle opzioni per il cliente, la seconda per quelle del servente.

Per esempio, volendo avviare il servente, attraverso startx, con una risoluzione di 16 bit per pixel, basterebbe modificare le prime righe come nell'esempio seguente, in modo da fornire al servente l'opzione -bpp 16.

...
userclientrc=$HOME/.xinitrc
userserverrc=$HOME/.xserverrc
sysclientrc=/usr/X11R6/lib/X11/xinit/xinitrc
sysserverrc=/usr/X11R6/lib/X11/xinit/xserverrc
clientargs=""
serverargs="-bpp 16"
...

Se il funzionamento dello script indicato come esempio non dovesse risultare chiaro, ecco in breve la descrizione delle varie fasi in esso contenute.

  1. Vengono definite delle variabili per le impostazioni predefinite.

  2. Si determina quale script utilizzare per l'avvio dei programmi clienti e quale per l'avvio del servente.

  3. Nel ciclo while, vengono scanditi gli eventuali argomenti utilizzati per avviare startx, e se ne vengono trovati, questi prendono il sopravvento su quelli predefiniti.

  4. Alla fine viene avviato xinit con gli argomenti determinati in base all'elaborazione precedente.

Da quanto visto finora, si può intuire l'importanza dello script ~/.xinitrc. È il mezzo attraverso cui avviare più programmi clienti, ma non solo: esistono programmi che hanno lo scopo di configurare alcune impostazioni del servente X e questo è l'unico posto comodo per metterli in esecuzione in modo automatico. Un esempio di questi programmi è xset.

Interdipendenza

Supponendo di avere avviato startx senza argomenti, si dovrebbe ottenere uno schema simile a quello seguente:

...---startx---xinit-+-.xinitrc---fvwm-+-FvwmPager
                     |                 `-GoodStuff
                     `-X

Come si può osservare, rispetto allo stesso esempio visto nella sezione precedente, si ha startx che avvia xinit che poi provvede al resto.

79.1.3   ~/.xinitrc

Questo script è quello predefinito per l'avvio dei primi programmi clienti di un servente X avviato attraverso il programma xinit.

Per preparare il proprio script personalizzato si può partire da quello predefinito della distribuzione GNU/Linux che dovrebbe trovarsi all'interno di /usr/X11R6/lib/X11/xinit/ (oppure /etc/X11/xinit/). Basta copiarlo nella propria directory personale e cambiargli nome facendolo diventare ~/.xinitrc.

La preparazione di questo script è molto importante, se non altro perché permette di definire il tipo di gestore di finestre che si vuole utilizzare.

Inizialmente occorre concentrarsi nella parte finale, quella che inizia dopo il commento: # start some nice programs. Nel caso in cui il proprio sistema sia stato predisposto originalmente per utilizzare il gestore di finestre fvwm, le ultime righe potrebbero apparire come nell'esempio seguente:

# start some nice programs
xsetroot -solid SteelBlue
fvwm

Il programma xsetroot definisce lo sfondo, in questo caso solo un colore, e quindi termina immediatamente l'esecuzione. Il programma fvwm è il gestore di finestre (window manager) da avviare. Eventualmente, prima di avviare il gestore di finestre si possono indicare altri programmi che si vuole siano già pronti in esecuzione quando si avvia il servente. Per esempio, volendo avviare xclock basterebbe modificare le ultime righe come segue:

# start some nice programs
xsetroot -solid SteelBlue
xclock &
fvwm

figure/fvwm-xinitrc-xclock

Figura 79.1. L'avvio di X con il gestore di finestre fvwm e xclock aperto automaticamente.

In questo caso, xclock viene avviato sullo sfondo perché altrimenti, a differenza di xsetroot, rimarrebbe in funzione fino al ricevimento di un segnale di interruzione, impedendo così l'avvio del gestore di finestre fino al termine del suo funzionamento.

La parte precedente dello script ~/.xinitrc potrebbe apparire come nell'estratto seguente:

#!/bin/sh
# $XConsortium: xinitrc.cpp,v 1.4 91/08/22 11:41:34 rws Exp $

userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
sysresources=/usr/X11R6/lib/X11/xinit/.Xresources
sysmodmap=/usr/X11R6/lib/X11/xinit/.Xmodmap

# merge in defaults and keymaps

if [ -f $sysresources ]; then
    xrdb -merge $sysresources
fi

if [ -f $sysmodmap ]; then
    xmodmap $sysmodmap
fi

if [ -f $userresources ]; then
    xrdb -merge $userresources
fi

if [ -f $usermodmap ]; then
    xmodmap $usermodmap
fi

# start some nice programs
...

79.1.4   ~/.Xmodmap

All'interno dello script ~/.xinitrc si incontrano di solito, tra le altre, le righe seguenti.

usermodmap=$HOME/.Xmodmap

sysmodmap=/usr/X11R6/lib/X11/xinit/.Xmodmap

if [ -f $sysmodmap ]; then
    xmodmap $sysmodmap
fi

if [ -f $usermodmap ]; then
    xmodmap $usermodmap
fi

In pratica, se esiste il file /usr/X11R6/lib/X11/xinit/.Xmodmap, viene eseguito il programma xmodmap utilizzando il suo contenuto, e quindi, se esiste il file ~/.Xmodmap, viene eseguito il programma xmodmap utilizzando il suo contenuto.

xmodmap si occupa di ridefinire la tastiera per l'utilizzo con X. Di solito non è necessario ridefinire la mappa della tastiera, dal momento che questa è già stata indicata all'interno del file di configurazione /etc/XF86Config. Al massimo potrebbe capitare la necessità a livello personale di ridefinire qualcosa per facilitare l'utilizzo di programmi che non riconoscono alcuni tasti o attribuiscono loro un significato diverso da quello che si vorrebbe.

Nella distribuzione GNU/Linux Slackware, il file /usr/X11R6/lib/X11/xinit/.Xmodmap contiene a titolo di esempio la ridefinizione del tasto utilizzato come [Backspace]. In realtà non servirebbe perché X funziona correttamente anche senza questa dichiarazione.

keycode 22 = BackSpace

79.2   Stazioni grafiche virtuali multiple

XFree86 può gestire più di una stazione grafica virtuale simultaneamente, con una modalità d'uso simile a quella delle console virtuali di GNU/Linux. In pratica, è possibile avviare diversi serventi X a cui si abbina un numero di stazione grafica differente. Dal momento che si tratta sempre della stessa macchina fisica, la configurazione non cambia.

L'avvio di più stazioni grafiche virtuali può creare dei problemi con il mouse se il dispositivo corrispondente non consente la lettura simultanea da parte di più processi. Questo è sempre lo stesso problema legato ai mouse bus e si può risolvere utilizzando il demone gpm con l'opzione -R, e facendo poi in modo che XFree86 utilizzi il dispositivo /dev/gpmdata.

Come è stato descritto nelle sezioni precedenti, il sistema grafico viene avviato generalmente attraverso lo script startx, o eventualmente richiamando direttamente il programma xinit. Quando non si specificano opzioni particolari, si intende voler avviare il servente X utilizzando la stazione grafica :0. Questo si traduce in pratica nell'utilizzo della posizione corrispondente alla prima console virtuale libera di GNU/Linux, che di solito è la settima.

Se si vogliono avviare altri serventi X, occorre specificare un diverso numero di stazione grafica, cosa che serve solo a distinguerle. Così, ogni nuovo servente avviato utilizzerà una posizione corrispondente alla prima console virtuale rimasta libera. In pratica, [Ctrl+Alt+F7] dovrebbe permettere di raggiungere la prima di queste stazioni grafiche virtuali, [Ctrl+Alt+F8] la successiva, e così di seguito.

Semplificando quanto mostrato nelle sezioni precedenti, a proposito di xinit e di startx, si può fare riferimento alla sintassi seguente per avviare un servente X.

xinit -- [stazione_grafica] [opzioni]
startx -- [stazione_grafica] [opzioni]

Dopo i due trattini di separazione della parte cliente da quella servente, è possibile indicare il numero della stazione grafica, e subito dopo si possono indicare altre opzioni.

Di solito, si avvia startx (e meno frequentemente si avvia direttamente xinit) senza indicare alcuna stazione grafica, facendo riferimento implicitamente al numero :0. Dopo averne avviato uno con questo numero, non ne possono essere avviati altri con lo stesso, quindi, se si vogliono gestire più serventi contemporaneamente, occorre definire la stazione grafica.

startx -- :1

L'esempio mostrato avvia una copia del servente X utilizzando la stazione grafica :1.

Ci possono essere dei motivi per avviare diversi serventi X simultaneamente; per esempio per avere due o più sessioni funzionanti in qualità di utenti differenti, oppure per poter confrontare il funzionamento in presenza di diverse opzioni del servente, come nel caso seguente, dove si specifica una profondità di colori di 16 bit.

startx -- :2 -bpp 16

È importante tenere a mente che le opzioni del servente, che nell'esempio sono costituite solo da -bpp 16, vanno poste dopo l'indicazione della stazione grafica.

79.3   Definizione dello schermo

Per l'utilizzo normale che si può fare di X non è necessario doversi rendere conto che ogni programma cliente deve specificare lo schermo su cui vuole apparire. Infatti, viene definita automaticamente la variabile di ambiente DISPLAY contenente le coordinate dello schermo predefinito. Modificando eventualmente il contenuto di questa variabile, si cambia l'indicazione dello schermo predefinito per i programmi che verranno avviati ricevendo quel valore.

Generalmente è possibile informare un programma dello schermo su cui questo deve apparire attraverso un argomento standard, -display, descritto nel capitolo 82.

79.4   Accedere allo schermo

Quando si esegue una sessione TELNET, o qualunque altra cosa che permetta di accedere a un sistema remoto, si avvia una procedura di accesso su un altro elaboratore, utilizzando il proprio come terminale o console remota. Quando si utilizza un servente X è possibile condividere lo schermo del proprio monitor. Per farlo occorre autorizzare l'utilizzo del proprio schermo all'elaboratore remoto. Si osservi il comando seguente:

tizio@dinkel.brot.dg:~$ xterm -display :0 &

Si tratta dell'utente tizio, che dall'elaboratore dinkel.brot.dg intende avviare il programma xterm utilizzando lo schermo :0 presso il suo stesso elaboratore locale. Si osservi anche che se l'utente in questione avvia questo comando da una finestra di terminale che si trova già a funzionare sullo schermo :0, il comando

tizio@dinkel.brot.dg:~$ xterm &

significherebbe la stessa cosa, in quanto l'informazione sullo schermo verrebbe ottenuta dalla variabile di ambiente DISPLAY, senza bisogno di utilizzare l'opzione -display.

Questo comando avvia xterm, il quale tenta di connettersi con il servente X che gestisce lo schermo locale :0.0 (abbreviato con :0), allo scopo di poterlo utilizzare: se il servente X si rifiuta, xterm deve rinunciare.

L'autorizzazione ad accedere allo schermo deve essere definita anche per lo stesso utente che ha avviato il servente X; tuttavia, questa autorizzazione viene predisposta inizialmente in modo automatico.

L'autorizzazione all'utilizzo del proprio schermo grafico da parte di programmi in esecuzione su altri elaboratori connessi in rete può avvenire semplicemente in base a un elenco di indirizzi autorizzati, oppure attraverso altre forme di riconoscimento. Qui vengono spiegati solo i modi più semplici e meno sicuri; per avere una visione completa delle possibilità si devono consultare le pagine di manuale X(1), xauth(1) e Xsecurity(1).

È importante non sottovalutare il pericolo di un accesso indesiderato al proprio servente X, in quanto un aggressore preparato può sfruttare questa possibilità per arrivare anche a utilizzare la tastiera. In pratica, un aggressore potrebbe fare tutto quello che gli concedono i privilegi con cui è stato avviato il servente X.

Il metodo più semplice in assoluto per concedere l'accesso al servente X è quello di stabilire attraverso il comando xhost quali sono gli elaboratori che possono accedere. Questo significa implicitamente che tutti gli utenti di questi elaboratori possono accedere. Volendo distinguere tra gli utenti, occorre utilizzare almeno il metodo delle chiavi in chiaro (MIT-MAGIC-COOKIE-1).

Per attuare in pratica questo secondo meccanismo, viene utilizzato un file di configurazione personale, ~/.Xauthority, nel quale sono elencati degli indirizzi di serventi X e le chiavi di accesso relative. Questo file non è leggibile direttamente; tuttavia, a titolo di esempio, potrebbe contenere le informazioni seguenti, che si riferiscono all'utente tizio presso il solito elaboratore dinkel.brot.dg:

dinkel/unix:0  MIT-MAGIC-COOKIE-1  0f207ef0f71e2490b0648c26ed4f3e41
dinkel.brot.dg:0  MIT-MAGIC-COOKIE-1  0f207ef0f71e2490b0648c26ed4f3e41

Questo contenuto determina che il servente X, avviato dall'utente a cui appartiene questo file, accetta connessioni locali (attraverso un socket di dominio UNIX) e connessioni remote, attraverso la tecnica del MIT-MAGIC-COOKIE-1, quando chi accede fornisce la chiave di riconoscimento 0f207ef0f71e2490b0648c26ed4f3e41. In questo caso, la chiave è la stessa, sia per le connessioni locali che per quelle attraverso la rete, ma potrebbero essere diverse; quello che conta è che il cliente sia in grado di fornire la chiave giusta in base al tipo di connessione che effettua con il servente.

Per fare in modo che il cliente sappia quale chiave utilizzare, occorre che l'utente che tenta di accedere al servente X abbia un file ~/.Xauthority contenente un record adatto. In pratica, se l'utente caio vuole accedere, deve avere il record

dinkel/unix:0  MIT-MAGIC-COOKIE-1  0f207ef0f71e2490b0648c26ed4f3e41

nel caso questo avvenga nell'ambito dello stesso elaboratore locale, oppure il record

dinkel.brot.dg:0  MIT-MAGIC-COOKIE-1  0f207ef0f71e2490b0648c26ed4f3e41

nel caso debba accedere da un altro elaboratore.

Lo stesso utente che ha avviato il servente X deve essere autorizzato, e il suo file ~/.Xauthority serve ad autorizzare se stesso, e a imporre agli altri la chiave di accesso.

Si può comprendere meglio il meccanismo della chiave di riconoscimento MIT-MAGIC-COOKIE-1, solo se si pensa allo scopo che ha: una persona può avere la possibilità di accedere a più elaboratori di una stessa rete locale, e le utenze relative potrebbero anche corrispondere a nominativi-utente distinti, a seconda dell'elaboratore. Questa persona può avere la necessità di accedere a uno di questi elaboratori, attraverso la rete, avviando lì un programma che però deve apparire presso la stazione da cui sta operando. In altri termini, quando c'è la necessità di avviare un programma che deve apparire sullo schermo di un altro elaboratore, di solito si tratta di utenze che appartengono alla stessa persona fisica; in questo senso non c'è nulla di strano se tutte queste utenze condividono la stessa chiave.

Per la precisione, nel caso di due utenti che appartengono allo stesso elaboratore, il record che descrive la chiave di accesso locale deve essere identico per entrambi. Di conseguenza, la condivisione di questo implica che il servente X avviato da uno di questi due è anche accessibile dall'altro.

Dal momento che il file ~/.Xauthority non è un file di testo normale, per accedervi, si utilizza generalmente il programma xauth.

79.4.1   $ xauth

xauth [opzioni] [comando   argomento ...]

xauth è il programma necessario per poter accedere alle informazioni contenute nei file di autorizzazione, normalmente ~/.Xauthority, e per poterle modificare. Per la maggior parte delle situazioni, xauth non ha bisogno di contattare il servente X.

xauth interviene in base a dei comandi, che gli possono essere impartiti come argomenti della stessa riga di comando, nella parte finale, oppure in modo interattivo, attraverso l'invito seguente:

xauth>

Spesso, i comandi richiedono l'indicazione di un file. In quella occasione, se si utilizza un trattino singolo (-), questo viene inteso come lo standard input, oppure lo standard output, a seconda del contesto.

Alcune opzioni
-f  file_di_autorizzazione

Permette di accedere a un file di autorizzazioni differente da quello standard, che di solito è ~/.Xauthority.

-b

L'accesso al file delle autorizzazioni è regolato attraverso un file di lock, che alle volte potrebbe rimanere presente senza che ce ne sia più bisogno. Eccezionalmente, e con prudenza, si può utilizzare questa opzione per forzare il blocco ed eliminare il file di lock relativo.

Alcuni comandi

I comandi di xauth possono essere impartiti in modo interattivo, oppure possono essere indicati come argomenti finali della riga di comando di xauth.

add  stazione_grafica   protocollo   chiave_esadecimale

Questo comando serve ad aggiungere manualmente un record nel file di autorizzazione. Deve essere specificata: la stazione grafica, ovvero un indirizzo che non arriva a specificare anche lo schermo (in caso contrario questa informazione viene ignorata semplicemente); il tipo di protocollo, che può anche essere abbreviato con un punto singolo (.), nel caso si tratti del tipo MIT-MAGIC-COOKIE-1; la chiave esadecimale, ovvero una stringa composta da un numero pari di cifre esadecimali, senza alcun prefisso.

list [stazione_grafica ...]

Permette di visualizzare i record del file di autorizzazione, limitandosi alle stazioni grafiche indicate. Se queste non sono specificate, il comando mostra l'elenco completo.

info

Permette di conoscere alcune informazioni generali sul file di autorizzazione.

extract  file[stazione_grafica ...]
nextract  file   stazione_grafica ...

Questo comando permette di estrarre alcuni record dal file delle autorizzazioni, corrispondenti alle stazioni grafiche indicate. Il risultato viene accumulato nel file indicato come primo argomento di questo comando. Nel primo caso, con extract, le informazioni vengono memorizzate in forma binaria, mentre nel secondo, con nextract, queste informazioni sono convertite in forma testuale.

merge  file
nmerge  file

Questo comando consente di acquisire nel file di autorizzazione i record contenuti nel file indicato. Questi record vanno a sostituire quelli corrispondenti, riferiti alle stesse stazioni grafiche che dovessero essere già presenti nel proprio file di autorizzazione. Anche in questo caso vale la differenza per cui merge si aspetta di attingere i record da un file binario, mentre nmerge utilizza un file di testo normale.

remove  stazione_grafica ...

Elimina i record specificati attraverso l'indicazione delle stazioni grafiche relative.

exit
quit

Questi due comandi riguardano il funzionamento interattivo di xauth. Con exit viene concluso il funzionamento del programma, salvando le modifiche; con quit, si ottiene una conclusione senza salvare.

Esempi

tizio@dinkel.brot.dg:~$ xauth add :0 . 12345678

L'utente aggiunge, o modifica, il record di autorizzazione riferito all'accesso locale, specificando per questo il protocollo MIT-MAGIC-COOKIE-1 in modo predefinito, attraverso il punto, e indicando una stringa esadecimale molto semplice: 1234567816.

tizio@dinkel.brot.dg:~$ extract /tmp/prova :0

Estrae una copia del record di autorizzazione all'accesso locale, e la salva nel file /tmp/prova.

caio@dinkel.brot.dg:~$ merge /tmp/prova :0

Un altro utente, si appropria dei record contenuti nel file /etc/prova.

tizio@roggen.brot.dg:~$ xauth extract - $DISPLAY; | (segue)
  rsh dinkel.brot.dg xauth merge -

L'utente tizio che sta utilizzando l'elaboratore roggen.brot.dg ottiene attraverso rsh di aggiungere al proprio file di autorizzazione remoto, quello presso la sua utenza corrispondente nell'elaboratore dinkel.brot.dg, il record riferito al servente X che sta utilizzando in quel momento. In altri termini, fa in modo di poter avviare dei programmi presso l'elaboratore remoto, utilizzando la stazione grafica su cui si trova. Si osservi l'uso della variabile di ambiente DISPLAY per ottenere l'indicazione precisa dello schermo che sta utilizzando, e anche l'uso del trattino per collegare i due programmi attraverso i flussi standard.

79.4.2   $ mcookie

mcookie

mcookie è un programma molto semplice, il cui scopo è quello di generare un numero esadecimale, più o meno casuale, convertito in stringa, che viene emesso attraverso lo standard output. La sua utilità sta solo nel facilitare la generazione di chiavi per il sistema di autorizzazione. In pratica, la situazione più comune in cui viene utilizzato è il comando seguente:

xauth add :0 . `mcookie`

In pratica, ci si risparmia di decidere la chiave.

79.4.3   Riepilogo sull'utilizzo del file di autorizzazione

Il file di autorizzazione è composto da record contenenti tre informazioni: la stazione grafica (senza il dettaglio dello schermo), il nome di un protocollo di autenticazione, e una chiave, il cui significato varia a seconda del tipo di protocollo utilizzato.

È importante sottolineare che può esistere un solo record per stazione grafica, per cui, ogni volta che si aggiunge un record per una certa stazione, questo va a sostituire un altro record eventuale riferito alla stessa stazione.

In generale, si distingue tra la stazione grafica locale, a cui si accede senza passare per la rete, e le stazioni grafiche remote, che contengono anche l'indicazione del nome del nodo. Tra le stazioni remote ci può essere anche quella locale, indicata secondo il punto di vista della rete.

Perché possa avvenire una connessione tra un programma cliente e un servente X, è necessario che il record di autorizzazione a cui può accedere il cliente, riferito al servente X in questione, sia identico a quello corrispondente del servente X.

Il sistema di autorizzazione di X sembra fatto perché le chiavi siano cambiate spesso. In generale, si cerca di sistemare l'autorizzazione sempre solo nel momento in cui ne esiste il bisogno, e subito dopo sarebbe bene cambiare la chiave di autorizzazione.

79.4.4   $ xhost

xhost [[+|-]nome ...]
xhost [+|-]

xhost permette di aggiungere o togliere nomi dalla lista di elaboratori e utenti a cui è concesso di utilizzare lo schermo grafico, senza utilizzare forme di autenticazione. Se non vengono utilizzati argomenti, xhost emette un messaggio informando sullo stato attuale del controllo degli accessi. I nomi indicati nella sintassi di xhost hanno una struttura particolare:

famiglia : indirizzo

in pratica, per le connessioni su reti IPv4 si utilizza la famiglia inet.

Le funzionalità di X non sono sempre presenti su tutte le piattaforme. In questo caso particolare, potrebbe darsi che non sia possibile regolare gli accessi ai singoli utenti.

Se si vuole concedere sistematicamente l'accesso a qualche nodo, conviene inserire i comandi necessari all'interno del file ~/.xinitrc in modo che siano eseguiti ogni volta all'avvio del servente X.

Opzioni
+

L'accesso è consentito a tutti.

-

L'accesso è consentito solo agli elaboratori e agli utenti inclusi nell'elenco di quelli autorizzati.

[+]nome

Il nome indicato -- può trattarsi di un elaboratore o di un utente di un elaboratore -- è autorizzato a utilizzare lo schermo. Il segno + iniziale è facoltativo.

- nome

Il nome indicato -- può trattarsi di un elaboratore o di un utente di un elaboratore -- non è autorizzato a utilizzare lo schermo. Le connessioni in corso non vengono interrotte, ma le nuove connessioni vengono impedite.

Esempi

xhost +

Autorizza chiunque ad accedere.

xhost -

Limita la possibilità di accesso ai soli nomi inseriti nell'elenco di elaboratori e utenti autorizzati.

xhost +inet:roggen.brot.dg

Consente all'elaboratore roggen.brot.dg di accedere al servente grafico.

xhost -inet:roggen.brot.dg

Elimina l'elaboratore roggen.brot.dg dalla lista di quelli a cui è consentito accedere.

79.4.5   $ xon

xon  host_remoto[opzioni] [comando]

xon esegue un comando in un elaboratore remoto utilizzando rsh, facendo in modo che venga utilizzato il servente X locale. Si tratta in pratica di un modo abbreviato per eseguire un'applicazione remota senza la necessità di utilizzare la solita opzione -display.(2)

Se attraverso gli attributi non viene indicato alcun comando da eseguire, xon tenta di avviare xterm -ls, in pratica una sessione xterm di login.

xon è in grado di funzionare solo quando l'elaboratore remoto è configurato in modo da consentire le connessioni remote attraverso rsh senza richiedere alcun tipo di riconoscimento. Sotto questo aspetto, xon è limitato all'utilizzo nelle reti chiuse in cui esiste un serio rapporto di fiducia tra le persone che vi accedono.

Alcune opzioni
-access

Prima di eseguire il comando indicato, utilizza xhost nel tentativo di autorizzare l'elaboratore remoto a utilizzare il proprio servente X. In effetti, lo scopo di xon è quello di facilitare l'esecuzione di programmi remoti ma con un I/O locale, cioè attraverso il servente X con il quale si interagisce.

-debug

Quando xon viene avviato attraverso una finestra di terminale, utilizzando questa opzione si riceve lo standard output e lo standard error. In tal modo si possono conoscere eventuali segnalazioni di errore e qualunque altro output normale.

Esempi

xon roggen.brot.dg -access /usr/X11R6/bin/xcalc

Avvia il programma xcalc nell'elaboratore roggen.brot.dg e utilizza il servente X locale. Prima di farlo, avvia xhost per consentire all'elaboratore remoto di accedere al proprio servente X.

79.5   Tipi di carattere -- fonti

In base a quanto indicato nel file di configurazione /etc/XF86Config nella sezione Files, i tipi di carattere utilizzati da X sono collocati nelle directory successive a /usr/X11R6/lib/X11/fonts/. All'interno di queste directory si trovano una serie di file contenenti le varie fonti tipografiche e i loro nomi sono contenuti negli elenchi fonts.dir.

Il nome di una fonte tipografica è strutturato in un modo altamente descrittivo. Segue un esempio che viene scomposto.(3)

-b&h-lucidatypewriter-medium-r-normal-sans-8-80-75-75-m-50-iso8859-1

79.6   XFree86 e l'uso senza dispositivo di puntamento

L'utilizzo del sistema grafico senza mouse, o senza un dispositivo equivalente, può essere importante in condizioni di emergenza, o comunque quando il tipo di mouse che si ha a disposizione potrebbe risultare più scomodo che altro.

I serventi grafici di XFree86 offrono queste funzionalità attraverso il tastierino numerico, dopo aver attivato le estensioni della tastiera. Perché ciò sia possibile è necessario che nel file di configurazione sia commentata l'istruzione

#    XkbDisable

come si vede in questo esempio, oppure che sia assente del tutto. Per abilitare l'uso del tastierino numerico in modo che possa sostituirsi al mouse occorre utilizzare la combinazione [Ctrl+Shift+BlocNum] («control», «maiuscole», «blocco-numeri»). Se la combinazione riesce si ottiene una segnalazione sonora (se si ripete la combinazione si disabilita l'uso del tastierino).

Da quel momento, si possono utilizzare i tasti [num(4)], [num(8)], [num(6)] e [num(2)], per spostare il puntatore rispettivamente verso sinistra, in alto, a destra e in basso. Inoltre, si possono usare anche i tasti [num(7)], [num(9)], [num(3)] e [num(1)], per ottenere degli spostamenti obliqui. Questi spostamenti sono piuttosto lenti in condizioni normali; per accelerarli, mentre si tiene premuto il tasto che si riferisce alla direzione scelta, si può premere e rilasciare immediatamente un altro tasto, scegliendolo in modo tale che in quel momento non abbia un significato particolare; probabilmente la cosa migliore è usare per questo il tasto delle maiuscole: [Shift].

Per emulare i tasti del mouse si utilizzano gli altri tasti del tastierino numerico: [num(5)] corrisponde a un clic; [num(+)] corrisponde a un clic doppio; [num(0)] rappresenta la pressione di un tasto senza rilasciarlo; [num(.)] rilascia il tasto del mouse. In condizioni normali, ciò corrisponde al primo tasto del mouse, ma si può specificare precisamente il tasto attraverso una combinazione con i tasti [num(/)], [num(*)] e [num(-)], che rappresentano rispettivamente il primo, il secondo (quello centrale) e il terzo tasto del mouse. Per esempio, [num(*)+num(5)] corrisponde a un clic con il tasto centrale del mouse.

Combinazione Effetto
Ctrl+Shift+BlocNum Abilita o disabilita l'emulazione del mouse da tastiera.
num(4) Sposta il puntatore a sinistra.
num(7) Sposta il puntatore a sinistra e in alto.
num(8) Sposta il puntatore in alto.
num(9) Sposta il puntatore a destra e in alto.
num(6) Sposta il puntatore a destra.
num(3) Sposta il puntatore a destra e in basso.
num(2) Sposta il puntatore in basso.
num(1) Sposta il puntatore a sinistra e in basso.
num(5) Clic con il primo tasto.
num(/)+num(5) Clic con il primo tasto.
num(*)+num(5) Clic con il secondo tasto.
num(-)+num(5) Clic con il terzo tasto.
num(+) Clic doppio con il primo tasto.
num(/)+num(+) Clic doppio con il primo tasto.
num(*)+num(+) Clic doppio con il secondo tasto.
num(-)+num(+) Clic doppio con il terzo tasto.
num(0) Mantiene premuto il primo tasto.
num(/)+num(0) Mantiene premuto il primo tasto.
num(*)+num(0) Mantiene premuto il secondo tasto.
num(-)+num(0) Mantiene premuto il terzo tasto.
num(.) Rilascia il primo tasto.
num(/)+num(.) Rilascia il primo tasto.
num(*)+num(.) Rilascia il secondo tasto.
num(-)+num(.) Rilascia il terzo tasto.

Tabella 79.1. Comandi per l'emulazione del mouse con XFree86.

XFree86, dopo un po' di tempo in cui non si utilizza più il tastierino numerico in sostituzione del mouse, ne disabilita l'emulazione in modo automatico.

79.7   Riferimenti

Appunti di informatica libera 2001.01.30 --- Copyright © 2000-2001 Daniele Giacomini --  daniele @ swlibero.org

1) Se si vuole provare a vedere cos'è un servente X senza clienti basta avviare X. Come già spiegato in precedenza, è sempre possibile uscire con la combinazione [Ctrl+Alt+Backspace].

2) Prima di utilizzare xon è indispensabile sapere gestire rsh.

3) Le fonti tipografiche di X servono solo per la rappresentazione di testo sullo schermo. In pratica, non sono utili per la stampa.


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome x_funzionamento_e_accesso.html

[successivo] [precedente] [inizio] [fine] [indice generale] [licenze] [indice analitico] [tomo] [parte]