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


Capitolo 217.   X: funzionamento e accesso

Con le distribuzioni GNU 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 +] («control», «alt», «+ del tastierino numerico») e [Ctrl Alt -] («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 Fn] 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.

217.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 (anche se non è l'unico modo possibile), dal quale si sviluppa una struttura piuttosto articolata che è opportuno conoscere.

Quando sono disponibili diversi serventi grafici distinti a seconda del tipo di adattatore grafico, si crea un collegamento simbolico in modo da poter avviare il servente giusto utilizzando semplicemente il nome X. In pratica, dovrebbe essere il programma di configurazione stesso che provvede a sistemare questa cosa.

Se si avvia semplicemente il servente, utilizzando il nome X oppure quello specifico di un adattatore grafico particolare, si ottiene solo una superficie grafica su cui fare scorrere 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.

217.1.1   Utilizzo di «xinit»

Il programma 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.

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

Se non viene indicato un programma cliente specifico, xinit tenta di avviare il file ~/.xinitrc, che di solito dovrebbe corrispondere a uno script; 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; 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 cliente e servente devono comprendere il percorso per raggiungerli: devono cioè iniziare 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 (--). Segue la descrizione di alcuni esempi.

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 si dovrebbe ottenere uno schema simile a quello seguente:

...---xinit-+-Xorg
            `-xterm---sh

In questo caso si può osservare che xinit avvia il terminale grafico xterm, che a sua volta avvia una shell.

217.1.2   Utilizzo di «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 le distribuzioni GNU forniscono uno script adattato alla loro impostazione, oppure, 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]

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

#!/bin/sh

# $Xorg: startx.cpp,v 1.3 2000/08/17 19:54:29 cpqbld 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 serveral xterms.
#
# Site administrators are STRONGLY urged to write nicer versions.
#
# $XFree86: xc/programs/xinit/startx.cpp,v 3.7 2001/04/19 15:08:32 dawes Exp $

userclientrc=$HOME/.xinitrc
userserverrc=$HOME/.xserverrc
sysclientrc=/usr/lib/X11/xinit/xinitrc
sysserverrc=/usr/lib/X11/xinit/xserverrc
defaultclient=/usr/bin/X11/xterm
defaultserver=/usr/bin/X11/X
defaultclientargs=""
defaultserverargs=""
clientargs=""
serverargs=""

if [ -f $userclientrc ]; then
    defaultclientargs=$userclientrc
elif [ -f $sysclientrc ]; then
    defaultclientargs=$sysclientrc
fi

if [ -f $userserverrc ]; then
    defaultserverargs=$userserverrc
elif [ -f $sysserverrc ]; then
    defaultserverargs=$sysserverrc
fi

whoseargs="client"
while [ x"$1" != x ]; do
    case "$1" in
# extraneous null string required to keep cpp from treating "/*" as a C comment
    /''*|\.*)
        if [ "$whoseargs" = "client" -a x"$clientargs" = x ]; then
            client="$1"
        elif [ x"$serverargs" = x ]; then
            server="$1"
        fi
        ;;
    --)
        whoseargs="server"
        ;;
    *)
        if [ "$whoseargs" = "client" ]; then
            clientargs="$clientargs $1"
        else
            # display must be the FIRST server argument
            if [ x"$serverargs" = x ] && expr "$1" : '^:[0-9]\+$' > /dev/null 2>&1; then
                display=$1
            else
                serverargs="$serverargs $1"
            fi
        fi
        ;;
    esac
    shift
done

# process client arguments
if [ x"$client" = x ]; then
    # if no client arguments either, use rc file instead
    if [ x"$clientargs" = x ]; then
        if [ -f $userclientrc ]; then
            client=$userclientrc
        elif [ -f $sysclientrc ]; then
            client=$sysclientrc
        fi
    else
        client=$defaultclient
    fi
fi

# process server arguments
if [ x"$server" = x ]; then
    # if no server arguments or display either, use rc file instead
    if [ x"$serverargs" = x -a x"$display" = x ]; then
        if [ -f $userserverrc ]; then
            server=$userserverrc
        elif [ -f $sysserverrc ]; then
            server=$sysserverrc
        fi
    else
        server=$defaultserver
    fi
fi

if [ x"$XAUTHORITY" = x ]; then
    export XAUTHORITY=$HOME/.Xauthority
fi

removelist=

# set up default Xauth info for this machine

authdisplay=${display:-:0}
mcookie=`mcookie`
for displayname in $authdisplay `hostname -f`$authdisplay; do
    if ! xauth list "$displayname" | grep "$displayname " >/dev/null 2>&1; then
        xauth add $displayname . $mcookie
        removelist="$displayname $removelist"
    fi
done

xinit $client $clientargs -- $server $display $serverargs

if [ x"$removelist" != x ]; then
    xauth remove $removelist
fi

if command -v deallocvt > /dev/null 2>&1; then
    deallocvt
fi

Nell'esempio appena visto, sarebbe 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/pixel, basterebbe modificare le prime righe come nell'esempio seguente, in modo da fornire al servente l'opzione -depth 16.

userclientrc=$HOME/.xinitrc
userserverrc=$HOME/.xserverrc
sysclientrc=/usr/lib/X11/xinit/xinitrc
sysserverrc=/usr/lib/X11/xinit/xserverrc
defaultclient=/usr/bin/X11/xterm
defaultserver=/usr/bin/X11/X
defaultclientargs=""
defaultserverargs=""
clientargs=""
serverargs="-depth 16"

Tuttavia, si scorge facilmente la possibilità di usare dei file di configurazione generali per tutto il sistema:

sysclientrc=/usr/lib/X11/xinit/xinitrc
sysserverrc=/usr/lib/X11/xinit/xserverrc

Pertanto, la possibilità di modificare direttamente lo script è da considerare solo come ultima risorsa.

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; se ne vengono trovati, questi prendono il sopravvento su quelli predefiniti.

  4. Se ci sono argomenti vengono utilizzati, altrimenti si fa riferimento al contenuto dei file di configurazione.

  5. Se non è definita la variabile di ambiente XAUTHORITY, questa viene creata inserendovi il contenuto del file ~/.Xauthority.

  6. Definisce l'autorizzazione all'accesso alla stazione grafica (display) attraverso una stringa generata in modo casuale, con il programma mcookie.

  7. Avvia xinit con gli argomenti determinati in base all'elaborazione precedente.

  8. Al termine del funzionamento di xinit, elimina l'autorizzazione concessa precedentemente.

  9. Infine, viene liberata la memoria usata per l'utilizzo della console virtuale in cui prima si collocava il sistema grafico.

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.

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

...---startx---xinit-+-Xorg
                     `-twm

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

217.1.3   Script «~/.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 che dovrebbe trovarsi all'interno di /usr/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.

Un tempo, il file predefinito era piuttosto complesso, includendo la procedura di autorizzazione all'accesso per la stazione grafica. Recentemente le cose sono cambiate e il problema di questa autorizzazione è stato spostato nello script startx. Pertanto, se verso la fine del file si incontra un commento del tipo # start some nice programs, si possono aggiungere dei comandi solo dopo quel punto; diversamente, se il file non contiene nulla di particolare, lo si può semplicemente scrivere da zero. L'esempio seguente si riferisce a un'impostazione recente, in cui il file ~/.xinitrc può limitarsi a contenere solo ciò che serve direttamente all'utente finale:

#!/bin/sh
xsetroot -solid SteelBlue
exec twm

Il programma xsetroot definisce lo sfondo, in questo caso solo un colore, quindi termina immediatamente l'esecuzione. Il programma twm è il gestore di finestre (window manager) da avviare; in particolare si usa il comando exec allo scopo di rimpiazzare la shell. 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 -geometry +0+0 &
exec twm

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.(2)

Si deve ricordare che si tratta di uno script, pertanto occorre che gli siano attribuiti i permessi necessari di esecuzione.

217.1.4   Configurazione globale e sequenza di script

Quando si vuole fare in modo che si possa mettere in funzione il sistema grafico X senza costringere gli utenti a predisporre la loro personalizzazione tramite il file ~/.xinitrc, si deve essere in grado di risalire alla configurazione generale. In questo senso, ogni distribuzione GNU potrebbe avere una propria politica e questo rischia di complicare le cose. Qui viene proposta una situazione, ma in pratica ognuno deve rifare una propria ricerca.

Si parte dallo script startx per determinare la collocazione dei file di configurazione predefiniti:

userclientrc=$HOME/.xinitrc
userserverrc=$HOME/.xserverrc
sysclientrc=/usr/lib/X11/xinit/xinitrc
sysserverrc=/usr/lib/X11/xinit/xserverrc
defaultclient=/usr/bin/X11/xterm
defaultserver=/usr/bin/X11/X

In questo caso, si intende intuitivamente che:

Tuttavia, dal momento che gli script /usr/lib/X11/xinit/xinitrc e /usr/lib/X11/xinit/xserverrc servono in pratica alla configurazione del sistema grafico, è normale che la loro collocazione reale sia invece nella directory /etc/X11/xinit/, dove i nomi di origine corrispondono soltanto a dei collegamenti simbolici. Nello stesso modo, il file /usr/bin/X11/X che rappresenta il servente predefinito, dovrebbe essere un programma che si limita ad avviare a sua volta il file /etc/X11/X, che a sua volta dovrebbe essere un altro collegamento simbolico che punta all'eseguibile corretto (di solito /usr/bin/X11/Xorg).

Giunti a questo punto conviene dare un'occhiata ai file /usr/lib/X11/xinit/xinitrc e /usr/lib/X11/xinit/xserverrc, ovvero a /etc/X11/xinit/xinitrc e /etc/X11/xinit/xserverrc. Il file xinitrc potrebbe presentarsi così:

#!/bin/sh
# $Xorg: xinitrc.cpp,v 1.3 2000/08/17 19:54:30 cpqbld Exp $

# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

# invoke global X session script
. /etc/X11/Xsession

In questo caso, si vede che viene letto il contenuto del file /etc/X11/Xsession e trattato come una prosecuzione dello script stesso. Attraverso questo script ulteriore, si fanno poi una serie di altre operazioni, con cui si configura in pratica ciò che viene così definito come sessione.

Il sistema grafico X può essere usato senza doversi prendere cura della configurazione della sessione. In pratica, si ottiene questo usando il file ~/.xinitrc personalizzato, perché in tal modo si esclude l'uso dello script xinitrc globale, senza il quale non si attiva lo script Xsession. Tuttavia, se si vogliono usare convenientemente quelli che sono definiti come gestori di sessione (per esempio Gnome o KDE, che si collocano al di sopra dei comuni gestori di finestre), non si può evitare il passaggio per lo script Xsession.

Senza entrare nel dettaglio dello script Xsession, vale la pena di annotare che questo, se lo trova, utilizza anche il file ~/.Xsession, nel caso un utente volesse definire l'utilizzo di un gestori di sessione diverso da quello predefinito.

Volendo dare un'occhiata allo script xserverrc, si potrebbe trovare un contenuto simile a quello seguente:

#!/bin/sh
exec /usr/bin/X11/X -dpi 100 -nolisten tcp

In pratica, si avvia il file /usr/bin/X11/X (/usr/bin/X11/X), che, come già descritto, dovrebbe corrispondere in pratica a un collegamento simbolico riferito a /etc/X11/X, il quale, a sua volta, dovrebbe essere un collegamento che punta al servente adatto per il proprio elaboratore.

In questo caso particolare, si vede che, per motivi di sicurezza, sono inibite espressamente le comunicazioni di rete attraverso il protocollo TCP/IP, con l'opzione -nolisten tcp. Pertanto, un utente che volesse abilitarle, dovrebbe scrivere il proprio file ~/.xserverrc, senza l'uso di questa opzione.

217.2   Privilegi per il funzionamento di un servente grafico

Esiste un particolare importante a proposito del funzionamento di un servente: per poter svolgere il suo compito deve poter accedere a certe risorse disponendo di privilegi adeguati. Perché ciò avvenga e sia consentito l'uso da parte di utenti comuni, è necessario che l'eseguibile che lo rappresenta abbia i permessi necessari a renderlo capace di questo. In pratica deve appartenere all'utente root e avere il bit SUID attivo (SUID-root). Generalmente, il file /usr/bin/X11/X è un programma che ottiene tali privilegi e si occupa di avviare il collegamento /etc/X11/X. L'esempio seguente mostra i permessi di questo file:

ls -l /usr/bin/X11/X[Invio]

-rwsr-sr-x    1 root     root         7400 gen 29 18:35 /usr/bin/X11/X

In questo modo, l'utente comune non può avviare direttamente l'eseguibile del servente grafico che preferisce, ma deve limitarsi a usare X.

217.3   Stazioni grafiche virtuali multiple

X può gestire più di una stazione grafica virtuale simultaneamente, con una modalità d'uso simile a quella delle console virtuali di un sistema 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, facendo poi in modo che X 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. In un sistema GNU/Linux, ciò si traduce in pratica nell'utilizzo della posizione corrispondente alla prima console virtuale disponibile, 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 va a utilizzare 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[Invio]

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 -depth 16[Invio]

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

217.4   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 vengono avviati ricevendo quel valore.

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

217.5   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 &[Invio]

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 seguente significherebbe la stessa cosa, in quanto l'informazione sullo schermo verrebbe ottenuta dalla variabile di ambiente DISPLAY, senza bisogno di utilizzare l'opzione -display:

tizio@dinkel.brot.dg:~$ xterm &[Invio]

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, attraverso startx, oppure uno degli altri script coinvolti.

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, sia per quelle attraverso la rete, ma potrebbero essere diverse; ciò 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 seguente nel caso questo avvenga nell'ambito dello stesso elaboratore locale:

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

Oppure, gli serve il record successivo nel caso debba accedere da un altro elaboratore:

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

Lo stesso utente che ha avviato il servente X deve essere autorizzato, attraverso il proprio file ~/.Xauthority che serve per questo scopo, imponendo 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, ma 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.

217.5.1   Utilizzo di «xauth»

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

xauth [opzioni] [comando argomento...]

Il programma 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.

Tabella 217.15. Alcune opzioni.

Opzione Descrizione
-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 lucchetto (lock file), 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 lucchetto (lock file) relativo.

Tabella 217.16. 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.

Comando Descrizione
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.

Segue la descrizione di alcuni esempi.

217.5.2   Utilizzo di «mcookie»

Il programma mcookie ha lo scopo di generare un numero esadecimale, più o meno casuale, convertito in stringa, che viene emesso attraverso lo standard output:

mcookie

La sua utilità sta solo nel facilitare la generazione di chiavi per il sistema di autorizzazione. La situazione più comune in cui viene utilizzato è il comando seguente, dove in pratica ci si risparmia di decidere la chiave:

xauth add :0 . `mcookie`[Invio]

217.5.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; 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, ma subito dopo sarebbe bene cambiare la chiave di autorizzazione.

217.5.4   Utilizzo di «xhost»

Il programma xhost permette di aggiungere o togliere nomi dalla lista di elaboratori e utenti a cui è concesso di utilizzare lo schermo grafico, senza la richiesta di altre forme di autenticazione:

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

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.

Tabella 217.17. Alcune opzioni.

Opzione Descrizione
+
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.

Segue la descrizione di alcuni esempi.

217.5.5   Utilizzo di «xon»

xon esegue un comando in un elaboratore remoto attraverso rsh, facendo in modo che venga utilizzato il servente X locale:

xon nodo_remoto [opzioni] [comando]

Si tratta in pratica di un modo abbreviato per eseguire un'applicazione remota senza la necessità di utilizzare la solita opzione -display.(3)

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.

Tabella 217.18. Alcune opzioni.

Opzione Descrizione
-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.

L'esempio seguente mostra l'avvio del programma xcalc nell'elaboratore roggen.brot.dg, utilizzando il servente X locale. Prima di farlo, xon avvia xhost per consentire all'elaboratore remoto di accedere al proprio servente X.

xon roggen.brot.dg -access /usr/bin/X11/xcalc[Invio]

217.6   Accedere allo schermo con Secure Shell

Secure Shell (capitolo 400) facilita le connessioni remote, gestendo in modo automatico tutto il procedimento di autorizzazione all'accesso al proprio schermo. Per arrivare a questo risultato, è comunque necessario abilitare tale funzionalità nella configurazione: sia dalla parte del servente, sia dalla parte del cliente.

Nel file di configurazione del servente Secure Shell, è necessario trovare queste direttive:

X11Forwarding yes
X11DisplayOffset 10

Nel file di configurazione del cliente Secure Shell, è necessario trovare queste direttive:

Host *
    ForwardX11 yes

Così facendo, una volta aperta una finestra di terminale, ci si può collegare all'elaboratore remoto usando il cliente Secure Shell, come nell'esempio seguente:

tizio$dinkel.brot.dg:~$ ssh caio@roggen.brot.dg[Invio]

Dopo la fase di autenticazione, che potrebbe consistere nella richiesta della parola d'ordine, è possibile verificare che la variabile di ambiente DISPLAY risulta impostata in modo da fare riferimento al proprio elaboratore locale, utilizzando uno schermo particolare, come definito nella direttiva X11DisplayOffset:

caio$roggen.brot.dg:~$ echo $DISPLAY[Invio]

dinkel.brot.dg:10.0

A questo punto, è sufficiente avviare un programma grafico qualunque nell'elaboratore remoto, senza bisogno di altro: si ottiene di farlo funzionare sul proprio schermo grafico.

caio$roggen.brot.dg:~$ xclock[Invio]

Si osservi che la comunicazione tra i due elaboratori avviene all'interno di un tunnel definito da Secure Shell. Ciò consente di ottenere una connessione cifrata; in ogni caso, tuttavia, è da tenere in considerazione che non viene rilevata come tale da un programma di analisi del traffico in rete, ma solo come una connessione di Secure Shell.

217.7   Cambiare identità

Quando si intende avviare un programma che utilizza la grafica, ma con i privilegi di un altro utente, non basta usare il comando su, come avviene per quei programmi che richiedono soltanto un terminale a caratteri. Infatti, si crea il problema delle autorizzazioni, già descritto nelle sezioni precedenti. Pertanto, occorre eventualmente un programma analogo a su, in grado però di provvedere anche a ciò che serve per autorizzare la comunicazione con il proprio servente X. A titolo di esempio viene descritto Gksu:

gksu [-u utente] [opzioni] [comando]

Se il programma gksu viene avviato senza alcun argomento, chiede interattivamente cosa deve fare: quale utente deve impersonare e quale comando eseguire.

Figura 217.22. Il programma gksu avviato senza alcun argomento chiede tutto in modo interattivo.

gksu

In ogni caso, viene richiesto l'inserimento della parola d'ordine dell'utente che interessa. Di norma, la richiesta della parola d'ordine coincide con un congelamento momentaneo delle altre attività.

Figura 217.23. La richiesta dell'inserimento della parola d'ordine. In questo caso verrebbe avviato il programma mlterm in qualità di utente root.

gksu

217.8   Tipi di carattere

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/lib/X11/fonts/. All'interno di queste directory si trovano una serie di file contenenti le informazioni sui vari tipi di carattere tipografico e i loro nomi sono contenuti negli elenchi fonts.dir.

Il nome di un carattere tipografico è strutturato in un modo altamente descrittivo. Segue un esempio che viene scomposto.(4)

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

217.9   X 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 X 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 che si in questo esempio, oppure che sia assente del tutto:

# Option    XkbDisable

Per abilitare l'uso del tastierino numerico in modo che possa sostituirsi al mouse occorre utilizzare la combinazione [Ctrl Maiuscole 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 [4], [8], [6] e [2], per spostare il puntatore rispettivamente verso sinistra, in alto, a destra e in basso. Inoltre, si possono usare anche i tasti [7], [9], [3] e [1], per ottenere degli spostamenti obliqui. Questi spostamenti potrebbero essere 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.

Per emulare i tasti del mouse si utilizzano gli altri tasti del tastierino numerico: [5] corrisponde a un clic; [+] corrisponde a un clic doppio; [0] rappresenta la pressione di un tasto senza rilasciarlo; [.] 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 [/], [*] e [-], che rappresentano rispettivamente il primo, il secondo (quello centrale) e il terzo tasto del mouse. Per esempio, [* 5] corrisponde a un clic con il tasto centrale del mouse.

Tabella 217.26. Comandi per l'emulazione del mouse con X.

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

tastierino numerico

X, 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.

217.10   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) 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) In questo caso, dal momento che twm viene avviato rimpiazzando la shell, risulta che il processo di xclock dipende proprio da twm.

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

4) I caratteri tipografici di X servono solo per la rappresentazione di testo sullo schermo. In pratica, non sono utili per la stampa vera e propria.


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

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

Valid ISO-HTML!

CSS validator!