Web Analytics Made Easy - Statcounter
Privacy Policy Cookie Policy Terms and Conditions a2 --- Utilizzo più evoluto del terminale a caratteri

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [violazione licenza] [translators] [docinfo] [indice analitico] [volume] [parte]


Capitolo 63.   Utilizzo più evoluto del terminale a caratteri

In questo capitolo vengono descritti gli aspetti nella gestione dei terminali a carattere che riguardano un utilizzo un po' più evoluto rispetto al normale. La tabella 63.1 elenca i programmi e i file a cui si accenna in questo capitolo.

Tabella 63.1. Riepilogo dei programmi e dei file per la gestione evoluta dei terminali a caratteri.

Nome Descrizione
consolechars Definisce i caratteri per lo schermo delle console EGA/VGA.
/usr/share/consolefonts/ Directory dei file di definizione dei caratteri video della console.
SVGATextMode Configura la modalità testo delle schede SVGA.
/dev/mouse Collegamento simbolico al dispositivo del mouse.
mdetect Individua il mouse e le sue caratteristiche.
gpm Programma di gestione del mouse nelle console virtuali.
/dev/gpmdata File FIFO gestito da gpm.
script Registrazione di una sessione di lavoro.
/dev/vcs* File di dispositivo per la cattura dello schermo di console virtuali.
open Esegue un comando in una console virtuale particolare.
switchto Seleziona una console virtuale particolare.
/dev/tty* File di dispositivo per le console virtuali.
/dev/console File di dispositivo della console.
screen Programma per la gestione di terminali virtuali.
pconsole Programma per il controllo simultaneo di più terminali a caratteri.

63.1   Schermi VGA

Le console virtuali, che normalmente utilizzano schermi VGA, possono essere configurate in modo da utilizzare un insieme di caratteri differente da quello standard (il famigerato CP437) e anche per permettere la visualizzazione di più righe e più colonne.

Nei sistemi GNU/Linux è stato usato il programma setfont, (1) ora sostituito con consolechars, (2) per l'impostazione dei caratteri da mostrare sullo schermo di una console:

setfont [opzioni] file_di_configurazione
consolechars [opzioni]

È molto importante l'uso di setfont o di consolechars quando si decide di utilizzare un insieme di caratteri esteso, come ISO 8859-1 o meglio ancora come ISO 10646, per poter visualizzare caratteri come le lettere accentate maiuscole, che non fanno parte della codifica standard di un'interfaccia video a caratteri tipica.

Per ottenere il risultato, questi programmi si avvalgono di file di definizione dei caratteri, collocati nella directory /usr/share/consolefonts/.

L'esempio seguente, visto sia per setfont, sia per consolechars, serve a ottenere la visualizzazione di caratteri utili nelle lingue europee, incluso l'arabo e l'ebraico, in uno schermo composto da 25 righe.

setfont /usr/share/consolefonts/LatArCyrHeb-16.psf[Invio]

consolechars -f /usr/share/consolefonts/LatArCyrHeb-16.psf[Invio]

Eventualmente, se la dimensione dei caratteri non è quella desiderata, si possono provare altri file della famiglia LatArCyrHeb-*.psf.

Per approfondire la sintassi di questi programmi, si veda la pagina di manuale setfont(8) oppure consolechars(8).

Per i sistemi GNU/Linux esiste anche un altro programma che, oltre a definire l'insieme di caratteri, consente di sfruttare le caratteristiche della grafica VGA per ridimensionare lo schermo, allo scopo di consentire la visualizzazione di più righe e colonne:

SVGATextMode [opzioni] [Voce_di_configurazione]

SVGATextMode, (3) per funzionare, non richiede il riavvio del sistema, interviene su tutte le console virtuali, però può entrare in conflitto con altri programmi che accedono direttamente alla gestione dell'adattatore grafico VGA. Sotto questo aspetto, sarebbe bene limitare l'uso di questo programma ai sistemi in cui non si usano programmi che richiedono la grafica o che emulano altri sistemi operativi.

È necessaria la configurazione con il file /etc/TextConfig, piuttosto complesso. Generalmente, questo viene fornito già pronto per essere utilizzato con un adattatore grafico VGA standard, con un insieme di caratteri ISO 8859-1 normale.

Questa configurazione potrebbe andare bene, se non fosse che la codifica scelta non permette la visualizzazione dei caratteri pseudo-grafici utilizzati per le cornici nei programmi a tutto schermo come Midnight Commander (mc). Sarebbe il caso di modificare il file di configurazione in modo che contenga le righe seguenti, in pratica ritoccando quelle corrispondenti della configurazione originale.

Option "LoadFont"
FontProg "/usr/bin/consolechars -f"
FontPath "/usr/share/consolefonts"
FontSelect "lat1-16.psf"   8x16 9x16 8x15 9x15 
FontSelect "lat1-14.psf"   8x14 9x14 8x13 9x13
FontSelect "lat1-12.psf"   8x12 9x12 8x11 9x11
FontSelect "lat1-10.psf"   8x10 9x10 8x9  9x9
FontSelect "lat1-08.psf"   8x8  9x8  8x7  9x7

Più avanti, nello stesso file di configurazione sono elencate le varie risoluzioni video a cui si può fare riferimento quando si vuole utilizzare SVGATextMode.

"80x25x8"          25.2   640  680  776  800    400  412  414  449 font  8x16
"80x25x9"          28.3   640  680  776  800    400  412  414  449 font  9x16

"80x28x8"          25.2   640  680  776  800    392  412  414  449 font  8x14
"80x28x9"          28.3   640  680  776  800    392  412  414  449 font  9x14

"80x29x8"          25.2   640  680  776  800    464  490  492  525 font  8x16
"80x29x9"          28.3   640  680  776  800    464  490  492  525 font  9x16

"80x30x8"          25.2   640  680  776  800    480  490  492  525 font  8x16
"80x30x9"          28.3   640  680  776  800    480  490  492  525 font  9x16

In base a quanto mostrato, si può tentare di visualizzare una schermata di 80 caratteri per 30 righe, con il comando seguente:

SVGATextMode 80x30x8[Invio]

In generale, non è conveniente modificare la definizione delle risoluzioni disponibili; tuttavia, per approfondire il significato delle righe che compongono l'esempio di configurazione mostrato poco sopra, occorre conoscere in che modo si configura XFree86, in particolare la sezione Monitor.

Per approfondire l'uso di questo programma, si vedano le pagine di manuale SVGATextMode(8) e TextConfig(5).

63.2   Mouse

Il mouse, in un terminale a caratteri, non è una cosa tanto comune. È normale in un ambiente grafico, ma nel caso di GNU/Linux c'è la possibilità di usarlo anche nelle console virtuali. Per gestire un mouse in questa situazione è necessario un demone che si occupi di seguirlo e di fornire ai programmi le informazioni sulle azioni del mouse stesso. Si tratta in pratica di un servente per la gestione del mouse. Trattandosi di un servente, i programmi con cui si può interagire con il mouse sono dei clienti e dipendono dal servente per il tipo di comunicazione che tra loro deve instaurarsi.

Il servente utilizzato normalmente per GNU/Linux è il demone gpm, il quale ha in particolare il vantaggio di essere utile anche con i programmi che non sono fatti per il mouse, per copiare e incollare del testo.

In alcune situazioni, la gestione del mouse può diventare conflittuale, per esempio quando si utilizza un cosiddetto mouse bus (bus-mouse). In questa situazione non è possibile avere più programmi che leggono contemporaneamente il dispositivo corrispondente al mouse; in pratica non ci può essere in funzione il demone gpm assieme al sistema grafico X (a meno che X si avvalga proprio di gpm) e nemmeno possono essere messi in funzione più sistemi grafici contemporaneamente. Il demone gpm è in grado di risolvere il problema occupandosi da solo del mouse e passando a tutte le altre applicazioni eventuali le informazioni sulle azioni compiute con il mouse stesso.

63.2.1   Dispositivo del mouse

Per convenzione, il file /dev/mouse dovrebbe corrispondere al dispositivo del mouse. In pratica, si crea un collegamento simbolico con questo nome che punta al dispositivo corrispondente al mouse utilizzato effettivamente. Di solito è lo stesso programma di installazione delle distribuzioni GNU/Linux a farlo.

Nel caso particolare dei mouse seriali, cioè di quelli connessi a una porta seriale, sono stati usati in passato i dispositivi /dev/cua*. Attualmente, questi sono diventati obsoleti e al loro posto si fa riferimento ai corrispondenti /dev/ttyS*.

Quando la lettura di questo dispositivo può essere solo esclusiva, a causa della sua natura, per evitare conflitti tra i programmi nel modo descritto in precedenza, si può creare il file FIFO /dev/gpmdata. Questo viene gestito dal demone gpm allo scopo di fornire a tutti gli altri programmi che accedono direttamente al mouse le informazioni sulle azioni compiute con lo stesso.

mknod /dev/gpmdata p[Invio]

Il comando appena mostrato è ciò che serve per creare questo file nel caso non sia già disponibile. Per fare in modo che gpm gestisca questo file e di conseguenza si occupi del mouse in qualunque situazione, deve essere utilizzata l'opzione -R. Inoltre, se si utilizza il sistema grafico XFree86 è necessario modificare manualmente la sua configurazione (il file /etc/X11/XF86Config) nella sezione Pointer, come si vede nell'esempio seguente:

# Pointer section
Section "Pointer"
    Option      "Protocol"     "IntelliMouse"
    Option      "Device"       "/dev/gpmdata"
    Option      "Buttons"      "5"
    Option      "ZAxisMapping" "4 5"

Se si usano programmi che si avvalgono di SVGAlib, conviene configurare il file /etc/vga/libvga.config con le direttive seguenti:

mouse IntelliMouse
mdev /dev/gpmdata

In pratica, per il sistema grafico X e per qualunque altro programma che dovesse accedere al dispositivo del mouse direttamente, si deve fare riferimento al tipo di mouse IntelliMouse, utilizzando il file di dispositivo /dev/gpmdata.

Tabella 63.6. Alcuni file riferiti a dispositivi di puntamento secondo il kernel Linux. L'elenco completo può essere consultato nel file sorgenti_linux/Documentation/devices.txt tra i sorgenti del kernel.

File di dispositivo Descrizione
/dev/mouse Collegamento simbolico al file di dispositivo oppure a un file FIFO adatto.
/dev/gpmdata File FIFO standard per ritrasmettere il movimento del mouse a più programmi.
/dev/logibm mouse bus Logitech.
/dev/psaux mouse PS/2.
/dev/usb/mousen n-esimo mouse USB (a partire da zero).

63.2.2   Utilizzo di «mdetect»

Il programma mdetect (4) è in grado di individuare un mouse che non è già utilizzato in qualche modo. Il risultato della scansione può essere usato per configurare gpm, o anche XFree86. Generalmente, quando si avvia mdetect è bene muovere il mouse in modo da facilitarne l'individuazione.

mdetect [opzioni]

Tabella 63.7. Alcune opzioni significative di mdetect.

Opzione Descrizione
-n
Evita la ricerca di mouse Plug & Play.
-o
Genera un risultato adatto per la configurazione di XFree86 versione 3.*.
-x
Genera un risultato adatto per la configurazione di XFree86 versione 4.*.
-v
Genera più informazioni.

Segue la descrizione di alcuni esempi.

63.2.3   Utilizzo di «gpm»

Il programma gpm (5) è un demone in grado di permettere operazioni di copia-incolla con i programmi normali e di fornire a quelli predisposti l'accesso a tutte le funzionalità del mouse. Può essere messa in funzione una sola copia del programma alla volta, di conseguenza è normale che gpm venga avviato una volta per tutte attraverso la procedura di inizializzazione del sistema.

gpm [opzioni]

A meno di fare uso di opzioni particolari, gpm si aspetta di trovare il collegamento /dev/mouse che punti al file di dispositivo corrispondente al mouse effettivamente a disposizione.

Se gpm viene utilizzato con l'opzione -R, allora si abilita la gestione del file FIFO /dev/gpmdata e tutti gli altri programmi che dovessero accedere direttamente al mouse dovrebbero utilizzare questo file come dispositivo (che, salvo altra indicazione, si comporta come quello di un mouse MouseSystems).

Tabella 63.12. Alcune opzioni.

Opzione Descrizione
-B sequenza
Con questa opzione è possibile definire la disposizione dei tasti. Per esempio, gpm -B 123 indica di utilizzare i tasti nella posizione normale: il primo è quello a sinistra, il secondo è quello centrale e il terzo è quello a destra. Nello stesso modo si può indicare una disposizione inversa per facilitare un utente che preferisce usare la mano sinistra (gpm -B 321).
-m file
Permette di indicare un file di dispositivo diverso dal solito /dev/mouse.
-R [tipo]
Abilita la gestione del file FIFO /dev/gpmdata allo scopo di fornire ad altre applicazioni, che accedono direttamente al mouse, le informazioni sulle sue azioni. Se si indica il tipo, questo specifica il protocollo di comunicazione da utilizzare per tale scopo; altrimenti si fa riferimento in modo predefinito al tipo MouseSystems (msc). In base agli esempi mostrati, si dovrebbe invece specificare il tipo IntelliMouse (ms3).
-t tipo
Permette di indicare il tipo di mouse a disposizione. Quando non si specifica questa opzione, il tipo predefinito è ms, corrispondente a un mouse Microsoft con due o tre tasti. In particolare, -t help elenca tutti i tipi disponibili (si veda la tabella 63.13).
-2
Forza un funzionamento a due tasti. In questo modo il primo tasto serve a evidenziare e l'altro a incollare.
-3
Forza un funzionamento a tre tasti. In questo modo il primo tasto serve a evidenziare, il secondo a incollare e il terzo a estendere la zona evidenziata. Questo è il funzionamento predefinito, perché il secondo tasto viene attivato solo a partire dal momento in cui questo viene premuto. Perciò, normalmente, non occorre preoccuparsi di indicare quanti tasti utilizzare.
-S comandi_speciali
Permette di definire dei comandi da eseguire in corrispondenza di un clic triplo sul primo e sul terzo tasto.

Tabella 63.13. Elenco di alcuni nomi dei tipi di mouse utilizzabili con l'opzione -t e con l'opzione -R.

Tipo Sinonimo Descrizione
mman
Mouseman
Mouseman.
ms
Microsoft a due o tre tasti e compatibili (predefinito).
ms+
Come ms, con il trascinamento nel tasto centrale.
bare
Microsoft
Microsoft a due tasti.
msc
MouseSystems
Mouse System, tre tasti.
sun
Variante del Mouse System.
mm
MMSeries
logi
Logitech
Alcuni mouse seriali Logitech.
logim
Mouse Logitech che devono funzionare come mouse Mouse System a tre tasti.
bm
BusMouse
Busmouse Microsoft e compatibili.
ps2
PS/2
Busmouse PS/2.
ncr
Alcune penne di puntamento di alcuni portatili (NCR3125pen).
wacom
Tavoletta Wacom.
genitizer
Tavoletta Genitizer.
logim
Mouse Logitech in cui abilitare il funzionamento in modalità Mouse System.
pnp
Microsoft pnp.
imps2
Microsoft IntelliMouse su porta PS/2.
ms3
Mouse seriali IntelliMouse a tre tasti.
netmouse
Genius NetMouse (due tasti normali, più un tasto «su» e un tasto «giù»).
cal
Calcomp Ultraslate.
calr
Calcomp Ultraslate in modalità relativa.
twid
Tastiera Twidder.
syn
synaptics
Touchpad seriale Synaptics.
syn2
synaptics_ps2
Touchpad PS/2 Synaptics.
brw
Mouse Fellowes Browser a quattro bottoni e una rotella.
js
Joystick
Emulazione del mouse attraverso un joystick.
summa
Tavoletta Summa/Genius.
mtouch
Schermi touchscreen MicroTouch.
acecad
Tavolette Acecad in modalità assoluta.
kmiabps2
Kensignton Mouse «in a box» su PS/2.

Il funzionamento è relativamente semplice. Quando il mouse è riconosciuto dal programma che si sta utilizzando, dipende da questo il modo di gestire e interpretare le azioni compiute con il mouse. Quando il programma non è in grado di controllare il mouse, è possibile utilizzare il supporto alle operazioni di copia-incolla.

Si seleziona una zona dello schermo premendo il primo tasto e trascinando fino alla posizione finale. Per incollare si può cambiare console virtuale, raggiungendo così l'applicazione all'interno della quale incollare il testo, quindi si preme il secondo tasto, o in mancanza il terzo. Il testo viene inserito come se fosse digitato, di conseguenza occorre che il programma lo permetta.

Il terzo tasto, quando non dovesse servire per incollare, permette di estendere una selezione già iniziata e non completata.

L'opzione -S permette di definire tre comandi, separati con il simbolo due punti (:), da eseguire in occasione di un clic triplo con il primo e il terzo tasto. In pratica, si tiene premuto il primo o il terzo tasto, mentre con l'altro (il terzo o il primo rispettivamente) si esegue un clic triplo in rapida successione. Se entro tre secondi dal rilascio dei tasti viene premuto uno dei tre tasti, viene eseguito uno dei comandi indicati nell'argomento di questa opzione.

Per esempio, se si utilizza l'opzione -S "echo ciao:echo hello:echo bye" e si preme un clic triplo, del tipo descritto, seguito dalla pressione del primo tasto, si ottiene l'esecuzione di echo ciao, cioè viene visualizzata la parola ciao. Se invece alla fine si seleziona il secondo tasto, si ottiene la parola hello. Infine, se si tratta del terzo tasto, si ottiene bye.

Questo sistema potrebbe essere particolarmente utile per definire un comando per il riavvio del sistema, quando per qualche motivo non si può usare la tastiera per farlo e non si rendono disponibili altre alternative.

Segue la descrizione di alcuni esempi.

63.2.4   Avvio del servizio di gestione del mouse

Si è accennato al fatto che il demone gpm venga avviato normalmente dalla procedura di inizializzazione del sistema, nel modo già stabilito dalla stessa distribuzione GNU/Linux che si utilizza. Se si vogliono gestire funzionalità speciali di gpm, come per esempio il file FIFO /dev/gpmdata, cosa che si ottiene con l'opzione -R, occorre intervenire nello script che avvia questo demone.

Alcune distribuzioni, prevedono un file di configurazione contenente l'assegnamento di variabili di ambiente che poi vengono incorporate e utilizzate nello script di avvio del servizio gpm. Tuttavia potrebbe non essere stata prevista la possibilità di aggiungere delle opzioni ulteriori; in tal caso si deve intervenire direttamente nello script.

In particolare, la distribuzione Red Hat gestisce il servizio attraverso lo script /etc/rc.d/init.d/gpm, mentre la distribuzione Debian usa il file /etc/init.d/gpm. Inoltre, la distribuzione Debian mette a disposizione lo script gpmconfig per facilitare l'intervento nel file di configurazione, corrispondente a /etc/gpm.conf.

63.3   Monitoraggio di una sessione di lavoro

L'attività svolta durante una sessione di lavoro attraverso un terminale potrebbe essere registrata volontariamente in modo da annotare le operazioni svolte, eventualmente anche a titolo di prova, come potrebbe essere l'esecuzione di un test di esame.

In aggiunta, le console virtuali di GNU/Linux possono essere osservate attraverso dei dispositivi appositi: /dev/vcs*.

63.3.1   Utilizzo di «script»

Il programma script (6) permette di registrare la sessione di lavoro svolta attraverso un terminale a caratteri. Si avvia il programma e questo avvia una copia della shell predefinita; da quel momento, tutto ciò che viene digitato ed emesso attraverso il terminale viene memorizzato in un file. Il file può essere indicato nella riga di comando, altrimenti viene creato il file typescript nella directory corrente.

script [-a] file

L'opzione -a permette di continuare la registrazione in un file già utilizzato in precedenza, senza cancellarlo inizialmente.

Per terminare l'esecuzione della registrazione della sessione di lavoro, basta concludere l'attività della shell avviata da script; di solito si tratta di utilizzare il comando exit.

63.3.2   File di dispositivo «/dev/vcs*»

I file di dispositivo /dev/vcs*, definiti Virtual console capture device, possono essere usati per visualizzare lo schermo di una console particolare. Il meccanismo è estremamente banale, in quanto basta leggere il loro contenuto: in ogni momento, il risultato che si ottiene da questa lettura è l'immagine dello schermo di quella console particolare che quel dispositivo rappresenta.

cat /dev/vcs1[Invio]

L'esempio mostra la visualizzazione del contenuto dello schermo della prima console virtuale, corrispondente al dispositivo /dev/tty1, dell'istante in cui si esegue il comando.

In particolare, il dispositivo /dev/vcs0 fa riferimento alla console virtuale attiva, mentre i file contrassegnati da un numero finale (diverso da zero) corrispondono alle rispettive console virtuali, identificate in modo preciso tramite quel numero.

63.4   Strumenti per la gestione delle console virtuali

Le console virtuali di GNU/Linux sono gestite normalmente attraverso la configurazione del file /etc/inittab, in cui, a seconda del livello di esecuzione, si attivano diversi programmi Getty abbinati ad altrettanti terminali o console virtuali. Generalmente, in questo modo, non vengono utilizzate tutte le console virtuali possibili, pertanto quelle rimanenti potrebbero essere sfruttate per altri scopi.

Le console virtuali disponibili possono essere utilizzate per visualizzare in modo continuo informazioni utili sul funzionamento del sistema, come per esempio quelle provenienti da un file per le registrazioni del sistema (log).

tail -f /var/log/messages > /dev/tty10 &[Invio]

L'esempio mostra l'utilizzo di tail per visualizzare la fine del file /var/log/messages e tutte le righe che gli vengono aggiunte successivamente. Invece di impegnare il terminale dal quale viene avviato, il comando viene messo sullo sfondo (&) e l'output viene emesso attraverso la decima console virtuale (che si presume sia disponibile).

63.4.1   Utilizzo di «open»

Il programma open (7) permette di avviare un comando in una nuova console virtuale (non utilizzata precedentemente). Per distinguere il comando dalle opzioni di open si utilizza un trattino doppio (--) per segnalare l'inizio del comando stesso.

open [opzioni] [--] comando [opzioni_del_comando]

Tabella 63.14. Alcune opzioni.

Opzione Descrizione
-c n
Questa opzione permette di definire esplicitamente quale console virtuale utilizzare attraverso l'argomento che indica il numero di questa (le console virtuali sono numerate a partire da uno).
-l
Fa in modo che il comando venga trattato come se fosse una «shell di login», cioè una shell avviata dalla procedura di accesso (dopo che l'autenticazione dell'utente è avvenuta con successo). Questo comporta l'aggiunta di un trattino (-) davanti al nome del comando.
--
Segna la fine delle opzioni di open e l'inizio del comando. È necessario l'uso di questo trattino doppio quando il comando da eseguire ha, a sua volta, degli argomenti.

Segue la descrizione di alcuni esempi.

63.4.2   Utilizzo di «switchto»

Il programma switchto (8) permette di selezionare una console virtuale particolare. Può essere utile in uno script.

switchto n

L'esempio seguente mostra il passaggio all'undicesima console virtuale:

switchto 11[Invio]

63.5   Terminali virtuali, o finestre, con il programma Screen

È già stato descritto più volte il funzionamento delle console virtuali di GNU/Linux, che, attraverso una sola console fisica, permettono la gestione di più sessioni di lavoro differenti, a cui si accede generalmente con le combinazioni di tasti [Ctrl Fn], oppure [Ctrl Alt Fn]. Un effetto simile si può ottenere attraverso dei programmi, che possono essere utilizzati anche quando non si dispone di una console GNU/Linux.

Un programma che svolga questo compito non è così comodo da utilizzare come può esserlo una console virtuale, però può offrire delle possibilità in più. Per esempio, potrebbe trasferire il terminale virtuale su un altro terminale fisico, senza dover sospendere, né interrompere, il lavoro che si stava svolgendo. In pratica, l'unico programma che si utilizzi per questo scopo è Screen, (9) che permette di fare una quantità di cose, anche il trasferimento di un terminale virtuale a un altro utente (consentendo a questo di continuare il lavoro).

Lo studio di Screen è impegnativo come lo è l'approfondimento di una shell sofisticata. Qui si vogliono mostrare solo i rudimenti, trascurando volutamente funzionalità che, se utilizzate, richiederebbero attenzione per ciò che riguarda la sicurezza.

63.5.1   Funzionamento e organizzazione generale

Screen è un programma (in pratica si tratta dell'eseguibile screen) che si interpone tra una shell (o un applicativo diverso) e il terminale utilizzato effettivamente. In pratica, si tratta di un gestore di finestre a caratteri che, tra le altre cose, permette di aprire più sessioni contemporanee utilizzando un solo terminale fisico.

Ogni terminale virtuale, ovvero ogni finestra, mette a disposizione le funzionalità di un terminale VT100 con delle estensioni di vario tipo. Per ogni finestra viene conservato uno storico delle ultime righe visualizzate, permettendo lo scorrimento all'indietro e la copia di porzioni di questo all'interno dello standard input della stessa o di un'altra finestra.

Come si può intuire, per accedere alle funzionalità offerte da Screen occorre utilizzare dei comandi composti da combinazioni di tasti che vengono intercettati da questo, senza essere passati all'applicazione sottostante, provocando così un'alterazione del comportamento normale di queste applicazioni.

Spesso, viene attivato il bit SUID al binario screen, assieme all'attribuzione della proprietà all'utente root. Ciò permette a Screen di fare una serie di cose molto comode, ma richiede attenzione nella sua configurazione, perché ciò potrebbe tradursi in un pericolo in più per chi lo utilizza. Se non si vuole approfondire tanto l'uso di Screen, sarebbe meglio togliere tale permesso.

chmod ug-s /usr/bin/screen[Invio]

Se Screen è in condizione di poterlo fare (di solito solo se è attivato il bit SUID per il binario screen e questo appartiene all'utente root), aggiorna il file /etc/utmp, cosa che consente di tenere traccia anche di tutti i terminali virtuali aperti attraverso di esso.

Per poter funzionare, Screen deve creare una pipe con nome, ovvero un file FIFO, per ogni gruppo di finestre aperto, cioè per ogni terminale fisico a cui è connesso effettivamente. Tale file viene definito socket da Screen e dalla sua documentazione. Questo file può essere creato in varie posizioni, a seconda di come sono stati compilati i sorgenti. Se il binario screen è stato previsto con il bit SUID attivo, questo file FIFO potrebbe essere creato nella directory /tmp/screens/S-utente/, oppure, più utilmente, potrebbe essere creato nella directory ~/.screen/. È da ritenere che questa ultima scelta sia la migliore; volendo, si può utilizzare la variabile di ambiente SCREENDIR per indicare il percorso della directory che Screen deve usare per i file FIFO.

Il nome utilizzato per il file FIFO serve a identificare una particolare sessione di lavoro di Screen, assieme a tutte le finestre gestite attraverso questa. Di solito, si tratta di un nome articolato secondo il modello seguente:

pid.terminale.nodo

Per esempio, 123.tty4.dinkel è il modo con cui si identifica la sessione di Screen che ha il numero PID 123, utilizza il terminale corrispondente al dispositivo /dev/tty4, sul sistema chiamato dinkel.

Una sessione di Screen, quando è in funzione regolarmente, è attaccata al terminale fisico che si utilizza effettivamente (questo terminale fisico può anche essere una console virtuale di GNU/Linux). La sessione può essere distaccata e successivamente riattaccata altrove, presso un altro terminale fisico. Le applicazioni in funzione nelle varie finestre di una sessione distaccata, continuano a funzionare regolarmente. Di solito, a meno di modificare la configurazione predefinita, un segnale di aggancio (SIGHUP), che generalmente si ottiene disconnettendo la linea attraverso cui è collegato il terminale, provoca solo il distacco della sessione, senza coinvolgere le applicazioni.

Screen può essere controllato attraverso file di configurazione, la cui collocazione può essere varia. Potrebbe trattarsi di /etc/screenrc per la configurazione globale e di ~/.screenrc per la personalizzazione di ogni utente. Le direttive di questi file non vengono mostrate qui; eventualmente si può consultare la documentazione originale: screen(1).

Screen imposta automaticamente la variabile TERM al valore screen, in modo da informare opportunamente le applicazioni di adattarsi alle sue caratteristiche.

Quasi tutti i comandi che possono essere impartiti a Screen sono prefissati dalla combinazione [Ctrl a], alla quale segue poi una sequenza di caratteri o di altre combinazioni di tasti, che ovviamente non vengono passati all'applicazione sottostante. Se però si vuole passare proprio la combinazione [Ctrl a] all'applicazione, si deve usare la sequenza [Ctrl a][a].

A volte, Screen ha la necessità di fornire delle indicazioni. Ciò viene fatto sovrascrivendo parte della finestra in uso, di solito nell'ultima riga. Dopo pochi secondi, i messaggi vengono rimossi, ripristinando il testo precedente.

63.5.2   Utilizzo di «screen»

Screen si compone in pratica dell'eseguibile binario screen. Come accennato in precedenza, viene predisposto spesso in modo da avere il bit SUID attivo e da essere proprietà dell'utente root. Se non si richiedono funzionalità particolari a questo programma, non è necessaria tale politica.

screen [opzioni] [comando [argomenti_del_comando]]

Il programma screen può essere avviato per iniziare una sessione di lavoro attraverso cui gestire delle applicazioni contenute in finestre differenti, oppure per altre funzionalità descritte in occasione della presentazione delle opzioni. Quando si avvia screen in modo normale, si può aggiungere l'indicazione di un comando (con i suoi argomenti), che si vuole avviare all'interno della prima finestra. Se questo comando non viene specificato, screen avvia una shell (quella indicata nella variabile di ambiente SHELL, oppure /bin/sh in sua mancanza).

Quando un programma ospitato all'interno di una finestra di screen termina di funzionare, la finestra relativa si chiude. Quando una sessione non ha più finestre, termina di funzionare anche il processo screen relativo.

Tabella 63.15. Alcune opzioni.

Opzione Descrizione
-U
Avvia il programma richiedendo espressamente l'uso della codifica UTF-8 per il terminale.
-c file
Permette di specificare un file di configurazione alternativo a quello predefinito.
-s shell
Permette di indicare una shell alternativa a quella contenuta nella variabile di ambiente SHELL, che viene utilizzata ogni volta che si apre una nuova finestra senza specificare il programma che deve essere avviato al suo interno.
-S sessione
Permette di dare un nome a una sessione. A questo nome viene comunque aggiunto il numero PID anteriormente. Lo scopo è quello di rendere più semplice l'identificazione di una sessione.
-ls
-list
Questa opzione va usata da sola: non avvia alcuna nuova sessione e si limita a elencare quelle già aperte dall'utente che ne sta facendo richiesta. Attraverso questo elenco si possono individuare facilmente quali siano le sessioni distaccate, cioè quelle che possono essere riprese utilizzando l'opzione -r.
-d [pid.]tty[.nodo]
-D [pid.]tty[.nodo]
Permette di distaccare una sessione di Screen da un terminale fisico, senza interrompere il funzionamento degli applicativi avviati al suo interno. Si può usare questa opzione assieme a -r, in modo da riattaccare la sessione in un altro terminale.
-r [[pid.]tty[.nodo]]
-R [[pid.]tty[.nodo]]
Permette di riattaccare sul terminale in funzione attualmente, una sessione staccata in precedenza. Se non si indica la sessione, viene avviata la prima di quelle che risultano distaccate; se in particolare si utilizza -R, si ottiene comunque l'avvio di una sessione anche se non ce ne sono da riprendere. Questa opzione può essere usata da sola o in abbinamento a -d (o -D). In questo ultimo caso, si indica prima l'opzione -d, poi -r, infine la sessione da staccare e da riattaccare.
-x [[pid.]tty[.nodo]]
Questa opzione permette di accedere a una sessione già aperta e funzionante presso un altro terminale fisico. Se non viene specificata la sessione, viene aperta la prima che può essere trovata. Quando si condivide una sessione tra più terminali fisici, ogni terminale può accedere solo alle finestre che non sono attive da qualche parte.

Segue la descrizione di alcuni esempi.

63.5.3   Comandi interattivi

Una volta avviato l'eseguibile screen, si può interagire con questo attraverso una serie di comandi composti da combinazioni di tasti. Nella maggior parte dei casi si tratta di sequenze iniziate dalla combinazione [Ctrl a].

Per motivi di compatibilità, spesso sono disponibili diversi tipi di sequenze per lo stesso risultato. Nella tabella 63.16 vengono elencate solo alcune di queste sequenze; per un elenco completo occorre leggere la documentazione originale, costituita dalla pagina di manuale: screen(1).

Tabella 63.16. Alcuni dei comandi che si possono dare a Screen, quando è in funzione.

Sequenza Effetto
[Ctrl a][?] Mostra una guida rapida ai comandi disponibili.
[Ctrl a][a] Invia la combinazione [Ctrl a] all'applicazione attiva.
[Ctrl a][n] Seleziona l'n-esima finestra. La prima ha il numero zero.
[Ctrl a][n] Passa alla finestra successiva.
[Ctrl a][p] Passa alla finestra precedente.
[Ctrl a][c] Crea una nuova finestra.
[Ctrl a][d] Distacca la sessione dal terminale fisico.
[Ctrl a][w] Mostra un breve riepilogo delle finestre esistenti.
[Ctrl a][Esc] Inizia la modalità di scorrimento e copia all'indietro.
[Ctrl a][]] Incolla il testo inserito precedentemente nella memoria tampone.

Le operazioni più complesse sono quelle che riguardano la copia e l'inserimento di testo che proviene da quanto visualizzato attualmente, o nel testo precedente. Infatti, per ogni finestra viene conservato uno storico delle righe visualizzate, che può essere rivisto e dal quale si possono prelevare delle parti, inserendole in una memoria tampone (la documentazione screen(1) parla di paste buffer).

Con il comando [Ctrl a][Esc] si inizia la modalità di scorrimento e copia, cosa che blocca il funzionamento dell'applicazione che utilizza la finestra attiva. Da quel momento, si possono usare i tasti freccia e pagina per spostare il cursore; eventualmente si possono usare i tasti [h], [j], [k] e [l], come si fa con VI. Si possono anche fare delle ricerche nello stile di VI, con i comandi [/] e [?].

Quando si raggiunge il pezzo che si vuole copiare nella memoria tampone, lo si deve delimitare. Ciò si ottiene normalmente premendo il tasto [barra spaziatrice] nel punto di inizio, quindi si fa scorrere il cursore nel punto finale e si preme nuovamente la [barra spaziatrice] per concludere. La selezione del testo coincide anche con la conclusione della modalità di scorrimento e copia, cosa che dopo poco fa riprendere il funzionamento del programma.

È possibile anche la selezione di testo in modo rettangolare. Per questo, dopo aver premuto la [barra spaziatrice] per indicare il punto di inizio, si deve aggiungere anche il tasto [c], a indicare un bordo sinistro, oppure [C] a indicare un bordo destro. Successivamente, quando si raggiunge anche il punto finale, si preme nuovamente [C], oppure [c] (a seconda di come si è iniziato) prima della [barra spaziatrice].

Infine, il comando [Ctrl a][]] inserisce il testo, accumulato precedentemente nella memoria tampone, nello standard input dell'applicazione contenuta nella finestra attiva.

63.5.4   Configurazione

Il programma Screen consente di definire la sua configurazione attraverso i file /etc/screenrc e ~/.screenrc (il primo per tutto il sistema; il secondo per ogni utente). In alternativa, attraverso l'opzione -c si può indicare un file differente.

Il contenuto del file di configurazione si compone di commenti, preceduti dal simbolo #, righe vuote, righe bianche e direttive. Le informazioni utili sono costituite soltanto dalle direttive, che sono istruzioni semplici, disposte normalmente su una sola riga.

63.6   Console parallele con Pconsole

A ogni terminale a caratteri gestito presso il proprio elaboratore, corrisponde un file di dispositivo, che di norma si individua con il programma tty:

tty[Invio]

/dev/tty5

Il risultato del comando tty è relativo all'elaboratore presso il quale si sta operando, pertanto, se si tratta di un accesso remoto, il file di dispositivo riportato è inteso essere quello corrispondente nell'elaboratore remoto. Si cerchi di seguire l'esempio seguente, dove dall'elaboratore «A» ci si collega all'elaboratore «B», con l'aiuto di un programma appropriato:

A$ tty[Invio]

Ci si trova seduti davanti alla console dell'elaboratore «A» e si controlla quale file di dispositivo corrisponde alla propria console; si suppone si tratti della quinta console virtuale di un sistema GNU/Linux:

/dev/tty5

Con l'aiuto di un programma appropriato, ci si collega all'elaboratore «B» (che ha indirizzo IPv4 172.17.1.2):

A$ ssh 172.21.1.2[Invio]

Password: digitazione_all'oscuro[Invio]

Last login: ... from ...

B$ 

A questo punto, pur essendo seduti davanti alla console dell'elaboratore «A», si sta lavorando nell'elaboratore «B». Si verifica il file di dispositivo corrispondente al terminale usato:

B$ tty[Invio]

/dev/pts/2

Nonostante questo, rimane il fatto che il terminale usato presso l'elaboratore «A», ovvero quello locale, è /dev/tty5; attraverso tale terminale si accede all'elaboratore remoto «B»; presso l'elaboratore «B» il terminale usato è /dev/pts/2.

Se presso l'elaboratore «A» un programma fosse in grado di controllare il file di dispositivo /dev/tty5, questo controllerebbe in pratica l'accesso remoto all'elaboratore «B», secondo la simulazione dell'esempio.

Questa premessa è necessaria per comprendere il funzionamento del programma pconsole, (10) con il quale è possibile inviare un comando simultaneamente a più terminali, utilizzando i file di dispositivo locali:

pconsole

Il programma pconsole si usa senza argomenti, con i privilegi dell'utente root, ma dopo l'avvio gli si devono impartire dei comandi:

pconsole[Invio]

pconsole WJ101

pconsole command mode

>>> 

Con il comando help è possibile ottenere il riepilogo dei comandi disponibili:

>>> help[Invio]

 help           Give help about the available commands
 ?              short-cut for 'help'
 version        Display version information
 echo           Turn echo on or off
 attach         Attach to a tty device
 detach         Detach from a tty device
 list           Show devices currently attached to
 connect        Leave command mode
 quit           Exit pconsole
 exit           Exit pconsole

>>> quit[Invio]

Il programma ha due stati di funzionamento: la modalità di comando, corrispondente a quella mostrata negli esempi; la modalità di invio. La modalità di comando serve, evidentemente, per impartire dei comandi, mentre l'altra modalità consente di passare all'inserimento di testo da inviare ai terminali che risultano attaccati. In pratica, prima ci si attacca a dei terminali, ovvero ai file di dispositivo corrispondenti, quindi si passa in modalità di inserimento e ciò che si scrive, viene eseguito in tutti i terminali relativi; quello che non si può fare attraverso pconsole è di «vedere» ciò che accade presso i vari terminali.

Per passare alla modalità di comando, si usa il codice <SOH>, ovvero <^a>, che normalmente si ottiene con la combinazione [Ctrl a]; per passare alla modalità di invio, si usa il codice <EOT>, ovvero <^d>, che normalmente si ottiene con la combinazione [Ctrl d].

È abbastanza difficile mostrare un esempio completo di utilizzo del programma pconsole; per capire ciò che si vuole sintetizzare nei comandi seguenti richiede una buona dose di intuito. Per cominciare, si suppone di avere aperto diversi terminali; in particolare interessano la console virtuale corrispondente al file di dispositivo /dev/tty3 e un terminale grafico corrispondente al file di dispositivo /dev/pts/4. Presso un altro terminale libero (una console virtuale o un terminale grafico, senza che ciò faccia differenza) si avvia pconsole e ci si «attacca» ai due terminali già nominati:

pconsole[Invio]

pconsole WJ101

pconsole command mode

>>> attach /dev/tty3[Invio]

attaching /dev/tty3 : Ok

>>> attach /dev/pts/4[Invio]

attaching /dev/pts/4 : Ok

Con il comando list si può vedere quali terminali risultano attaccati:

>>> list[Invio]

Currently attached to:
 /dev/tty3                             (device no 4, 3)
 /dev/pts/4                            (device no 136, 4)

Si decide di passare alla modalità di inserimento:

>>> [Ctrl d]

Press <Ctrl-A> for command mode

Come si può osservare, invito assume una forma più breve, per ricordare che ci si trova nella modalità di inserimento. Da qui si vuole semplicemente impartire il comando ls, che viene eseguito in pratica nei due terminali controllati da pconsole:

ls[Invio]

Dal terminale dove si sta usando pconsole, non si vede alcun risultato; per sapere cosa è successo effettivamente, occorre invece passare agli altri terminali.

Al termine, si torna alla modalità di comando:

[Ctrl a]

pconsole command mode

>>> 

A questo punto si può chiudere:

>>> quit[Invio]

detaching from /dev/tty3 : Ok
detaching from /dev/pts/4 : Ok

Per concludere, c'è da osservare che la documentazione di Pconsole suggerisce di attribuire al programma i permessi SUID-root, per consentire a tutti gli utenti di usarlo; tuttavia, ciò è sicuramente sconsigliabile per motivi di sicurezza.

63.7   Riferimenti

Appunti di informatica libera 2006.01.01 --- Copyright © 2000-2006 Daniele Giacomini -- <daniele (ad) swlibero·org>, <daniele·giacomini (ad) poste·it>


1) Linux console font and keytable utilities   dominio pubblico, salva la licenza particolare di alcuni tipi speciali di carattere

2) Linux console tools   GNU GPL

3) SVGATextMode   GNU GPL

4) mdetect   In parte QPL 1.0 e in parte GNU GPL

5) General purpose mouse interface utility   GNU GPL

6) Script   UCB BSD

7) Open   GNU GPL

8) Switchto   GNU GPL

9) Screen   GNU GPL

10) Pconsole   GNU GPL


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

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [violazione licenza] [translators] [docinfo] [indice analitico]

Valid ISO-HTML!

CSS validator!

Static Wikipedia (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia February 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu