testo completo in PDF

Transcript

testo completo in PDF
/loris/tissino
/la/mia/cassetta/degli/attrezzi/linux
www.tissino.it/docs/linux
Indice
1 Introduzione
1.1
1.2
17
Questa cassetta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.1.1
A chi è rivolta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.1.2
Formati e diffusione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.1.3
Errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.1.4
Licenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Bibliografia e documentazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.2.1
PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.2.2
Libri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.2.3
Siti web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.2.4
Man . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.2.5
Whatis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.2.6
Apropos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.2.7
Info . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.2.8
—help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.2.9
/usr/share/doc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.2.10 HOWTO e WWW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.3
Il concetto di software libero
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3.1
Il software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3.2
Programma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3.3
Applicazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3.4
Sistema operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3.5
Programma sorgente ed eseguibile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3.6
Free Software Foundation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3.7
Copyright e Copyleft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3.8
Licenze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3.9
Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3.10 Altri tipi di licenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.4
Differenze tra Windows e GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.4.1
Differenze tra Microsoft Windows e GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . 22
1.4.2
Sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.4.3
Disponibilità di software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.4.4
i18n e l10n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.4.5
Gestione del software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4.6
File system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4.7
Nomi di file e directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4.8
Estensioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4.9
Permessi su file e directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4.10 File nascosti e attributi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4.11 File binari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4.12 Flessibilità nell’uso dell’interfaccia grafica . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.4.13 Interfaccia a riga di comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2
1.4.14 Multiutenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.4.15 Gestione dei processi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.4.16 Sistemi di autenticazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.4.17 Lettere accentate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.4.18 Altre differenze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2 Linux e scuola
2.1
2.2
24
Software libero e scuola . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.1.1
Software libero e scuola . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.1.2
Il sito web linuxdidattica.org . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.3
Dossier Scuola . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.4
WiildSs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.5
Software utile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
iTALC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.1
iTALC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.2
Postazione del docente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.3
Postazione dell’allievo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2.4
Gestione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3 Interfaccia a linea di comando e comandi basilari
3.1
26
Introduzione alla Bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.1.1
Tips and tricks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.1.2
Struttura dei comandi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.1.3
Pagine man . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.1.4
I/O standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.1.5
Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.1.6
Filtri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.1.7
Comandi interattivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.1.8
Funzionamento alternativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.1.9
StdIn e StdOut come file binari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.1.10 Attenzione ai nomi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.1.11 Unione dell’output di più programmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.1.12 Il comando tee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.1.13 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2
Gestione di file e directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.1
Il filesystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.2
Directory principali
3.2.3
Utenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.4
File per la gestione degli utenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.5
Elenco dei file in una directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.6
Creazione e rimozione di una directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.7
Gestione di file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.8
Espansione dei nomi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.9
Comandi come parametri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.10 Operazioni su molti file/directory contemporaneamente . . . . . . . . . . . . . . . . . . . 31
3.2.11 I nodi indice e altre amenità
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.12 Permessi su file e directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.13 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3
Permessi su file e directory
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3.1
Tipi di file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3.2
Tipi di file (2)
3.3.3
Tipi di file — stat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3.4
Tipi di file — find . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3.5
Proprietari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3.6
Permessi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.7
Permessi sulle directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.8
Priorità delle appartenenze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.9
Bit SUID, SGID e Sticky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3.10 Chmod con modalità simbolica o numerica . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.11 UMask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.12 Altri permessi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.13 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4
Ricerche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.4.1
Find . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.4.2
Find - permessi sui file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.4.3
Find - ricerche per intervalli temporali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.4.4
Find - esclusione di directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.4.5
Ricerca interattiva all’interno di un file di testo . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4.6
Grep con ricorsione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4.7
Locate (Slocate) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4.8
Whereis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4.9
Which . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4.10 Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4.11 Lsof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.12 Df . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.13 Du . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.14 A caccia di elefanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.15 Informazioni sul tipo di file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.16 Cancellazioni sicure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.4.17 Cambiare in blocco il nome di file
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.4.18 Pgrep e Pkill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.4.19 Beagle (ricerche desktop) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.5
Operazioni programmate e periodiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5.1
Ora (e data) di sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5.2
Rappresentazione delle date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5.3
Formati di rappresentazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5.4
Fuso orario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4
3.5.5
Modifica dell’ora di sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5.6
L‘ora dell’hardware clock
3.5.7
L’ora esatta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.5.8
Timestamp dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.5.9
Modifica della data di cambiamento di un file . . . . . . . . . . . . . . . . . . . . . . . . . 41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5.10 Creare un file impostandone la data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.5.11 Epoch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.5.12 Uptime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.5.13 Calendario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.5.14 Raffinatezze di ncal
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.5.15 Misurazione del tempo di esecuzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.5.16 Esecuzione programmata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.5.17 Esecuzione programmata (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.5.18 Esecuzione programmata (3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.5.19 Esecuzione batch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.5.20 Sleep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.5.21 Lettura di variabile dalla shell con timeout . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.5.22 Esecuzione periodica: watch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.5.23 Esecuzione periodica: cron
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.5.24 Configurazione di cron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.5.25 E se il calcolatore è spento? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4 Installazione e configurazione
4.1
45
Installazione di Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.1
Verifica della configurazione hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.2
La directory /proc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.3
I comandi ls* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.4
Nomi dei dispositivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.5
Partizioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.6
Controllo del filesystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.1.7
Impostazioni del filesystem (tuning) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.1.8
Debug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.1.9
Il file /etc/fstab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.1.10 Innesto di filesystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.1.11 Sync . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.1.12 Il Filesystem Hierarchy Standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.1.13 Contenuto del FHS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.1.14 Distinzioni tra file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.1.15 Shareable vs. Unshareable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.1.16 Static vs. Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.1.17 Esempio di organizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.1.18 Le directory principali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.2
Gestione pacchetti software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.2.1
Software da sorgenti non pacchettizzati . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5
4.2.2
Checkinstall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.2.3
Il Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.2.4
Librerie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.2.5
/etc/ld.so.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.2.6
Ltrace e Strace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2.7
I pacchetti
4.2.8
Cosa c’è in un pacchetto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2.9
Sistemi di gestione dei pacchetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2.10 Installazione di un nuovo pacchetto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.2.11 Aggiornamento di un pacchetto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.2.12 Installazione di un pacchetto con download da sorgente nota . . . . . . . . . . . . . . . . 50
4.2.13 Da dove viene questo file? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.2.14 Cosa contiene questo pacchetto? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.2.15 Che pacchetti ho installato? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2.16 Dove trovare i pacchetti? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2.17 Il sistema APT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2.18 Archivi APT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2.19 Elenco dei pacchetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2.20 Firme dei pacchetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2.21 Altre cose utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2.22 Creazione e gestione di un mirror APT
5 Amministrazione
5.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
53
Gestione dei processi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.1.1
Gestione dei processi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.1.2
Definizione di processo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.1.3
PID (Process Identifier) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.1.4
PPID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.1.5
Fork . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.1.6
Le chiamate della famiglia exec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.1.7
I processi adottati da Init . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.1.8
I processi zombie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.1.9
L’attesa da parte del processo padre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.1.10 Pstree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.1.11 La directory speciale /proc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.1.12 Informazioni sui processi: ps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.1.13 Ps: opzioni utili
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.1.14 Esecuzione in background e foreground . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.1.15 Gli stati di un processo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.1.16 Invio di segnali ai processi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.1.17 Segnali comuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.1.18 Programmi utili per la gestione dei processi . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.1.19 Gestione delle priorità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.1.20 Gestione interattiva dei processi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6
5.1.21 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2
Backup e compressione dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2.1
Tipi di backup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2.2
Tar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2.3
Tar (lista ed estrazione) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2.4
Tar (estrazione singoli file) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.2.5
Tar e la compressione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.2.6
Tar: riepilogo azioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.2.7
Compressione dei singoli file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.2.8
Decompressione dei singoli file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.2.9
Zip e Unzip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.2.10 Cpio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.2.11 Cpio (modalità copy-pass) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.2.12 Md5sum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.2.13 Rsync . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.2.14 Rsync da/verso altro host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.2.15 Dump e Restore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.2.16 Partimage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.2.17 Backup su CD/DVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.2.18 DVDisaster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.2.19 Sistemi avanzati per il backup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.2.20 Attenzione a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.2.21 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.3
Gestione degli utenti e dei gruppi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.3.1
Utenti e gruppi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.3.2
Il file /etc/passwd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.3.3
Il file /etc/group . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.3.4
Leggere i dati dei database di sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.3.5
Modificare i dati degli utenti e dei gruppi . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.3.6
Aggiungere utenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.3.7
Aggiungere utenti - pattern per gli username . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.3.8
Aggiungere utenti - valori di default . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.3.9
Aggiungere utenti - operazioni batch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.3.10 Aggiungere gruppi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.3.11 Modificare le informazioni sugli utenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.3.12 Eliminare utenti e gruppi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.4
Gestione delle quote disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.4.1
Impostare e gestire le quote disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.4.2
Concetti importanti relativi alle quote disco . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.4.3
Il comando Quota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.4.4
I comandi Quotaon e Quotaoff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.4.5
Il comando Quotacheck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.4.6
Il comando Edquota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
7
5.4.7
Il comando Setquota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.4.8
Sforamento quota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.4.9
Impostazione del Grace period . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.4.10 Rapporto con Repquota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.4.11 Quote disco - esercitazione (1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.4.12 Quote disco - esercitazione (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.4.13 Quote disco - esercitazione (3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.4.14 Quote disco - esercitazione (4) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.4.15 Quote disco - esercitazione (5) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.5
Autorizzazioni e deleghe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.5.1
Permessi sui file
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.5.2
Privilegi utente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.5.3
Corrispondenza tra privilegi e gruppi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.5.4
Su . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.5.5
Su -c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.5.6
Sudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.5.7
Il file /etc/sudoers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.5.8
Esercizio delle deleghe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.5.9
Esecuzione di comandi a nome di altri utenti . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.5.10 Registrazione delle operazioni basate su delega . . . . . . . . . . . . . . . . . . . . . . . . 72
5.5.11 Sudo e ridirezione dell’output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.5.12 Fakeroot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.5.13 Attributi ext2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.5.14 Access Control List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.5.15 Visualizzare le ACL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.5.16 ACL e permessi standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.5.17 Ereditarietà delle ACL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.5.18 Copia di file con ACL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.5.19 PolicyKit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.6
Init e il processo di avvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.6.1
Il processo di avvio (prima parte) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.6.2
Il processo di avvio (seconda parte) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.6.3
Avvio e distribuzioni GNU/Linux
5.6.4
I bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.6.5
Configurazione di init . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.6.6
I runlevel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.6.7
Gli script di avvio dei servizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.6.8
Definizione dei runlevel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.6.9
Configurazione dei runlevel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.6.10 Chkconfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.6.11 Informazioni negli script di avvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.6.12 Sequenze di avvio “moderne” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.6.13 Spegnere il sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
8
5.6.14 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.7
5.8
Inetd e Xinetd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.7.1
Servizi, démoni e processi serventi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.7.2
Il superdemone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.7.3
Configurazione di un servizio gestito dal super-démone . . . . . . . . . . . . . . . . . . . . 79
5.7.4
TCP wrappers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Kernel, gestione, configurazione e compilazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.8.1
Kernel monolitici vs. kernel modulari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.8.2
Che kernel sto usando? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.8.3
Impostazioni dinamiche del kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.8.4
Moduli
5.8.5
Elenco dei moduli caricati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.8.6
Caricamento di un modulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.8.7
Rimozione di un modulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.8.8
Informazioni su un modulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.8.9
Installazione e rimozione semplificate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.8.10 Tipi e formati di kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.8.11 I sorgenti del kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.8.12 Verifica della firma digitale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.8.13 Le fasi della compilazione del kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.8.14 Configurazione del kernel (1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.8.15 Configurazione del kernel (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.8.16 Compilazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.8.17 Compilazione Debian-way e Fedora-way . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.8.18 Initrd e Initramfs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6 Rete
6.1
84
Configurazione di rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.1.1
Concetti importanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.1.2
Maschera di rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.1.3
Interfacce di rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.1.4
Gestione interfacce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.1.5
Gestione indirizzo gateway . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.1.6
Corrispondenza tra indirizzo MAC e IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.1.7
Ip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.1.8
Risoluzione dei nomi di host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.1.9
Programmi di utilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.1.10 Netstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.1.11 Connessioni PPP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.1.12 Ottenimento di indirizzo IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.1.13 Configurazione tramite interfaccia grafica . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.1.14 Strumenti di rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.1.15 Risoluzione dei nomi in una rete locale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.2
Clienti di rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
9
6.3
6.2.1
Clienti per la posta elettronica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.2.2
Programmi per la consegna locale della posta . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.2.3
Clienti FTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.2.4
Clienti web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.2.5
Clienti Telnet, SSH ecc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.2.6
Accesso da sistemi Windows
6.2.7
NetCat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Posta elettronica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.3.1
MTA, MDA e MUA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.3.2
Mail Transport Agent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.3.3
Configurazione di un MTA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
6.3.4
Mail User Agent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
6.3.5
Mail retrieval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
6.3.6
Mail management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
6.3.7
Organizzazione delle cartelle di posta elettronica . . . . . . . . . . . . . . . . . . . . . . . 91
6.3.8
Formati delle mailbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
6.3.9
Procmail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
6.3.10 Esempio di .procmailrc (1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.3.11 Esempio di .procmailrc (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.3.12 Esempio di .procmailrc (3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.3.13 Esempio di .procmailrc (4) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.3.14 File di log di procmail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.3.15 Mailfilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.3.16 Esempio di script per estrarre gli allegati . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.4
Servizi di rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.4.1
Nota preliminare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.4.2
Servizi importanti: MTA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.4.3
Configurazione di Postfix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
6.4.4
Uso di Postfix con relay host esterno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
6.4.5
Postfix con relay host esterno: credenziali . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
6.4.6
Servizi importanti: Apache web server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
6.4.7
Servizi importanti: Network File System (lato server)
6.4.8
Servizi importanti: Network File System (lato client) . . . . . . . . . . . . . . . . . . . . . 94
6.4.9
Servizi importanti: Samba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
. . . . . . . . . . . . . . . . . . . . 94
6.4.10 Servizi importanti: DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.5
Log e gestione degli eventi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.5.1
Tipi di log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.5.2
Dmesg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.5.3
Dove sono i file di log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.5.4
Organizzazione in facility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.5.5
Priorità delle registrazioni di log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.5.6
Configurazione delle attività di log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.5.7
Logger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
10
6.5.8
xconsole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.5.9
Lastlog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.5.10 Rotazione dei file di log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.5.11 Reazione ad eventi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.5.12 File di log delle applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.6
Netfilter e Iptables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.6.1
Tra noi e il mondo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.6.2
Routing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
6.6.3
NAT / Masquerading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
6.6.4
Source NAT / PAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
6.6.5
Destination NAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
6.6.6
Filtering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.6.7
In base a cosa filtrare? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.6.8
Netfilter e Iptables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.6.9
Le tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.6.10 La tabella filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.6.11 La tabella nat
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
6.6.12 La tabella mangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
6.6.13 Le catene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
6.6.14 Comandi Iptables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
6.6.15 Alcuni esempi di comandi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
6.6.16 Save e Restore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
6.6.17 Il problema dell’FTP passivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
6.6.18 I proxy server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
6.7
Samba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
6.7.1
Samba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
6.7.2
Pdbedit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.7.3
Pdbedit - blocco account dopo X tentativi . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.7.4
Pdbedit - scadenza password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.7.5
Pdbedit - lunghezza minima password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.7.6
Pdbedit - obbligo cambio password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
7 Scripting
102
7.1
Personalizzazione dell’ambiente di shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
7.1.1
Variabili e valori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
7.1.2
Variabili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
7.1.3
Esportazione delle variabili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
7.1.4
Variabili d’ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
7.1.5
Variabili d’ambiente interessanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
7.1.6
Modificatori di variabili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.1.7
I prompt della shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.1.8
Personalizzazione del prompt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.1.9
Personalizzazione della variabile PATH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.1.10 Personalizzazione dei colori della lista dei file . . . . . . . . . . . . . . . . . . . . . . . . . 105
11
7.1.11 Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
7.1.12 Funzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
7.1.13 Funzioni wrapper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
7.1.14 Ordine di ricerca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
7.1.15 Qual è l’ambiente? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.1.16 Esecuzione con ambiente modificato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.1.17 Shebang indipendente dalle locazioni dei file . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.1.18 Impostazioni della shell Bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.1.19 File di configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.2
Introduzione allo scripting bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.2.1
Codice di uscita dei programmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.2.2
Utilizzo del codice di uscita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.2.3
Utilizzo del codice di uscita (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.2.4
Il programma test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.2.5
Comparazione di valori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.2.6
Uso dei codici di uscita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.2.7
test, /usr/bin/test o [ ?
7.2.8
Esecuzione degli script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.2.9
Debugging degli script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.2.10 Costrutti importanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.2.11 Parametri della riga di comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.2.12 Guida avanzata di scripting Bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.3
Grep, Sed, Gawk e altri utili filtri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.3.1
Filtri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.3.2
Cut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
7.3.3
Expand e Unexpand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
7.3.4
Fmt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
7.3.5
Head e Tail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
7.3.6
Join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.3.7
Nl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.3.8
Od . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.3.9
Paste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.3.10 Pr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.3.11 Uniq e Wc
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.3.12 Grep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.3.13 Gawk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.3.14 Gawk, estrazione di campi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.3.15 Gawk, estrazione di campi (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.3.16 Gawk, test sui campi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.3.17 Gawk, operazione sui valori dei campi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.3.18 Gawk, separatore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
7.3.19 Gawk, espressioni regolari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
7.3.20 Gawk, controllo del tipo di file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
12
7.3.21 Gawk, riformattazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
7.3.22 Sed, lo stream editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.3.23 Sed, selezione di gruppi di righe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
8 Applicazioni
8.1
115
Vim, l’editor di riferimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
8.1.1
Introduzione a VIM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
8.1.2
Le basi
8.1.3
Ripetizione dell’ultimo comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
8.1.4
Corrispondenza delle parentesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
8.1.5
Modalità visuale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
8.1.6
Macro e registri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
8.1.7
Selezione primaria e clipboard di sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.1.8
Modalità last-line
8.1.9
Ricerche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.1.10 Sostituzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.1.11 Impostazione di opzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.1.12 Divisione della finestra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.1.13 Alcune opzioni interessanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.1.14 Altre cose utili (1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
8.1.15 Altre cose utili (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
8.1.16 Per maggior aiuto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
9 Sicurezza
9.1
9.2
118
Codice in materia di protezione dei dati personali . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
9.1.1
La cosiddetta “Legge sulla privacy” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
9.1.2
Principio di necessità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
9.1.3
Dati personali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
9.1.4
Sanzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
9.1.5
Soggetti coinvolti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
9.1.6
Istruzioni operative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
9.1.7
Misure minime di sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
9.1.8
Obblighi di sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
9.1.9
Misure minime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Sicurezza informatica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
9.2.1
Sicurezza informatica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
9.2.2
Sicurezza informatica / 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
9.2.3
Strategie per la protezione dei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
9.2.4
Norme, obblighi di legge, buone pratiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
9.2.5
Gestione del rischio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
9.2.6
Sicurezza fisica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
9.2.7
Sicurezza logica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
9.2.8
Sicurezza fisica - Integrazione di sistemi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
9.2.9
Sicurezza fisica - Gestione dei server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
13
9.2.10 Sicurezza fisica - Gestione dei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
9.2.11 Sicurezza fisica - Backup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
9.2.12 Sicurezza logica - Credenziali di autenticazione . . . . . . . . . . . . . . . . . . . . . . . . 123
9.2.13 Sicurezza logica - Dominio di autenticazione . . . . . . . . . . . . . . . . . . . . . . . . . . 123
9.2.14 Sicurezza logica - Autorizzazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
9.2.15 Sicurezza logica - Cifratura dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
9.2.16 Sicurezza logica - Protezione della postazione di lavoro . . . . . . . . . . . . . . . . . . . . 123
9.2.17 Sicurezza logica - Sicurezza di rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
9.2.18 Sicurezza logica - Social Engineering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
9.3
Sicurezza e GPG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
9.3.1
GPG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
9.3.2
Cifratura simmetrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
9.3.3
Decifrazione simmetrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
9.3.4
Generazione della chiave con GPG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
9.3.5
Tipo, lunghezza, durata della chiave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
9.3.6
Dati personali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
9.3.7
Generazione effettiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
9.3.8
Rapporto di generazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
9.3.9
Firma digitale di un documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
9.3.10 Firma in file separato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
9.3.11 Verifica della firma digitale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
9.3.12 Fallimento della verifica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
9.3.13 Cifratura per un particolare destinatario . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
9.3.14 Decifrazione del contenuto da parte del destinatario . . . . . . . . . . . . . . . . . . . . . 127
9.3.15 Trasformazione dei file binari in file di testo (e viceversa) . . . . . . . . . . . . . . . . . . 127
9.3.16 Esportazione della propria chiave pubblica . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
9.3.17 Importazione della chiave pubblica altrui nel proprio portachiavi . . . . . . . . . . . . . . 127
9.3.18 Elenco delle chiavi del proprio portachiavi . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
9.4
Sicurezza e SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
9.4.1
SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
9.4.2
Server SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
9.4.3
Client SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
9.4.4
Esecuzione di comandi su calcolatore remoto . . . . . . . . . . . . . . . . . . . . . . . . . 128
9.4.5
Autenticazione senza password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
9.4.6
Autenticazione senza verifica chiave host . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
10 Basi di dati
129
10.1 MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
10.1.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
10.1.2 Ripristino password di root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
10.1.3 Visualizzazione riferimenti esterni con phpMyAdmin . . . . . . . . . . . . . . . . . . . . . 129
10.1.4 Stored procedures - Funzioni (creazione) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
10.1.5 Stored procedures - Funzioni (uso) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
10.1.6 Stored procedures - Parametri in ingresso (creazione) . . . . . . . . . . . . . . . . . . . . . 130
14
10.1.7 Stored procedures - Parametri in ingresso (uso) . . . . . . . . . . . . . . . . . . . . . . . . 130
10.1.8 Stored procedures - Parametri in uscita (creazione) . . . . . . . . . . . . . . . . . . . . . . 130
10.1.9 Stored procedures - Parametri in uscita (uso) . . . . . . . . . . . . . . . . . . . . . . . . . 131
10.1.10 Stored procedures - Creazione di API per l’accesso al DB (1/2) . . . . . . . . . . . . . . . 131
10.1.11 Stored procedures - Creazione di API per l’accesso al DB (2/2) . . . . . . . . . . . . . . . 131
10.1.12 Stored procedures - Cicli e cursori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
10.2 PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
10.2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
10.2.2 Impostazione della password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
10.2.3 Avvio del server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
10.2.4 Creazione di un utente e di un database . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
11 X Window e GNOME
132
11.1 Il sistema grafico XWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
11.1.1 Componenti del sistema X Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
11.1.2 File di configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
11.1.3 Configurazione di X Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
11.1.4 Avvio di X Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
11.1.5 Accesso da sistemi remoti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
11.1.6 La variabile DISPLAY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
11.1.7 Programmi utili
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
11.1.8 Alcune cose da sapere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
11.1.9 Xnest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
11.1.10 Xnest - GIMP in una sola finestra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
11.1.11 tdfsb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
11.1.12 Cattura di una schermata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
11.1.13 Cattura video desktop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
11.2 GNOME, l’interfaccia standard di Ubuntu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
11.2.1 GNOME
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
11.2.2 Personalizzazione di GNOME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
11.2.3 Aree di lavoro e finestre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
11.2.4 Tastiera e caratteri speciali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
11.2.5 Combinazione di tasti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
11.2.6 Compose key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
11.2.7 Esempi di composizione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
11.2.8 Usare i codici UNICODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
11.2.9 Definizione di una tastiera personalizzata . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
11.2.10 Nautilus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
11.2.11 Informazioni aggiuntive su file e directory . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
11.2.12 Editor di configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
11.2.13 gconftool–2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
11.2.14 Impostazione della modalità di visualizzazione dei permessi . . . . . . . . . . . . . . . . . 137
11.2.15 Compiz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
11.2.16 Compiz - effetto desktop cubico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
15
11.2.17 Compiz - finestre tremolanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
11.2.18 Beagle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
11.2.19 Accessibilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
11.2.20 Tecnologie assistive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
11.2.21 Configurazione di sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
16
1
Introduzione
1.1
1.1.1
Questa cassetta
A chi è rivolta
Questa raccolta di appunti, che ho chiamato “cassetta degli attrezzi” per sottolinearne l‘aspetto pragmatico/operativo, serve a dare un po’ di organicità a degli appunti su cose che mi sembra possano servire ad un sistemista
Linux, ma anche ad un utente casalingo curioso.
Non vuole essere un documento tecnico complesso, con la spiegazione di tutta la teoria che c’è dietro le cose,
ma solo un riferimento agile e snello da consultare “alla bisogna”.
Là dove è stato possibile, ho pensato che fosse meglio rinviare ad altre fonti, innumerevoli, per approfondimenti.
1.1.2
Formati e diffusione
Visto che uso questi appunti sia a mo’ di presentazione sia per fornire dispense a studenti ed allievi di corsi
di formazione, ho pensato che fosse utile avere a disposizione uno strumento che mi consentisse di generare, in
maniera semplice ed agevole, entrambe le cose a partire da un’unica fonte.
Dopo un po’ di ricerche, ho optato per un mix di strumenti (che dovrò documentare qui. . . ) che mi consentono di
partire da semplici file di testo in formato markdown per ottenere presentazioni in formato S5 e un documento
PDF:
• pandoc, per la traduzione di markdown in S5 e latex
• latex, per ottenere il file PDF
• pdftk, per mettere la copertina
• uno script bash, per tenere il tutto insieme
Il meccanismo di conversione non è esente da difetti.
1.1.3
Errori
Probabilmente ce ne sono diversi. Se ne trovate, segnalatameli. Grazie.
Ovviamente, qualsiasi problema sorga nel vostro calcolatore utilizzando quello che trovate qui descritto non
mi dovrà essere attribuito. Leggete tutto come se fosse un romanzo di fantascienza, e fate delle prove solo su
calcolatori in cui non avete nessun documento importante.
1.1.4
Licenza
Figura 1: Licenza CC
La mia cassetta degli attrezzi Linux è rilasciata ai sensi della licenza Creative Commons Attribuzione-Non
commerciale-Condividi allo stesso modo 2.51 .
1.2
1.2.1
Bibliografia e documentazione
PDF
Alcuni libri completi disponibili in PDF:
• Daniele Giacomini, Appunti di informatica libera2
1 http://creativecommons.org/licenses/by-nc-sa/2.5/it/
2 http://informaticalibera.net/
17
• Simone Piccardi, Amministrare GNU/Linux3
• Keir Thomas, Ubuntu Pocket Guide and Reference4
• Daniele Medri, Linux facile5
• Javier Fernández-Sanguino Peña, Securing Debian Manual6
• Riccardo Cavalieri, Ubuntu per tutti!7
1.2.2
Libri
Alcuni libri (di carta!) per approfondire:
• Nemeth, Snyder e Hein, Linux Administration Handbook (2nd Edition)
• Widling e Behman, Self Service Linux
1.2.3
Siti web
Sono ovviamente moltissimi. Per cominciare:
• The Linux Documentation Project8
• Linux Journal9
1.2.4
Man
Le pagine man costituiscono la tradizionale fonte di informazione per i sistemi Un*x. Ogni pagina di manuale
descrive un programma, un comando, il formato di un file di configurazione, ecc.
Le pagine sono suddivise in diverse sezioni.
Se per una parola chiave esiste sia un comando sia un nome di file, può essere necessario specificare la sezione.
$ man crontab
# equivale a "man 1 crontab": descrive come si usa il comando
$ man 5 crontab
# descrive il formato del file usato dal comando crontab
TIP: All’interno delle pagine di manuale si possono fare ricerche (basate su espressioni regolari) digitando / e
il termine da cercare. Digitando n si passa al successivo termine trovato.
TIP: Se si desiderano pagine man colorate, si può installare il programma most e impostare export PAGER=most
nella propria configurazione bash.
1.2.5
Whatis
Il programma whatis consulta il database delle pagine man e restituisce la descrizione del comando.
$ whatis more
more (1)
$ whatis less
less (1)
$ whatis man
man (1)
man (7)
- file perusal filter for crt viewing
- opposite of more
- an interface to the on-line reference manuals
- macros to format man pages
3 http://www.lulu.com/content/752924
4 http://www.ubuntupocketguide.com/index
main.html
5.0–1.pdf
6 http://www.debian.org/doc/manuals/securing-debian-howto/securing-debian-howto.en.pdf
7 http://www.stampalternativa.it/liberacultura/?p=187
8 http://tldp.org/
9 http://www.linuxjournal.com
5 http://linuxfacile.medri.org/download/linuxfacile
18
1.2.6
Apropos
Il programma apropos fa una ricerca nelle descrizioni delle pagine man in base alla parola chiave specificata. È
l’equivalente di man -k.
$ apropos sudoers
sudoers (5)
visudo (8)
$ man -k sudoers
sudoers (5)
visudo (8)
1.2.7
- list of which users may execute what
- edit the sudoers file
- list of which users may execute what
- edit the sudoers file
Info
Una parte della documentazion del software della Free Software Foundation è mantenuta in formato Texinfo,
che permette una produzione di documentazione ipertestuale e con formati multipli di output (pagine info,
pagine web, documentazione cartacea). Vi si accede con il programma info.
Per navigare le pagine info sono utili i seguenti comandi:
• Tab (passare al link successivo)
• Enter (seguire il link corrente)
• p e n (pagina precedente e successiva)
• ? (informazioni sui comandi)
• q (uscita)
1.2.8
—help
Alcuni programmi hanno pagine man stringate e rendono disponibile la documentazione tramite l’opzione -help,
--help o -h sulla riga di comando. Altri (ad esempio, less) offrono una sintesi dei comandi principali.
$ convert -help
Version: ImageMagick 6.2.4 10/03/07 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2005 ImageMagick Studio LLC
Usage: convert [options ...] file [ [options ...] file ...] [options ...] file
Where options include:
-adjoin
join images into a single multi-image file
-affine matrix
affine transform matrix
[snip]
1.2.9
/usr/share/doc
Molta documentazione è disponibile, spesso in formato ipertestuale o di testo puro, nella directory /usr/share/doc.
1.2.10
HOWTO e WWW
Una fonte notevole di documentazione, dagli HOWTO su particolari dispositivi o programmi ai post nei blog
degli utenti, è disponibile su Web.
In particolare, merita di essere segnalato il Linux Documentation Project10 , con le traduzioni in italiano a cura
del PLUTO.
Suggerimento: se si cercano informazioni su un messaggio di errore che appare con l’esecuzione di un programma,
è meglio che questo messaggio non sia localizzato (tradotto). Si può invocare il programma premettendo la
stringa LANG=C.
10 http://www.tlpd.org
19
1.3
1.3.1
Il concetto di software libero
Il software
Classificazioni del software:
• per tipologia
• per licenza
• per metodologia di sviluppo
• per . . .
1.3.2
Programma
Un programma è un insieme di istruzioni che devono essere eseguite da un calcolatore.
Esistono programmi di diversa natura e di diversa complessità.
Un programma può:
• essere interattivo o meno
• esporre diversi tipi di interfaccia utente (es. a “riga di comando”, grafica, web).
1.3.3
Applicazione
Per applicazione si intende un programma (o un insieme di programmi) che svolgono qualcosa di concretamente
utile per l’utente finale.
1.3.4
Sistema operativo
Un sistema operativo è un programma (o un insieme di programmi) che ha lo scopo di permettere l’uso concreto
di un calcolatore e l’accesso alle sue risorse.
I compiti fondamentali di un sistema operativo sono:
• mascherare la complessità dell’hardware, fornendo appositi livelli di astrazione
• fornire meccanismi per la condivisione (nel tempo e nello spazio) di risorse tra diversi programmi/utenti
1.3.5
Programma sorgente ed eseguibile
Un esempio di programma:
#include <stdio.h>
int main()
printf("Hello, world!\n");
return 0;
Il programma sorgente viene compilato per ottenere un programma eseguibile (dalla “ricetta” si ottiene la torta).
Mangereste un alimento (o assumereste un farmaco) di cui nessuno conosce la ricetta (salvo chi l’ha prodotto)?
20
1.3.6
Free Software Foundation
La Free Software Foundation è un’organizzazione senza scopo di lucro che ha come obiettivo la promozione dello
sviluppo di software libero, definito tramite le seguenti caratteristiche:
• libertà di eseguire il programma per qualsiasi scopo
• libertà di studiare il programma e modificarlo
• libertà di copiare il programma in modo da aiutare il prossimo
• libertà di migliorare il programma e di distribuirne pubblicamente i miglioramenti, in modo tale che tutta
la comunità ne tragga beneficio
La FSF ha, tra le altre cose, promosso la creazione di una versione di sistema operativo completo, ispirato a
Linux, chiamato GNU (GNU’s Not Unix ).
1.3.7
Copyright e Copyleft
Il software, come qualsiasi opera d’ingegno, è tutelato dal diritto d’autore: chi lo produce ha il diritto di:
• essere riconosciuto come autore
– diritti morali
– diritti patrimoniali
• indicare limiti e condizioni nell’utilizzo
Nel mondo anglosassone esiste il concetto di copyright (lett. “diritto sulle copie”), sulla base del quale sono
state elaborate delle licenze che, a determinate condizioni, concedono diritti anziché limitarli. Con un gioco di
parole, si parla di copyleft.
1.3.8
Licenze
La FSF ha promosso alcuni tipi di licenze con cui un programmatore può distribuire il software prodotto:
• GNU GPL (General Public License)
• GNU LGPL (Lesser General Public License)
• GNU AGPL (Affero General Public License)
Altre licenze (non FSF) prevedono la distribuzione del codice sorgente, con maggiori o minori restrizioni.
1.3.9
Open Source
L’Open Source Initiative ha stilato una lista di caratteristiche che una licenza deve avere per essere considerata
open source:
• libera ridistribuzione
• disponibilità del codice sorgente
• permesso di ottenere prodotti derivati
• eventuale possibilità di garantire l’integrità del codice sorgente originale
• non discriminazione contro persone o gruppi
• non discriminazione per campo d’applicazione
• distribuzione della licenza con il programma
• specificità ad un prodotto
• divieto di vincoli su altro software
• neutralità rispetto alle tecnologie
21
1.3.10
Altri tipi di licenza
Molto software viene distribuito con licenze diverse, che solitamente vengono raggruppate nelle seguenti categorie:
• shareware
– pizzaware
– postcardware
– ...
• freeware
• public domain
1.4
1.4.1
Differenze tra Windows e GNU/Linux
Differenze tra Microsoft Windows e GNU/Linux
Tra i sistemi operativi Windows e GNU/Linux esistono differenze notevoli in termini di:
• licenze e modalità di distribuzione
• costi
• sicurezza
• flessibilità
• disponibilità di aggiornamenti
• disponibilità di software
• i18n e l10n
• filosofia implementativa
• organizzazione del filesystem
1.4.2
Sicurezza
Virus e malware. Con Windows ci sono più rischi a causa di:
• maggior diffusione
• minore sicurezza intrinseca (es. frequente necessità di lavorare come amministratore)
Al riguardo, può essere utile la lettura di Linux, Unix e i virus11 .
1.4.3
Disponibilità di software
A seconda del tipo di software, può esserci una disponibilità maggiore per Windows o per Linux.
Ad esempio, è lecito aspettarsi un maggior numero di programmi di contabilità per Windows e un maggior
numero di applicazioni scientifiche per Linux.
I driver (programmi per l’uso di determinate periferiche) spesso sono resi disponibili (dal produttore hardware)
solo per Windows.
1.4.4
i18n e l10n
I programmi per Linux sono molto spesso internazionalizzati e localizzati nelle diverse lingue (e/o per le diverse
culture).
È possibile usare uno stesso programma in diverse lingue, e l’intera interfaccia utente può seguire le preferenze
dell’utente.
11 http://it.wikibooks.org/wiki/Linux
Unix e i virus
22
1.4.5
Gestione del software
Il software viene gestito da Linux, generalmente, in maniera centralizzata. Con un paio di clic si può aggiornare
il sistema operativo e anche tutto il software applicativo. In Windows invece ogni applicazione ha storia a sé.
In Windows il programma X viene installato in una directory con tutto ciò che gli compete (es. documentazione,
file di esempio, ecc.).
In Linux il software è installato con una suddivisione dei file tra diverse directory (eseguibili in una directory,
documentazione in un’altra, file di configurazione in un’altra ancora, ecc.).
1.4.6
File system
In Windows vi è il supporto solo di NTFS e FAT32. Linux supporta oltre cento diversi tipi di filesystem (es.
ext2, ext3, reiserfs, hfs, hpfs, ecc.).
In Windows il file system è organizzato in maniera dipendente dalla posizione fisica dei dischi (es. disco C, D,
E, ecc.), mentre Linux gestisce un unico file system gerarchico, con un’unica radice ed un meccanismo di punti
di innesto (detti mount points).
Linux gestisce i link simbolici, Windows solo i collegamenti (che sono cosa ben diversa).
Linux usa tabelle di nodi indice con meccanismi di indirizzamento ai blocchi, che non crea necessità di deframmentazione del disco.
1.4.7
Nomi di file e directory
Linux, per quanto riguarda i nomi dei file e delle directory, è case-sensitive (sensibile alla differenza tra maiuscole
e minuscole). In una stessa directory posso avere i file lettera, Lettera e LETTERA.
Windows invece è case-preserving: memorizza i nomi con le maiuscole cosı̀ come li si scrive (salvo qualche caso),
ma non tiene in considerazione la differenza quando si fanno ricerche.
Il carattere separatore nei percorsi per Linux è la barra ordinaria (/ ), mentre per Windows è quella rovescia
(\).
1.4.8
Estensioni
In Windows il concetto di estensione per i nomi dei file è parte integrante del sistema operativo. Ad esempio,
un programma eseguibile deve avere l’estensione .EXE, un file batch deve avere l’estensione .BAT, ecc.
In Linux il sistema operativo in quanto tale non usa il concetto di estensione. Sono le singole applicazioni che, se
lo desiderano, possono usare le estensioni a qualche fine. Ad esempio, un compilatore di programmi C potrebbe
rifiutarsi di compilare un file sorgente se questi non ha l’estensione .c.
1.4.9
Permessi su file e directory
I permessi su file e directory di Windows sono più granulari e dettagliati di quelli tradizionali di Unix (per le
versioni di Windows che usano NTFS, come Windows 2000, XP, Vista, ecc.).
Linux permette di ottenere granularità paragonabili tramite strumenti aggiuntivi (attributi estesi, access control
lists, meccanismi di delega).
1.4.10
File nascosti e attributi
In Windows i file hanno degli attributi speciali, quali nascosto, da archiviare, di sistema.
In Linux i file vengono considerati nascosti quando il loro nome inizia con un punto.
Gli altri attributi non esistono, poiché non servono (si possono utilizzare le date o le posizioni per ottenere le
informazioni necessarie).
1.4.11
File binari
In Windows vi è una differenza nel modo in cui vengono considerati file binari e file di testo. In Linux non c’è
questa distinzione (in un certo senso, tutti i file sono considerati binari).
23
1.4.12
Flessibilità nell’uso dell’interfaccia grafica
Windows impone l’uso di un’interfaccia grafica, che è integrata con il sistema operativo. Il crash dell’interfaccia,
o di una qualsiasi applicazione, compromette la stabilità dell’intero sistema.
In Linux l’ambiente grafico è applicazione separata e può essere attivata o meno, a scelta.
Inoltre:
• il server grafico può essere attivato su un calcolatore remoto
• esistono diversi tipi di Desktop Manager tra cui l’utente può scegliere
• un utente ha a disposizione più desktop
1.4.13
Interfaccia a riga di comando
Linux mette a disposizione un’ampia gamma di interfacce di amministrazione (shell ). La shell più comunemente
usata si chiama bash (Bourne Again Shell) ed è flessibile e potente.
In Windows esiste un interprete dei comandi (cmd.exe), poco pratico, oppure, ma come componente aggiuntivo
da installare separatamente, Windows PowerShell.
1.4.14
Multiutenza
Linux è intrinsecamente multiutente: sullo stesso calcolatore possono lavorare, contemporaneamente, più utenti,
sia con interfaccia grafica sia in emulazione di terminale.
In Windows la multiutenza è tale solo nel senso che utenti diversi possono succedersi nell’uso del calcolatore, a
turno (salvo il caso di uso dei Remote Desktop Services, componenti aggiuntive).
1.4.15
Gestione dei processi
I processi in Linux sono organizzati in maniera gerarchica: ogni processo discende da un processo padre.
Terminando un processo, si terminano tutti i suoi discendenti (salvo casi particolari appositamente gestiti).
In Windows tutti i processi hanno lo stesso livello.
1.4.16
Sistemi di autenticazione
Linux usa un sistema di autenticazione modulare (Pluggable Authentication Module), che consente diverse
modalità (file semplici, LDAP, dominio Windows, ecc.). Windows è molto più limitato in proposito.
1.4.17
Lettere accentate
Con Linux è facile scrivere una È ! (basta usare il tasto fissa-maiuscole).
1.4.18
Altre differenze
Ulteriori informazioni si possono trovare su Why Linux is better12 .
2
Linux e scuola
2.1
2.1.1
Software libero e scuola
Software libero e scuola
Esistono molti validi motivi per usare software libero nella scuola:
• educazione alla legalità
12 http://www.whylinuxisbetter.net/index
it.php
24
• educazione alla libertà
• educazione alla collaborazione
• educazione alla curiosità intellettuale
• economicità
2.1.2
Il sito web linuxdidattica.org
Il sito web linuxdidattica.org13 contiene informazioni e risorse legate alle attività nelle scuole basata sul software
libero.
È raccomandabile iscriversi alla mailing list [email protected] , collegata al sito web.
2.1.3
Dossier Scuola
Il Dossier Scuola15 è un’opera collettiva che mira a documentare motivazioni, software, esperienze, progetti
nell’ambito della scuola e della didattica.
2.1.4
WiildSs
WiildOs è una distribuzione Linux pensata per l’uso delle lavagne multimediali interattive nella scuola. È
supportata da una comunità molto attiva.
2.1.5
Software utile
• iTalc16 può essere utilizzato per monitorare i calcolatori di un laboratorio didattico ed effettuare presentazioni
• SchoolTool17 è una suite di programmi liberi per l’amministrazione delle scuole
2.2
2.2.1
iTALC
iTALC
iTALC è uno strumento che consente di operare in un laboratorio scolastico gestendo da remoto le postazioni
di lavoro degli studenti.
Vedremo come installare e gestire iTALC sotto Ubuntu.
Ulteriori informazioni si possono trovare in Informazioni sull’installazione sotto Ubuntu18
2.2.2
Postazione del docente
Sulla postazione del docente installare i pacchetti italc-client e italc-master.
Poi:
$ sudo ica -role teacher -createkeypair
creating new key-pair ...
...done, saved key-pair in
/etc/italc/keys/private/teacher/key
and
/etc/italc/keys/public/teacher/key
$
$
$
$
$
$
sudo
sudo
sudo
sudo
sudo
sudo
addgroup italc
adduser <usernamedocente> italc
chown root:italc -R /etc/italc/keys/public
chown root:italc -R /etc/italc/keys/private
chmod -R 750 /etc/italc/keys/private
chmod -R 755 /etc/italc/keys/public
13 http://linuxdidattica.org
14 http://lists.linux.it/listinfo/scuola/
15 http://www.dossierscuola.it/
16 http://italc.sourceforge.net/
17 http://schooltool.org/
18 http://www.mikedo.it/sistemi-operativi/26-amministrazione/41-installiamo-italc-su-ubuntu–810.html
25
2.2.3
Postazione dell’allievo
Sulla postazione dell’allievo installare il pacchetto italc-client.
Poi sovrascrivere il file /etc/italc/keys/public/teacher/key con il file corrispondente generato sul calcolatore del docente.
2.2.4
Gestione
La gestione è sufficientemente intuitiva.
Figura 2: iTALC
3
Interfaccia a linea di comando e comandi basilari
3.1
3.1.1
Introduzione alla Bash
Tips and tricks
Esiste l’autocompletamento:
• dei comandi
• dei nomi di file e directory
pdf[tab][tab]
ls /etc/a[tab][tab]
Esistono scorciatoie:
• “alt” + “.”
• “freccia su” e “freccia giù”
• history
26
3.1.2
Struttura dei comandi
La struttura base dei comandi è la seguente:
• impostazione di variabili
• percorso
• comando
• parametri
– opzioni
– argomenti
Alcuni esempi:
/bin/cat -n /etc/services
cat --number /etc/services
tar xvzf archivio.tgz
# diverso da tar xvfz archivio.tgz, non corretto
tar -xvzf archivio.tgz
tar -x -v -z -f archivio.tgz
tar --extract --verbose --ungzip --file archivio.tgz
LC_TIME=POSIX cal
ls unarchivio -l
chmod unarchivio +x
3.1.3
# possibile
# errato
Pagine man
Una pagina man ha normalmente le seguenti sezioni:
• name (nome)
• synopsis (sintesi della sintassi)
• description (descrizione)
• options (opzioni)
• see also (vedere anche)
• author (autore)
• copyright
3.1.4
I/O standard
Esistono tre file standard per l’I/O:
• standard input (0)
• standard output (1)
• standard error (2)
Esempio:
cal > calendario
sort < calendario
ls /directory_non_esistente 2> errore
3.1.5
Pipeline
Le pipeline servono a far sı̀ che l’output di un programma diventi l’input di un altro programma:
getent services | sort
getent passwd | grep bash | wc -l
27
3.1.6
Filtri
Molti programmi agiscono da filtro:
• ricevono un input
• eseguono delle azioni su di esso
• producono un output
Alcuni esempi:
cal | tac
cal | rev
cal | tac | rev
getent passwd | cut -d: -f1 | tail -3
who | wc -l
3.1.7
Comandi interattivi
I programmi interattivi non esauriscono il loro compito senza intervento dell’utente:
getent passwd | more
getent services | less
man passwd
man 5 passwd
3.1.8
Funzionamento alternativo
Molti programmi possono agire in diverso modo a seconda del modo in cui sono invocati:
• lettura dello standard input o di un file?
• scrittura sullo standard output o su un file?
• funzionamento interattivo o come filtro?
Alcuni esempi:
grep testo miofile
grep testo > miofile
cat miofile | grep testo
3.1.9
StdIn e StdOut come file binari
A differenza di quanto avviene nel mondo dos/windows, i file di standard input e di standard output possono
essere file binari di contenuto arbitrario.
Ad esempio, si può usare cat per concatenare “pezzi” di file binario (ottenuti con split) e ricostruire l’originale.
$ split --bytes 2000 --numeric-suffixes /usr/bin/cal
$ ls
x00 x01 x02 x03 x04 x05
$ cat x* > my_cal
$ ls
my_cal x00 x01 x02 x03 x04 x05
3.1.10
Attenzione ai nomi
Alcune cose a cui è necessario prestare attenzione:
• i nomi dei file (e dei comandi) sono case-sensitive (sensibili alla differenza tra maiuscole e minuscole)
• i parametri contenenti spazi devono essere gestiti con virgolette o con sequenze di escape
Esempi:
touch un\ nome\ con\ spazi
touch "un altro nome con spazi"
touch ’un terzo nome con spazi’
28
3.1.11
Unione dell’output di più programmi
A volte può essere necessario considerare l’output di due programmi come unico, per le elaborazioni successive.
(cal 2006; cal 2007) | tr [:lower:] [:upper:]
3.1.12
Il comando tee
A volte può essere necessario salvare su file l’output di un programma, mantenendo l’uscita comunque sullo
standard output, per le elaborazioni successive.
(cal 2006; cal 2007) | tee copia | tr [:lower:] [:upper:]
3.1.13
Esercizi
Alcuni esercizi:
• creare un file di testo usando cat per la lettura dello standard input e la ridirezione per la scrittura su file
• creare una pipeline per mostrare i primi cinque servizi internet in ordine alfabetico
• verificare cosa succede se si usa l’operatore >> al posto del semplice > per la ridirezione dell’output
• provare a ridirigere su un file sia lo standard output sia lo standard error, mediante la ridirezione 2>&1
3.2
3.2.1
Gestione di file e directory
Il filesystem
Il filesystem dei sistemi Un*x:
• è basato su un unico albero, con un’unica radice
• è indipendente dalla collocazione fisica dei file sui vari dischi
• sfrutta un meccanismo di “innesto”, in directory tipicamente vuote, di filesystem subordinati
Linux
• permette l’uso di diversi tipi di filesystem (ext2, ext3, fat, reiserfs, ecc.)
• permette l’uso di sistemi RAID (redundant array of independent disks) e di volumi logici
3.2.2
|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|--
Directory principali
bin
boot
dev
etc
home
lib
media
mnt
opt
proc
root
sbin
sys
tmp
usr
var
programmi eseguibili principali
file per l’avvio del calcolatore
dispositivi
file di configurazione di sistema
directory personali degli utenti
librerie
dispositivi esterni
file system subordinati secondari
eseguibili da pacchetti non standard
directory virtuale per i processi
directory dell’utente root
eseguibili per l’amministrazione
directory virtuale per i dispositivi
directory per file temporanei
documentazione, librerie, programmi
dati delle applicazioni
29
3.2.3
Utenti
Esistono tre categorie di utenti:
• root, l’amministratore del sistema
• utenti di sistema (es. per gestione servizi)
• utenti ordinari (umani)
(rinvio) Esistono dei meccanismi che consentono a root di delegare altri utenti a compiere delle operazioni.
3.2.4
File per la gestione degli utenti
Tradizionalmente le informazioni sugli utenti del sistema sono mantenuti nei seguenti file:
• /etc/passwd
• /etc/shadow
• /etc/group
L’autenticazione può avvenire anche con sistemi diversi da quelli tradizionali (LDAP, SMB, ecc.)
3.2.5
Elenco dei file in una directory
Il comando ls permette di mostrare il contenuto di una directory:
ls
ls -l
ls -a
ls -F
#
#
#
#
elenco
elenco
mostra
mostra
dei file
con dettagli
anche i file nascosti
il tipo
Altri comandi utili:
tree
find
# visualizzazione ad albero
# ricerca
3.2.6
Creazione e rimozione di una directory
Una directory è, nella sostanza, un file speciale che elenca altri file.
• creazione: mkdir nome_directory
• rimozione: rmdir nome_directory
Le directory non vuote possono essere rimosse con la rimozione ricorsiva (rm -rf).
Per spostarsi da una directory ad un’altra, si usa il comando cd.
I percorsi (path) indicati possono essere assoluti (se iniziano dalla radice, ad esempio /var/log) o relativi (ad
esempio ../lavori).
3.2.7
Gestione di file
Sui file si possono eseguire molte operazioni.
• copia: cp
• spostamento/ridenominazione: mv
• rimozione: rm
• controllo del tipo: file
30
• visualizzazione di informazioni: stat
• aggiornamento ultima modifica/accesso: touch
• comparazione: cmp
• ...
A differenza che nel mondo dos/windows, l’estensione nel nome di un file non ha significato a livello di sistema,
ma solo a livello di singola applicazione.
Si considerano file nascosti quelli il cui nome inizia con un punto.
3.2.8
Espansione dei nomi
Per ottenere più parametri in modo sintetico, la bash offre il meccanismo dell’espansione:
• con parentesi graffa:
– a{d,c,b}e è espanso in ade ace abe
– a{1..5}e è espanso in a1e a2e a3e a4e a5e
• della tilde: ~ è la propria home directory, ~mario è quella dell’utente mario
• basata su pattern: * per qualsiasi stringa (compresa la stringa nulla), ? per qualsiasi carattere
• basata sui nomi dei file effettivamente presenti: [a-z] per qualsiasi carattere tra la a e la z
• aritmetica: $((1+3)) corrisponde a 4
• basata sull’interpretazione di comandi: mkdir $(whoami) o mkdirwhoami“crea una directory con il proprio
identificativo
Inoltre, . è un riferimento alla directory corrente, .. è un riferimento alla directory di livello superiore.
3.2.9
Comandi come parametri
A volte è utile poter utilizzare l’output di un comando come lista di parametri di un altro comando.
$ cat elenco
mario giorgio stefania donata
$ mkdir $(cat elenco)
$ mkdir $(date -I)
$ mv $(cat elenco) $(date -I)
Nota: per lo stesso scopo è possibile l’uso del backtick.
3.2.10
Operazioni su molti file/directory contemporaneamente
Molti comandi permettono di operare su diversi file contemporaneamente.
mkdir uno due tre "quattro cinque"
touch pagina{1..40}.html
mkdir -p miadir/{a,b,c}/file{1,2,3,4}
Se il comando accetta un solo parametro, lo si può utilizzare in un ciclo oppure con xargs.
for utente in $(cat elenco); do useradd $utente; done
cat elenco | xargs useradd
Nota: a differenza di quanto accade nel mondo dos/windows, l’espansione è a carico della shell, non del singolo
programma.
31
3.2.11
I nodi indice e altre amenità
(rinvio)
• All’interno di una directory viene creato un collegamento al nodo indice di un file
• Un file può avere più nomi
• Esistono link simbolici
3.2.12
Permessi su file e directory
I permessi vengono gestiti in tre terzetti:
• permessi del proprietario (owner )
• permessi del gruppo proprietario (group)
• permessi degli altri (others)
In ogni terzetto sono presenti i seguenti permessi:
• lettura
• scrittura
• esecuzione
Il comando chmod permette di cambiare i permessi.
3.2.13
Esercizi
• Esplorare il filesystem con i comandi cd e ls
• Creare un file di testo con un elenco di nomi e cognomi su più righe (nomecognome); utilizzare il file per
creare una directory per ogni coppia nome-cognome (suggerimento: usare la variabile d’ambiente IFS, un
ciclo for, oppure xargs)
• Scaricare con wget il file es_file_01.zip, scompattarlo con unzip e seguire le istruzioni contenute in
esso
3.3
3.3.1
Permessi su file e directory
Tipi di file
In un sistema Un*x ogni dispositivo è visto come un file. Vi sono questi diversi tipi di file:
• file normali
• directory
• file speciali a blocchi
• file speciali a caratteri
• link simbolici
• fifo (named pipes)
• socket
32
3.3.2
Tipi di file (2)
Con ls -l la prima colonna dell’output mostra il tipo di file. Si veda il seguente esempio:
$ ls -ld /etc/passwd /dev/hda /dev/lp0 /home /etc/rc0.d/K01gdm \
/usplash_fifo /dev/log
brw-rw---- 1 root disk 3, 0 2007-12-02 09:23 /dev/hda
srw-rw-rw- 1 root root
0 2007-12-02 09:24 /dev/log
crw-rw---- 1 root lp
6, 0 2007-12-02 09:24 /dev/lp0
-rw-r--r-- 1 root root 2272 2007-11-06 20:42 /etc/passwd
lrwxrwxrwx 1 root root
13 2006-09-06 18:49 /etc/rc0.d/K01gdm -> ../init.d/gdm
drwxr-xr-x 14 root root 4096 2007-11-06 20:42 /home
prw-r----- 1 root root
0 2006-09-07 21:49 /usplash_fifo
3.3.3
Tipi di file — stat
Informazioni specifiche sui file si possono ottenere con stat:
$ stat /dev/lp0 File: ‘/dev/lp0’
Size: 0
Blocks: 0
IO Block: 4096
file speciale a caratteri
Device: dh/13d Inode: 15020
Links: 1
Device type: 6,0
Access: (0660/crw-rw----) Uid: (
0/
root)
Gid: (
7/
lp)
Access: 2007-12-02 09:24:19.880479329 +0100
Modify: 2007-12-02 09:24:19.880479329 +0100
Change: 2007-12-02 09:24:19.880479329 +0100
$ stat /dev/hda
File: ‘/dev/hda’
Size: 0
Blocks: 0
IO Block: 4096
file speciale a blocchi
Device: dh/13d Inode: 7552
Links: 1
Device type: 3,0
Access: (0660/brw-rw----) Uid: (
0/
root)
Gid: (
6/
disk)
Access: 2007-12-02 09:24:27.544626181 +0100
Modify: 2007-12-02 09:23:58.860390973 +0100
Change: 2007-12-02 09:24:12.253154183 +0100
3.3.4
Tipi di file — find
Si possono cercare file di un determinato tipo con find:
$ find / -type c 2> /dev/null
/lib/udev/devices/net/tun
/lib/udev/devices/ppp
/lib/udev/devices/kmem
/lib/udev/devices/console
/lib/udev/devices/null
...
...
3.3.5
Proprietari
Ogni file è di proprietà di un determinato utente e di un determinato gruppo.
I permessi sul file sono relativi all’utente proprietario e al gruppo proprietario.
Root può cambiare il proprietario di un file con chown.
Un utente può cambiare il gruppo proprietario di un file con chgrp (scegliendo tra i gruppi a cui appartiene)
$ ls -l unfile
-rw-r--r-- 1 loris jasiu 0 2007-12-02 11:31 unfile
$ id
uid=1000(loris) gid=1004(jasiu) gruppi=4(adm),6(disk),20(dialout),21(fax),24(cdrom),25(floppy),26(tape),
29(audio),30(dip),40(src),44(video),46(plugdev),104(lpadmin),105(scanner),128(admin),1004(jasiu)
$ chgrp audio unfile
$ ls -l unfile
-rw-r--r-- 1 loris audio 0 2007-12-02 11:31 unfile
Sono possibili comandi ricorsivi e abbreviati (vedere man page).
33
3.3.6
Permessi
I permessi sono di tre tipi e sono organizzati in terzetti di bit:
• lettura (primo bit, r)
• scrittura (secondo bit, w)
• esecuzione (terzo bit, x)
Ci sono tre terzetti, riferiti al proprietario, al gruppo proprietario, agli altri.
$ ls -l silence
-rwxr-xr-- 1 loris audio 168 2007-12-02 14:21 silence
Il file “silence” è leggibile, scrivibile ed eseguibile dal suo proprietario, leggibile ed eseguibile dagli appartenenti
al gruppo audio, solo leggibile dagli altri utenti del sistema.
3.3.7
Permessi sulle directory
Nelle directory, i permessi significano:
• lettura: accedere all’elenco dei contenuti di una directory
• scrittura: aggiungere o eliminare file alla directory
• esecuzione: entrare nella directory (es. con cd)
Immaginandosi una directory come una tabella contenente i nomi dei file e i relativi i-node, leggere una directory
significa poter scorrere l’elenco dei nomi, mentre scrivere in una directory significa poter aggiungere, modificare
o eliminare righe nella tabella.
Il permesso di esecuzione consente di accedere alla parte della tabella contenente gli i-node.
3.3.8
Priorità delle appartenenze
I permessi vengono valutati a partire dal proprietario. Se si è proprietari di un file e quel file non è leggibile dal
proprietario ed è leggibile dal gruppo cui si appartiene, quest’ultima cosa non viene tenuta in considerazione.
$ id
uid=1000(loris) gid=1004(jasiu)
...
$ ls -l documento
----r----- 1 loris jasiu 99 2007-12-02 14:29 documento
$ cat documento
cat: documento: Permesso negato
3.3.9
Bit SUID, SGID e Sticky
Sono presenti anche i seguenti bit:
• SUID (Set User ID): permette l’esecuzione di programmi con i permessi del proprietario del file eseguibile,
anziché con quelli dell’utente
• SGID (Set Group ID): permette l’esecuzione di programmi con i permessi del gruppo proprietario del file
eseguibile, anziché con quelli dell’utente; inoltre, permette la gestione di directory di lavoro comune tra
più utenti (ereditarietà dei permessi di gruppo)
• Sticky: un tempo era impostato per i programmi che dovevano rimanevano in memoria al termine del
lavoro; ora viene usato per impedire la cancellazione di file da parte di non proprietari in directory comuni
34
3.3.10
Chmod con modalità simbolica o numerica
Il comando chmod può essere usato in modalità simbolica (assoluta o relativa) o numerica.
$ chmod 777 unfile
$ ls -l unfile
-rwxrwxrwx 1 loris jasiu 0 2007-12-02 15:08 unfile
$ chmod o-w unfile
$ ls -l unfile
-rwxrwxr-x 1 loris jasiu 0 2007-12-02 15:08 unfile
$ chmod g=rx unfile
$ ls -l unfile
-rwxr-xr-x 1 loris jasiu 0 2007-12-02 15:08 unfile
3.3.11
UMask
Normalmente, i file vengono creati dai programmi con permessi 666 e le directory con permessi 777. L’impostazione di una umask permette di decidere quali permessi sottrarre a quelli standard.
Ad esempio:
$ umask 0
$ touch file1
$ mkdir dir1
$ umask 22
$ touch file2
$ mkdir dir2
$ umask 77
$ touch file3
$ mkdir dir3
$ ls -ld dir* file*
drwxrwxrwx 2 loris jasiu 4096 2007-12-02 14:50 dir1
drwxr-xr-x 2 loris jasiu 4096 2007-12-02 14:51 dir2
drwx------ 2 loris jasiu 4096 2007-12-02 14:51 dir3
-rw-rw-rw- 1 loris jasiu
0 2007-12-02 14:50 file1
-rw-r--r-- 1 loris jasiu
0 2007-12-02 14:51 file2
-rw------- 1 loris jasiu
0 2007-12-02 14:51 file3
3.3.12
Altri permessi
(rinvio) Nella presentazione sulle autorizzazioni verranno introdotti altri permessi, basati su bit speciali dei file
system ext2 ed ext3 e sulle ACL (access control list). Inoltre, verrà introdotto il meccanismo delle deleghe, che
può essere usato per consentire determinate operazioni (sui file, ma non solo) ad alcuni utenti.
3.3.13
Esercizi
1. Creare un file con permessi -w------- e aggiungervi qualche riga.
2. Creare una directory con permessi r-------- e provare ad accedervi e a leggerne i contenuti.
3. Creare una directory con permessi -w------- e provare ad accedervi e a leggerne i contenuti.
4. Provare lo scenario di directory condivisa con sticky bit impostato.
5. Provare lo scenario di directory condivisa e SGID bit impostato e gruppi primari di appartenenza diversi
6. Cercare con find tutti i programmi che hanno il bit SUID impostato.
7. Creare un file fifo e, da due terminali diversi, usarlo per fare comunicare tra loro due processi.
8. Provare il comando newgrp per creare file con gruppo proprietario diverso dal proprio gruppo primario.
35
3.4
3.4.1
Ricerche
Find
Find è il più potente fra i programmi di ricerca.
Importante la possibilità di eseguire automaticamente determinate operazioni su tutti i file trovati, tramite:
• le azioni exec e execdir
• le azioni ok e okdir
• il piping con xargs (sconsigliato, vedi Find: Security Considerations19 )
Ad esempio:
$
$
$
$
find
find
find
find
3.4.2
-iname
-iname
-iname
-iname
’*.c’
’*.c’
’*.c’
’*.c’
-exec chmod 700 {} \;
# imposta permessi 700 a tutti i file con estensione .c
-execdir chmod 700 {} \;
# come sopra, ma con maggior sicurezza
-okdir chmod 700 {} \;
# come sopra, ma chiede conferma ogni volta
-exec chmod 700 {} +
# unica invocazione del comando, con la lista dei parametri
Find - permessi sui file
Il criterio di ricerca basato sui permessi può essere impostato sulla ricerca dei file che hanno esattamente
determinati permessi, oppure che hanno (almeno) uno di o tutti i permessi specificati.
$ find -type
-r-x------ 1
$ find -type
-rwx------ 1
-r-x------ 1
f -perm 0500 -exec ls -l {} \;
# trova solo i file con i permessi u=rx
loris loris 0 2008-04-19 17:17 ./0500_file
f -perm -0500 -exec ls -l {} \; # trova i file con entrambi i permessi u=rx
loris loris 0 2008-04-19 17:17 ./0700_file
loris loris 0 2008-04-19 17:17 ./0500_file
$ find -type
--wx------ 1
-r-------- 1
-rwx------ 1
-r-x------ 1
---x------ 1
-rw------- 1
f -perm /0500
loris loris 0
loris loris 0
loris loris 0
loris loris 0
loris loris 0
loris loris 0
3.4.3
-exec ls -l {} \; # trova i file con almeno uno dei permessi u=rx
2008-04-19 17:17 ./0300_file
2008-04-19 17:17 ./0400_file
2008-04-19 17:17 ./0700_file
2008-04-19 17:17 ./0500_file
2008-04-19 17:17 ./0100_file
2008-04-19 17:17 ./0600_file
Find - ricerche per intervalli temporali
Quando si devono elencare tutti i file da un determinato momento ad un altro, può essere utile creare dei file
segnatempo, in modo da poter fare un confronto basato sulle marche temporali.
$ touch prima
$ touch /tmp/START
$ touch durante1
$ touch durante2
$ touch /tmp/STOP
$ touch dopo
$ find . -cnewer /tmp/START ! -cnewer /tmp/STOP
./durante1
./durante2
3.4.4
Find - esclusione di directory
Se si vuole effettuare una ricerca escludendo una directory, si può usare l’opzione -prune. Ad esempio, per
cercare i file con il bit SUID impostato in tutte le directory ad esclusione di /proc, si può impartire il comando:
$ find / -path ’/proc’ -prune -o -perm -u+s
/usr/bin/sudoedit
/usr/bin/sudo
[...]
/sbin/mount.nfs
2> /dev/null
Si noti l’operatore logico -o (se il percorso è /proc non elencare il file; oppure — in caso contrario — elencalo
se il file ha il bit SUID impostato).
19 http://www.gnu.org/software/findutils/manual/html
node/find html/Security-Considerations.html#Security-Considerations
36
3.4.5
Ricerca interattiva all’interno di un file di testo
Se si sta usando vi o less per visualizzare un file di testo, premendo / si può attivare una funzione di ricerca
all’interno del file stesso. Digitando n si trova l’occorrenza successiva del termine o dell’espressione regolare
cercato.
3.4.6
Grep con ricorsione
Se si vuole fare una ricerca all’interno di file di testo (ad esempio, nei file di configurazione delle varie applicazioni,
in /etc), si può usare il programma Grep con l’opzione di ricorsione.
$ grep -R apache /etc 2> /dev/null| head -5
/etc/apparmor.d/abstractions/svn-repositories: # it is intended to be included in profiles for svnserve/apache2 and maybe
/etc/apache2/sites-available/default:
# This directive allows us to have apache2’s default start page
/etc/apache2/sites-available/default:
# in /apache2-default/, but still have / go to the right place
/etc/apache2/sites-available/default:
#RedirectMatch ^/$ /apache2-default/
/etc/apache2/sites-available/default:
ErrorLog /var/log/apache2/error.log
3.4.7
Locate (Slocate)
Si basa su un indice aggiornato periodicamente con updatedb.
$ slocate gshadow
/var/backups/gshadow.bak
/usr/share/man/cs/man5/gshadow.5.gz
/usr/share/man/man5/gshadow.5.gz
/usr/share/man/fr/man5/gshadow.5.gz
/usr/share/man/sv/man5/gshadow.5.gz
/usr/share/man/ru/man5/gshadow.5.gz
/etc/gshadow
/etc/gshadow-
3.4.8
Whereis
Cerca programmi basandosi sul path corrente.
$ whereis cat
cat: /bin/cat /usr/share/man/man1/cat.1.gz
$ PATH=’’
$ whereis cat
bash: whereis: No such file or directory
3.4.9
Which
Indica che programma verrebbe eseguito con un determinato comando (a meno che non si tratti di un built-in
della shell).
$ which cat
/bin/cat
$ which echo
/bin/echo
$ type echo # echo in realtà è un built-in
echo is a shell builtin
3.4.10
Type
Il comando type serve a indicare di che tipo è il comando indicato come parametro:
$ type dd
dd is /bin/dd
$ type echo
echo is a shell builtin
$ type if
if is a shell keyword
$ type cal
cal is hashed (/usr/bin/cal)
I comandi già impartiti nella shell corrente vengono organizzati in un hash, in modo che sia più veloce il
reperimento del relativo file binario in occasione dei richiami successivi.
37
3.4.11
Lsof
Elenca i file correntemente aperti.
$ lsof | grep services
soffice.b 7373
loris
soffice.b 7373
loris
3.4.12
mem-R
51rR
REG
REG
8,3
8,3
2424832 3370940 /usr/lib/openoffice/program/services.rdb
2424832 3370940 /usr/lib/openoffice/program/services.rdb
Df
DiskFree. Quanto spazio su disco rimane nelle diverse partizioni?
$ df
Filesystem
/dev/sda3
varrun
varlock
udev
devshm
lrm
/dev/sdb1
3.4.13
1K-blocks
58317904
972276
972276
972276
972276
972276
1949824
Used Available Use% Mounted on
52921668
2433852 96% /
236
972040
1% /var/run
0
972276
0% /var/lock
88
972188
1% /dev
0
972276
0% /dev/shm
34696
937580
4% /lib/modules/2.6.22-14-generic/volatile
1920384
29440 99% /media/disk
Du
DiskUsage. Quanto spazio su disco è effettivamente occupato da una directory e/o da un file?
$ du -hS /etc/apache2/
12K
/etc/apache2/sites-available
4,0K
/etc/apache2/mods-enabled
356K
/etc/apache2/mods-available
4,0K
/etc/apache2/sites-enabled
8,0K
/etc/apache2/conf.d
24K
/etc/apache2/
3.4.14
A caccia di elefanti
Esempio tratto dal libro di Paolo Attivissimo e Roberto Odoardi Da Windows a Linux20 .
$ sudo du −m −S −x /home | sort −n −r | head -4
8039
/home/loris/Desktop/torrents/torrents_nv/docs
6806
/home/loris/importanti/qemu/os
4457
/home/images/raw_20070112
4457
/home/images/raw_20070110
3.4.15
Informazioni sul tipo di file
Il programma file consente di determinare il tipo di file (file compresso gzip, immagine jpeg, ecc.), e di indicare
il corrispondente tipo MIME. È bene precisare che si basa sul contenuto del file, non sull’estensione:
$ file Test.odt Test.rtf
Test.odt: OpenDocument Text
Test.rtf: Rich Text Format data, version 1, ANSI
$ file --mime Test.odt Test.rtf
Test.odt: application/vnd.oasis.opendocument.text
Test.rtf: text/rtf
$ cp Test.odt Test.jpg # verifichiamo che ’file’ non viene imbrogliato...
$ file Test.jpg
Test.jpg: OpenDocument Text
20 http://www.attivissimo.net/other
books/w2l1/index.htm
38
3.4.16
Cancellazioni sicure
Se si vogliono eliminare dei file in maniera sicura (con sovrascrittura di dati casuali, anziché logica), si può usare
il programma wipe.
$ wipe documentoriservato.odt
Okay to WIPE 1 regular file ? (Yes/No) yes
Operation finished.
1 file wiped and 0 special files ignored in 0 directories, 0 symlinks removed
but not followed, 0 errors occured.
$ wipe -q -Q 1 docum_riserv.pdf
# sovrascrittura una sola volta
Okay to WIPE 1 regular file ? (Yes/No) yes
Operation finished.
1 file wiped and 0 special files ignored in 0 directories, 0 symlinks removed
but not followed, 0 errors occured.
3.4.17
Cambiare in blocco il nome di file
Capita spesso di dover ridenominare una serie di file in base a qualche criterio. Anziché usare una serie di mv, si
può ricorrere al programma rename (che funziona in maniera leggermente diversa nei sistemi RedHat/Fedora e
in quelli Debian/Ubuntu).
$ rename .jpg .jpeg *jpg
$ rename s/.jpg/.jpeg/ *jpg
# RedHat/Fedora
# Debian/Ubuntu
Se si hanno dei file numerati in maniera “naturale” si possono sistemare con un paio di comandi:
$ ls
foto100.jpeg
foto101.jpeg
foto102.jpeg
foto103.jpeg
foto104.jpeg
foto105.jpeg
foto10.jpeg
foto11.jpeg
foto12.jpeg
foto13.jpeg
foto14.jpeg
foto15.jpeg
foto1.jpeg
foto2.jpeg
foto3.jpeg
foto4.jpeg
$ rename s/foto/foto0/ foto?.jpeg
$ rename s/foto/foto0/ foto??.jpeg
$ ls
foto001.jpeg foto006.jpeg foto011.jpeg
foto002.jpeg foto007.jpeg foto012.jpeg
foto003.jpeg foto008.jpeg foto013.jpeg
foto004.jpeg foto009.jpeg foto014.jpeg
foto005.jpeg foto010.jpeg foto015.jpeg
3.4.18
foto5.jpeg
foto6.jpeg
foto7.jpeg
foto8.jpeg
foto100.jpeg
foto101.jpeg
foto102.jpeg
foto103.jpeg
foto104.jpeg
foto9.jpeg
foto105.jpeg
Pgrep e Pkill
Può capitare di dover cercare un processo in base al nome dell’utente, al nome dell’eseguibile, al terminale. Lo
si può fare agevolmente con il programma pgrep.
Si presti attenzione alla differenza tra utente effettivo, specificato con -u (ad esempio, root per il programma
passwd che ha il bit SUID impostato), e l’utente reale (-U).
Con -l si ottiene il nome dell’eseguibile oltre al PID.
Con il programma pkill si possono inviare segnali ai processi trovati.
$ pgrep -u loris -l | head -3
6883 gnome-keyring-d
6886 x-session-manag
6928 ssh-agent
3.4.19
Beagle (ricerche desktop)
Per effettuare ricerche generiche all’interno di testi presenti nella nostra directory e/o nei nostri messaggi di
posta, possiamo utilizzare beagle, un programma che indicizza i nostri documenti.
Ne parleremo nella sezione su GNOME.
39
3.5
3.5.1
Operazioni programmate e periodiche
Ora (e data) di sistema
L’ora e la data di sistema possono essere visualizzate con il comando date. In assenza di indicazioni, il formato
di visualizzazione rispetta il locale corrente.
$ date
ven feb 22 09:37:09 CET 2008
$ LANG=POSIX date
Fri Feb 22 09:38:18 CET 2008
3.5.2
Rappresentazione delle date
È importante che nella rapppresentazione di date e ore non vi siano ambiguità. Ciò è valido soprattutto nei casi
in cui è prevista una qualche forma di elaborazione automatica.
I problemi più comuni riguardano:
• formati di rappresentazione
• fusi orari
3.5.3
Formati di rappresentazione
Il comando date permette di usare alcuni formati standard predefiniti o di crearne di personalizzati:
$ date --rfc-2822 # formato usato per l’email
Fri, 22 Feb 2008 09:57:02 +0100
$ date --utc # riferimento al tempo coordinato universale
ven feb 22 09:42:32 UTC 2008
$ date +"Settimana n. %U dell’anno %Y" # formato personalizzato
Settimana n. 07 dell’anno 2008
$ date +%s
1203677970
# numero di secondi dall’Epoch
Nota: i secondi possono andare da 0 a 60 per tener conto del secondo intercalare21 (supportato solo in rappresentazione).
3.5.4
Fuso orario
Informazioni sui fusi orari “attivabili” si possono trovare nel file /usr/share/zoneinfo/zone.tab. Il file /etc/localtime è una copia del (o un link simbolico al) file corrispondente della directory /usr/share/zoneinfo.
3.5.5
Modifica dell’ora di sistema
L’ora di sistema può essere modificata con il comando sudo date --set.
3.5.6
L‘ora dell’hardware clock
L’orologio hardware, in funzione a calcolatore spento, cede il passo all’orologio di sistema quando questo viene
avviato.
Si può vedere o impostare l’ora dell’orologio hardware con il comando hwclock.
$ hwclock -r
ven 22 feb 2008 11:54:06 CET
$ sudo hwclock --systohc
$ sudo hwclock --hctosys
-0.283391 seconds
# imposta l’ora dell’hc basandosi su quella di sistema
# imposta l’ora di sistema basandosi su quella dell’hc
21 http://it.wikipedia.org/wiki/Secondo
intercalare
40
3.5.7
L’ora esatta
Può essere utile recuperare l’ora esatta da un server apposito, rintracciabile consultando la lista di server pubblici
disponibili22 .
Per visualizzare l’ora può essere dato il comando rdate -p <servername>. Per impostarla si dovrà dare il comando sudo rdate <servername> (o l’analogo sudo ntpdate <servername>. Ovvie norme di buona condotta
prevedono che si evitino richieste troppo frequenti.
Per sistemi comuni può essere utile impostare l’ora all’avvio (eventualmente gestendo ritardi sistematici con
adjtimex ).
Per sistemi server, che rimangono sempre accesi ed hanno necessità di precisione maggiore (e di modifiche meno
drastiche all’ora di sistema), è consigliabile una gestione tramite un demone ntp, che tiene in considerazione il
ritardo dell’orologio di sistema ed effettua aggiustamenti graduali.
3.5.8
Timestamp dei file
Ad ogni file sono associati tre timestamp riportanti data e ora di:
• ultimo accesso
• ultima modifica
• ultimo cambiamento
Ad esempio:
$ stat documento.txt
File: ‘documento.txt’
[...]
Access: 2008-02-22 14:41:18.000000000 +0100
Modify: 2008-02-22 14:41:01.000000000 +0100
Change: 2008-02-22 14:42:14.000000000 +0100
3.5.9
Modifica della data di cambiamento di un file
È possibile visualizzare la data di ultimo cambiamento di un file anche con il comando date -r:
$ date -r documento.txt
ven feb 22 14:41:01 CET 2008
Con touch si possono modificare i timestamp di un file “copiandoli” da quelli di un altro file preso come
riferimento.
$ touch -r documento.txt altrodocumento.txt
$ stat altrodocumento.txt
[...]
Access: 2008-02-22 15:30:59.000000000 +0100
Modify: 2008-02-22 14:41:01.000000000 +0100
Change: 2008-02-22 15:31:41.000000000 +0100
3.5.10
Creare un file impostandone la data
È possibile creare un file indicando la data di modifica (o di accesso/modifica). Ciò si può rivelare utile per
effettuare delle ricerche (vedi find ).
$ touch --date ’12 February 2009 13:30’ /tmp/12FEB
$ touch -t 200903211430 /tmp/21MAR
$ ls -l /tmp/12FEB /tmp/21MAR
-rw-r--r-- 1 loris docenti 0 2009-02-12 13:30 /tmp/12FEB
-rw-r--r-- 1 loris docenti 0 2009-03-21 14:30 /tmp/21MAR
22 http://www.pool.ntp.org/zone/europe
41
3.5.11
Epoch
I sistemi Unix memorizzano le date come numero di secondi passati dall’inizio dell’anno 1970 (epoch). Attualmente vengono supportate date comprese nell’intervallo dal 13 dicembre 1901 al 19 gennaio 2038 (il numero di
secondi è memorizzato in un campo di 32 bit con segno).
$ touch -t 190112132145.52 /tmp/BEGIN
# data valida: 13 dicembre 1901, ore 21:45:52
$ touch -t 190112132145.51 /tmp/BEGIN
# data non valida: ... ore 21:45:51
touch: invalid date format ‘190112132145.51’
$ touch -t 203801190414.07 /tmp/END
# data valida: 19 gennaio 2038, ore 04:14:07
$ touch -t 203801190414.08 /tmp/END
# data non valida: ... ore 04:14:08
touch: invalid date format ‘203801190414.08’
3.5.12
Uptime
Con il comando uptime si può sapere da quanto tempo il sistema è in uso, nonché il carico di lavoro nell’ultimo
minuto, negli ultimi cinque minuti, nell’ultimo quarto d’ora.
$ uptime
17:02:36 up
3.5.13
3:08,
3 users,
load average: 1.19, 1.09, 1.14
Calendario
Se si desidera ottenere un calendario si può usare il programma cal o ncal :
$ cal
febbraio 2008
do lu ma me gi ve sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29
$ ncal
febbraio 2008
lu
4 11 18 25
ma
5 12 19 26
me
6 13 20 27
gi
7 14 21 28
ve 1 8 15 22 29
sa 2 9 16 23
do 3 10 17 24
3.5.14
Raffinatezze di ncal
Il programma ncal permette di:
• visualizzare la data in cui cade la Pasqua occidentale (ncal -e) e ortodossa (ncal -o)
• tenere in considerazione le date in cui nei diversi Paesi è stato adottato il calendario gregoriano
Esempi:
$ seq 2008 2010 | xargs -i ncal -e {}
23 marzo 2008
12 aprile 2009
4 aprile 2010
$ ncal 10 1582
# in Italia il passaggio al calendario gregoriano è avvenuto nel 1582
ottobre 1582
lu 1 18 25
ma 2 19 26
me 3 20 27
gi 4 21 28
ve 15 22 29
sa 16 23 30
do 17 24 31
42
3.5.15
Misurazione del tempo di esecuzione
Con il comando time si può misurare il tempo impiegato per l’esecuzione di un programma.
$ time echo "scale=2000; 4*a(1)" | bc -l
3.141592653589793238462643383279502884197169399375105820974944592307\
81640628620899862803482534211706798214808651328230664709384460955058\
[...]
real
0m5.579s
user
0m5.520s
sys
0m0.012s
Attenzione: la Bash ha un proprio comando time implementato internamente: se si vuole usare il programma
esterno time, lo si deve richiamare esplicitamente con /usr/bin/time.
3.5.16
Esecuzione programmata
Se si vuole eseguire un comando ad una certa ora, si può usare il comando at.
$ at 17:30
warning: commands will be executed using /bin/sh
at> echo questo è un test
at> echo dovrebbe essere eseguito alle 17.30
at> <EOT>
job 2 at Fri Feb 22 17:30:00 2008
L’output del comando viene inviato via posta elettronica.
$ mail
"/var/mail/loris": 1 message 1 new
>N
1 Loris Tissino
ven feb 22 17:30 13/435
& 1
Subject: Output from your job
2
To: loris@localhost
Date: Fri, 22 Feb 2008 17:30:00 +0100 (CET)
From: loris@localhost (Loris Tissino)
Output from your job
questo è un test
dovrebbe essere eseguito alle 17.30
& q
Held 1 message in /var/mail/loris
3.5.17
Esecuzione programmata (2)
Il comando at dispone di alcune abbreviazioni. Ad esempio:
$ at noon 26.02.08
$ at teatime tomorrow
$ at now + 2 minutes
Nota: visto che at legge i comandi da eseguire dallo standard input, si possono sfruttare i meccanismi di
ridirezione.
$ at midnight < listacomandi
$ echo cp -v file1 file2 | at 12:30
3.5.18
Esecuzione programmata (3)
Il comando atq permette di vedere quali sono i lavori programmati:
$ atq
6
5
4
Fri Feb 22 17:43:00 2008 a loris
Sat Feb 23 16:00:00 2008 a loris
Tue Feb 26 12:00:00 2008 a loris
Per la cronaca, i lavori da eseguire vengono salvati come script sh nella directory /var/spool/cron/atjobs.
Con il comando atrm si può rimuovere un lavoro dalla coda.
I file /etc/at.allow e /etc/at.deny permettono di indicare, rispettivamente, quali siano gli utenti a cui è permesso
o non permesso accodare lavori con at.
43
3.5.19
Esecuzione batch
Il comando batch permette di impostare l’esecuzione di un programma attendendo il momento opportuno
(quando cioè il carico di lavoro del calcolatore scende sotto un certo livello).
$ batch
warning: commands will be executed using /bin/sh
at> ./bigcompile
at> <EOT>
job 12 at Sat Feb 23 11:44:00 2008
3.5.20
Sleep
Il programma sleep consente di sospendere l’esecuzione di uno script per un determinato numero di secondi,
minuti, ore o giorni.
$ date +%H:%M:%S.%N; sleep 2s; date +%H:%M:%S.%N
11:26:14.948671731
11:26:16.954542400
3.5.21
Lettura di variabile dalla shell con timeout
In uno script bash, può essere comodo porre un timeout quando viene chiesto in input un valore:
$ read -p ’Inserisci nome (hai cinque secondi per farlo): ’ -t 5 NOME
Inserisci nome (hai cinque secondi per farlo): john
3.5.22
Esecuzione periodica: watch
Se si vuole eseguire un certo comando ogni x secondi, watch è il programma da usare.
$ watch ls -l /tmp
$ watch --differences ls -l /tmp
# evidenzia le differenze dall’ultimo output
$ watch --differences=cumulative ls -l /tmp
# evidenzia le diff. dall’inizio
$ watch -n 20 ls -l /tmp
# esegue ls -l ogni 20 secondi
3.5.23
Esecuzione periodica: cron
Se si vuole eseguire un certo comando ogni giorno ad una certa ora, oppure ogni x ore, e cose del genere, ci si
deve affidare al demone crond.
Per modificare i propri comandi programmati, l’utente deve usare il comando interattivo crontab
$
$
$
$
crontab -e
sudo crontab -e john
crontab -l
sudo crontab -u john -l
3.5.24
#
#
#
#
per
per
per
per
modificare la propria programmazione
modificare la programmazione dell’utente john
visualizzare la propria programmazione
visualizzare la programmazione dell’utente john
Configurazione di cron
Ogni riga del file di conigurazione della programmazione di cron è composta da cinque campi:
• minuto (0–59)
• ora (0–23)
• giorno del mese (1–31)
• mese (1–12)
• giorno della settimana (0–7) — 0 e 7 significano entrambi domenica
Ulteriori informazioni si possono trovare in crontab(5).
44
3.5.25
E se il calcolatore è spento?
. . . viene in soccorso anacron.
4
Installazione e configurazione
4.1
4.1.1
Installazione di Linux
Verifica della configurazione hardware
A volte capita, per la risoluzione di problemi hardware, di dover verificare la configurazione, magari confrontandola con quella di una macchina simile. A tale scopo si possono usare:
• le informazioni della directory /proc
• i comandi ls*
4.1.2
La directory /proc
Alcune informazioni utili che si trovano in /proc:
$
$
$
$
$
cat
cat
cat
cat
cat
4.1.3
/proc/interrupts
/proc/ioports
/proc/dma
/proc/usb
/proc/pci
I comandi ls*
Alcuni comandi utili:
$ whatis lsmod lspci lsdev lsusb lshal lspcmcia
lsmod (8)
- program to show the status of modules in the Linux Kernel
lspci (8)
- list all PCI devices
lsdev (8)
- display information about installed hardware
lsusb (8)
- list USB devices
lsusb (1)
- list USB devices
lshal (1)
- List devices and their properties
lspcmcia (8)
- PCMCIA card control utility
4.1.4
Nomi dei dispositivi
I dispositivi hardware di un sistema Linux vengono visti come file:
• /dev/ttyS0, /dev/ttyS1, ecc. (porte seriali)
• /dev/lp0, /dev/lp1 (porte parallele)
• /dev/eth0, /dev/eth1, ecc. (interfacce di rete)
• /dev/hda, /dev/hdb, ecc. (dischi IDE)
• /dev/sda, /dev/sdb, ecc. (dischi SCSI o equiparati)
4.1.5
Partizioni
I dischi possono essere partizionati da riga di comando (es. con fdisk ) o con strumenti grafici.
Per essere utilizzate, le partizioni devono essere formattate con i comandi mkfs.*. Ci si può esercitare con un
file creato appositamente:
45
$ dd if=/dev/zero of=discosimulato.dsk bs=512 count=100000
100000+0 records in
100000+0 records out
51200000 bytes (51 MB) copied, 0,867508 seconds, 59,0 MB/s
$ fdisk discosimulato.dsk
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
[snip]
$ mkfs.ext3 -F discosimulato.dsk
$ sudo mount -t ext3 -o loop discosimulato.dsk /media/cdrom
4.1.6
Controllo del filesystem
Il controllo del filesystem può essere fatto con i comandi appropriati (a seconda del tipo di filesystem):
$ sudo umount /media/cdrom
$ fsck.ext3 discosimulato.dsk
e2fsck 1.40-WIP (14-Nov-2006)
discosimulato.dsk: clean, 11/12544 files, 6499/50000 blocks
Il controllo va fatto su un filesystem non innestato (unmounted ).
4.1.7
Impostazioni del filesystem (tuning )
Per controllare in maniera fine come un filesystem ext2 o ext3 deve essere gestito, si può usare il comando
tune2fs, che permette ad esempio di:
• decidere cosa fare quando al controllo vengono trovati degli errori (continue, remount-ro, panic)
• decidere la quantità di blocchi riservati a root
• decidere chi (gruppo) può usare i blocchi riservati, oltre a root
4.1.8
Debug
Un filesystem ext2 o ext3 può essere ispezionato con il programma interattivo debugfs.
4.1.9
Il file /etc/fstab
Il file /etc/fstab contiene le indicazioni su quali filesystem devono essere innestati nel filesystem principale
all’avvio del sistema (o possono essere innestati successivamente in forma semplificata).
Si veda fstab(5) per ulteriori dettagli.
4.1.10
Innesto di filesystem
Un filesystem secondario può essere innestato (mounted ) nel filesystem principale tramite il comando mount e
disinnestato tramite umount (operazioni privilegiate).
Il file /etc/fstab può prevedere la possibilità di innesto da parte di utenti non privilegiati.
Per i dispositivi hotplug si possono usare i comandi pmount e pumount, a patto di appartenere al gruppo plugdev.
4.1.11
Sync
Normalmente le operazioni di scrittura su disco vengono ritardate per questioni di efficienza, sfruttando meccanismi di caching. Se si desidera forzare le operazioni di scrittura, si può impartire il comando sync.
4.1.12
Il Filesystem Hierarchy Standard
Il FHS23 ha lo scopo di fornire una serie di indicazioni vincolanti (requirements) e di linee guida per la posizione
di file e directory nei sistemi operativi UNIX-like.
L’intenzione è di supportare l’interoperabilità tra applicazioni, strumenti di sviluppo e script, nonché di garantire
una maggior uniformità sulla documentazione per questi sistemi.
23 http://www.pathname.com/fhs/
46
4.1.13
Contenuto del FHS
Il FHS contiene:
• principi guida per ogni area del filesystem
• specificazione dei file e delle directory richieste come requisito minimo
• indicazione di eventuali eccezioni ai principi
• indicazione di casi specifici in cui ci sono stati conflitti
4.1.14
Distinzioni tra file
Il FHS prevede le seguenti distinzioni tra tipologie di file:
• shareable vs. unshareable
• static vs. variable
4.1.15
Shareable vs. Unshareable
I file condivisibili sono quelli che possono risiedere su un calcolatore ed essere usati su di un altro (ad esempio,
i documenti degli utenti).
I file non condivisibili sono quelli che ha senso vengano usati solo sul calcolatore in cui risiedono (ad esempio, i
file di lock relativi ai dispositivi).
In pratica, mentre i primi possono essere in directory condivise in rete, (es. via NFS), i secondi saranno file
locali.
4.1.16
Static vs. Variable
I file statici sono quelli che non cambiano senza l’intervento dell’amministratore di sistema (ad esempio, i
programmi eseguibili, le librerie, i file di documentazione).
I file variabili sono gli altri.
In pratica, i primi, a differenza dei secondi, potrebbero essere posti in filesystem montati in sola lettura (salvo
le operazioni di aggiornamento); inoltre, il loro backup ha un rilievo minore.
4.1.17
Esempio di organizzazione
Use
static
variable
Shareable
/usr, /opt
/var/mail,
/var/spool/news
Unshareable
/etc, /boot
/var/run,
/var/lock
In linea di massima, in ogni directory dovrebbero essere posti file della medesima categoria (individuata in base
ai due criteri esposti). In realtà esistono delle eccezioni per questioni di compatibilità storica.
4.1.18
Le directory principali
Per avere informazioni specifiche sulle linee guida, è consigliabile leggere il documento nella sua interezza
(esistono anche delle sintesi in italiano).
È particolarmente importante prestare attenzione alla differenza tra le directory:
• /bin (eseguibili essenziali, unshareable)
• /usr/bin (altri eseguibili, shareable)
• /sbin (eseguibili essenziali per l’utente root, unshareable)
• /usr/sbin (altri eseguibili per l’utente root, shareable)
• /usr/local/bin e /usr/local/sbin (eseguibili locali, separati per evitare sovrascritture in occasione di
aggiornamento)
47
4.2
4.2.1
Gestione pacchetti software
Software da sorgenti non pacchettizzati
Gran parte dei programmi sono normalmente disponibili in formato sorgente (in file tgz ) e si possono recuperare
via http o con programmi clienti di sistemi di controllo versione.
Per i programmi in formato sorgente, si procede spesso cosı̀:
tar xvzf nomepacchetto.tgz
cd nomepacchetto
./configure
# crea il Makefile
make
# compila i sorgenti
sudo make install
# installa il software
make clean
# rimuove i file temporanei
4.2.2
Checkinstall
Se il programma usa gli strumenti autoconf e automake, è possibile creare velocemente un pacchetto a partire
dai sorgenti con checkinstall.
tar xvzf nomepacchetto.tgz
cd nomepacchetto
./configure
# crea il
make
# compila
sudo checkinstall
# crea il
make clean
# rimuove
4.2.3
Makefile
i sorgenti
pacchetto deb e lo installa
i file temporanei
Il Makefile
Il Makefile di un programma serve a indicare cosa deve essere fatto per compilare ed installare un programma
partendo dai sorgenti. Normalmente viene creato da uno script, chiamato configure, in base all’hardware presente
e alle opzioni passate da riga di comando.
Il primo argomento del comando make specifica cosa deve essere fatto esattamente.
In caso di problemi, cercare in rete (es. pagine del wiki di Ubuntu24 ).
4.2.4
Librerie
Le funzionalità più comuni e generiche dei programmi vengono spesso compilate in librerie dinamiche (raccolte
di moduli oggetto), dette shareable objects.
I programmi che sono compilati con l’uso di librerie dinamiche non possono essere eseguiti senza che la libreria
sia presente. Il programma ldd permette di vedere da quali librerie dipende un programma e se esse vengono
trovate.
$ ldd evolutolib_d
libloris.so => not found
libc.so.6 => /lib/tls/libc.so.6 (0x00cd8000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00a57000)
4.2.5
/etc/ld.so.conf
Il file /etc/ld.so.conf indica i percorsi dove vengono cercate le librerie al caricamento di un programma. Si tratta
di un file di testo da cui viene ricavato il file binario /etc/ld.so.cache (tramite il comando sudo ldconfig).
È anche possibile specificare dove cercare le librerie indicando il loro percorso nella variabile d’ambiente
LD LIBRARYPATH.
$ export LD_LIBRARY_PATH=.
$ ldd evolutolib_d
libloris.so => ./libloris.so (0x005ed000)
libc.so.6 => /lib/tls/libc.so.6 (0x0017b000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00b31000)
$ ./evolutolib_d
Hello, world!
24 https://help.ubuntu.com/community/CompilingSoftware
48
4.2.6
Ltrace e Strace
A fini di debug, o per conoscere meglio il funzionamento di un programma, può essere utile ricorrere a due
programmi che tracciano in un file di testo tutte le chiamate a funzioni di libreria (ltrace) e di sistema (strace).
$ ltrace -o chiamatelibreria cal > /dev/null
$ strace -o chiamatesistema cal > /dev/null
$ head -3 chiamate*
==> chiamatelibreria <==
__libc_start_main(0x402960, 1, 0x7fff0c423bd8, 0x403640, 0x403630 <unfinished ...>
setlocale(6, "")
= "it_IT.UTF-8"
setlocale(2, NULL)
= "it_IT.UTF-8"
==> chiamatesistema <==
execve("/usr/bin/cal", ["cal"], [/* 31 vars */]) = 0
brk(0)
= 0x606000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b4dd9056000
4.2.7
I pacchetti
Le distribuzioni Linux mettono a disposizione (spesso, non sempre) sistemi di pacchettizzazione del software
che permettono una più agevole amministrazione.
La pacchettizzazione infatti prevede:
• un database dei programmi installati
• la gestione delle dipendenze tra pacchetti
• un sistema coerente di gestione delle alternative
• il controllo delle versioni
• il raggruppamento in categorie
4.2.8
Cosa c’è in un pacchetto
In un pacchetto sono presenti, solitamente, file che devono essere posti in diverse directory.
Ad esempio:
• programmi eseguibili (-> /usr/bin/. . . )
• librerie (-> /usr/lib/. . . )
• file di configurazione (-> /etc/. . . )
• documentazione (-> /usr/share/doc/. . . )
• pagine di manuale (-> /usr/share/man/. . . )
• script di installazione e configurazione
4.2.9
Sistemi di gestione dei pacchetti
Esistono due livelli di gestione dei pacchetti:
• installazione / rimozione (es. dpkg per Debian/Ubuntu e rpm per RedHat/Fedora)
• recupero da deposito noto, gestione dipendenze, installazione (es. apt-get per Debian/Ubuntu e yum per
Fedora)
Inoltre, vi è la possibilità di recuperare i file sorgente e di compilarli, in modo da ottimizzarne o personalizzarne
le prestazioni (cosa che si può fare con i pacchetti sorgente rpm e deb, ma è la norma con il sistema Portage
della distribuzione Gentoo).
49
4.2.10
Installazione di un nuovo pacchetto
Fedora/RedHat:
rpm -i nomepacchetto-1.2.9-2.rpm
Debian/Ubuntu:
dpkg --install nomepacchetto-1.2.9-2.deb
Eventuali problemi di dipendenza verranno segnalati. Per le dipendenze incrociate (A dipende da B, B dipende
da A), normalmente basta indicare sulla riga di comando l’insieme dei pacchetti necessari.
4.2.11
Aggiornamento di un pacchetto
Fedora/RedHat:
rpm -U nomepacchetto-1.2.9-2.rpm
Debian/Ubuntu:
dpkg --install -G nomepacchetto-1.2.9-2.deb
4.2.12
Installazione di un pacchetto con download da sorgente nota
Fedora:
yum install nomepacchetto
Debian/Ubuntu:
apt-get install nomepacchetto
Le sorgenti note sono indicate in /etc/yum.conf (Fedora) e in /etc/apt/sources-list (Debian).
4.2.13
Da dove viene questo file?
Fedora/RedHat:
rpm -q -f nomefile
Debian/Ubuntu:
dpkg -S nomefile
4.2.14
Cosa contiene questo pacchetto?
Fedora/RedHat:
rpm -q --provides -p nomepacchetto-1.2.9-2.rpm
Debian:
dpkg --contents nomepacchetto-1.2.9.deb
50
4.2.15
Che pacchetti ho installato?
Fedora/RedHat:
rpm -q -a
Debian:
dpkg --list
4.2.16
Dove trovare i pacchetti?
Fedora/RedHat:
www.freshrpms.net, www.rpmfind.net
Debian:
packages.debian.org, www.backports.org
Ubuntu:
packages.ubuntu.com
4.2.17
Il sistema APT
Il file /etc/apt/sources.list contiene righe come le seguenti (per Ubuntu):
deb http://archive.ubuntu.com/ubuntu/ jaunty main restricted
deb-src http://archive.ubuntu.com/ubuntu/ jaunty main restricted
Queste righe specificano, rispettivamente, dove devono essere prelevati i pacchetti binari e dei sorgenti. In
particolare, sono indicati l’URL di riferimento, il nome della distribuzione e le sezioni per cui quella riga va
considerata.
4.2.18
Archivi APT
Gli archivi (ad esempio, http://archive.ubuntu.com/ubuntu) sono organizzati in directory:
• dists (informazioni sulle distribuzioni)
• indices
• pool (file dei pacchetti)
• project
La directory pool è suddivisa in directory corrispondenti alle sezioni:
• main (software open source supportato da Canonical)
• universe (software open source mantenuto dalla comunità)
• multiverse (software con restrizione per copyright o motivi legali)
• restricted (driver proprietari per i dispositivi)
Per Debian, le sezioni sono invece main, contrib e non-free.
51
4.2.19
Elenco dei pacchetti
L’elenco dei pacchetti, con le relative descrizioni, è posto in file compressi (Packages.gz oppure Packages.bz2 )
posti dentro dists.
Ad esempio,
http://archive.ubuntu.com/ubuntu/dists/jaunty/main/binary-i386/Packages.gz
http://archive.ubuntu.com/ubuntu/dists/jaunty/main/binary-i386/Packages.bz2
Le traduzioni nelle diverse lingue delle descrizioni sono presenti in file Translation-it.gz, Translation-fr.gz, ecc.,
presenti nella directory i18n.
4.2.20
Firme dei pacchetti
APT dispone di un meccanismo per la gestione delle firme relative ai pacchetti e delle relative fonti, basato su
GPG.
Un elenco delle chiavi correntemente ritenute fidate si può ottenere con
apt-key list
Per importare una chiave dal keyserver di Ubuntu si può dare il comando
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key [keyid]
4.2.21
Altre cose utili
Con Debian/Ubuntu, si può:
• simulare l’aggiornamento con l’opzione apt-get upgrade --dry-run
• ottenere un elenco dei pacchetti da recuperare con apt-get upgrade --print-uris
• fare ricerche sui metadati dei pacchetti con apt-cache
• convertire pacchetti RPM in formato deb con alien
• scaricare i pacchetti in formato sorgente con apt-get source
4.2.22
Creazione e gestione di un mirror APT
Può essere utile gestire una copia dei pacchetti per la propria distribuzione, ad esempio per poterla sfruttare
all’interno di una rete locale.
A tale scopo si può usare il programma apt-mirror.
I passi da compiere sono i seguenti:
1. installare apt-mirror (sudo apt-get install apt-mirror)
2. modificare, se necessario, il file di configurazione /etc/apt/mirror.list
3. verificare che l’utente apt-mirror sia il proprietario e abbia il permesso di scrittura nella directory indicata
nel file di configurazione (di default /var/spool/apt-mirror )
4. avviare il programma per il recupero dei pacchetti (sudo -u apt-mirror apt-mirror) — per Ubuntu
Jaunty vengono scaricati 25 GiB di dati
5. creare in /var/www i link simbolici necessari per rendere disponibili via HTTP i file (ad esempio, /var/www/ubuntu deve essere un link a /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu)
Sulle altre macchine della rete bisognerà poi avere righe come la seguente (ovviamente l’indirizzo IP sarà diverso):
deb http://192.168.1.3/ubuntu/ jaunty main restricted universe multiverse
52
5
Amministrazione
5.1
5.1.1
Gestione dei processi
Gestione dei processi
• definizione di processo
• gerarchia dei processi e forking
• la directory /proc
• lista dei processi attivi
• esecuzione in background e in foreground
• stati di un processo (running, sleeping, stopped, zombie)
• invio di segnali
• modifica delle priorità
• gestione interattiva dei processi
• programmi utili
5.1.2
Definizione di processo
Un processo è, essenzialmente, un programma in esecuzione.
Ad ogni processo vengono associati:
• uno spazio di indirizzamento (programma eseguibile, dati, stack)
• un insieme di registri (stack pointer, program counter, ecc.)
5.1.3
PID (Process Identifier)
Ad ogni processo è associato un identificativo numerico, chiamato PID.
Per visualizzare il PID della propria shell Bash, si può impartire il comando ps:
$ ps
PID TTY
18945 pts/3
19019 pts/3
TIME CMD
00:00:00 bash
00:00:00 ps
. . . oppure sfruttare la variabile $$:
$ echo $$
18945
5.1.4
PPID
Nei sistemi Un*x, quando un processo ne crea un altro, “padre” e “figlio” rimangono in qualche modo associati.
Per ogni processo, infatti, è noto qual è il processo padre (detto PPID, Parent PID).
Il rapporto gerarchico può essere osservato lanciando una nuova shell dalla shell corrente:
$ bash
$ ps
PID TTY
TIME CMD
18945 pts/3
00:00:00 bash
19058 pts/3
00:00:00 bash
19074 pts/3
00:00:00 ps
$ ps --ppid 18945
# elenca i processi che hanno come padre il processo 18945
PID TTY
TIME CMD
19058 pts/3
00:00:00 bash
53
5.1.5
Fork
La creazione di un nuovo processo da parte del processo padre viene effettuata con la chiamata di sistema fork.
Vediamo un semplice esempio in C.
#include <stdio.h>
int main(int argc, char **argv)
int child_pid = fork();
if (child_pid == -1) {
printf("fork() fallita\n");
return 1;
}
else if (child_pid) {
printf("Sono il padre, il PID di mio figlio è %d.\n", child_pid);
}
else {
printf("Sono il figlio.\n");
}
5.1.6
Le chiamate della famiglia exec
Spesso il processo figlio ha bisogno di un codice eseguibile diverso da quello del processo padre. Eseguirà allora
una chiamata di sistema dela famiglia exec, con la quale il sistema sostituirà l’intera immagine di memoria con
il file nominato nel suo primo parametro.
Un semplice esempio:
#include <stdio.h>
int main(int argc, char **argv, char **envp)
int child_pid = fork();
if (child_pid) {
printf("Sono il padre, il PID di mio figlio è %d.\n", child_pid);
}
else {
printf("Dovrei eseguire cal\n");
static char *arguments[]={"cal"};
execve("/usr/bin/cal", arguments, envp);
printf("Questa istruzione non verrà eseguita\n");
}
}
5.1.7
I processi adottati da Init
Se un processo fa un fork e termina prima del processo figlio generato, il processo figlio viene “adottato” dal
processo init (l’antenato comune di tutti i processi, che ha PID 1).
Lo schema è il seguente.
PPPPPPPPPPPPP
FFFFAAAAAAAAAAAAAAAAA
P = processo padre
F = processo figlio
A = processo figlio adottato da init quando il padre termina
5.1.8
I processi zombie
Se un figlio termina il lavoro prima del processo padre, rimane nello stato c.d. zombie fino al termine di
quest’ultimo.
Lo schema è il seguente.
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
FFFFFFFFZZZZZZZZZZZZZZZZZZZZZZZZZ
P = processo padre
F = processo figlio
Z = processo figlio che diventa zombie al suo termine
54
5.1.9
L’attesa da parte del processo padre
Più correttamente, il processo padre dovrebbe porsi in attesa del processo figlio, con una chiamata di sistema
waitpid.
Il caso, a seconda di chi tra padre e figlio finisce prima il proprio lavoro, potrebbe essere uno dei seguenti:
a)
PPPPPPPPPPPPPPPPWWWWWWWWWWWWWWWWWWWWWWWWWP
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
b)
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWPPPPPPPPPPP
FFFFFFFZZZZZZZZZZZZZZZZZZZZZZZ
P = processo padre
F = processo figlio
W = processo padre in attesa
5.1.10
Pstree
La gerarchia dei processi può essere visualizzata con il comando pstree.
$ pstree
init---NetworkManager---{NetworkManager}
+-firefox---run-mozilla.sh---firefox-bin---10*[{firefox-bin}]
+-gdm---gdm-+-Xorg---Xorg
+-5*[getty]
+-gnome-terminal-+-bash---ssh
|
+-bash
|
+-bash---cat
|
+-bash---pstree
|
+-{gnome-terminal}
+-quanta
+-wpa_supplicant
(output ridotto)
Con il comando pstree -p si può visualizzare il PID di ogni processo.
5.1.11
La directory speciale /proc
I sistemi Linux mettono a disposizione una speciale directory, denominata /proc, contenente informazioni, in
forma di file, sui processi.
Per ogni processo, nella directory /proc/PID, si hanno ad esempio:
• lo pseudofile cmdline, con la riga di comando completa
• lo pseudofile environ, con le variabili d’ambiente
• cwd, un link simbolico alla directory di lavoro corrente
• exe, un link simbolico al programma in esecuzione
Si veda proc(5) per ulteriori informazioni.
5.1.12
Informazioni sui processi: ps
Il programma ps è lo strumento principale di visualizzazione delle informazioni relative ai processi.
Il comando ps funziona con opzioni espresse in tre forme diverse:
• opzioni Unix98 (precedute da trattino)
• opzioni BSD (senza trattino)
• opzioni in formato lungo GNU (con due trattini)
Le opzioni hanno significati diversi in Unix98 e BSD. Ad esempio:
55
$ ps a
PID TTY
4449 tty4
...
5570 tty7
5825 pts/0
6611 pts/1
7328 pts/1
$ ps -a
PID TTY
5570 tty7
7329 pts/1
5.1.13
STAT
Ss+
TIME COMMAND
0:00 /sbin/getty 38400 tty4
SL+
Ss+
Ss
R+
0:00
0:00
0:00
0:00
/usr/bin/X :0 -br -audit 0 -auth /var/lib/gdm/:0.Xaut
bash
bash
ps a
TIME CMD
00:00:00 Xorg
00:00:00 ps
Ps: opzioni utili
Alcune opzioni frequentemente utilizzate sono:
• a: mostra tutti i processi di tutti gli utenti
• u: usa un formato di visualizzazione orientato all’utente
• x: mostra anche i processi senza un terminale
Notare la quasi completa equivalenza di ps aux e ps -ef.
5.1.14
Esecuzione in background e foreground
Un’intera pipeline può essere eseguita in background posponendo un ampersand alla fine del comando.
Un lavoro (job) in background può essere riportato in foreground con il comando fg.
Il lavoro in foreground può essere sospeso premendo ctrl-Z (^Z).
$ yes > /dev/null &
[1] 7489
$ fg %1
yes > /dev/null
(ctrl-Z)
[1]+ Stopped
$ bg %1
[1]+ yes > /dev/null &
5.1.15
yes > /dev/null
Gli stati di un processo
Un processo può trovarsi in uno dei seguenti stati:
D
R
S
T
W
X
Z
Uninterruptible sleep (usually IO)
Running or runnable (on run queue)
Interruptible sleep (waiting for an event to complete)
Stopped, either by a job control signal or because it is being
traced.
paging (not valid since the 2.6.xx kernel)
dead (should never be seen)
Defunct ("zombie") process, terminated but not reaped by its
parent.
(da ps(1))
5.1.16
Invio di segnali ai processi
Un meccanismo fondamentale nella comunicazione tra processi consiste nell’invio di segnali. I segnali possono
essere inviati:
• dalla riga di comando, con kill
56
• da terminale, con la pressione di determinate combinazioni di tasti (vedi stty -a)
• da programma (con la funzione di libreria kill )
Per inviare il segnale SIGHUP al processo 9876 si può digitare:
kill -SIGHUP 9876
kill -HUP 9876
kill -1 9876
5.1.17
Segnali comuni
L’elenco completo dei segnali inviabili può essere visualizzato con il comando kill -l. I segnali più importanti
sono:
• SIGHUP (hangup) - disconnessione (di solito usato per riavviare il processo e/o fargli rileggere il file di
configurazione)
• SIGINT (interrupt) - si desidera l’interruzione
• SIGQUIT (quit) - termine immediato con scrittura di un file core
• SIGKILL (non-graceful termination) - termine immediato, non gestibile
• SIGUSR1 (user signal 1) - segnale n. 1 a uso dell’utente
• SIGUSR2 (user signal 2) - segnale n. 2 a uso dell’utente
• SIGSTOP (stop) - sospensione del processo, non gestibile
5.1.18
Programmi utili per la gestione dei processi
Alcuni programmi che possono essere utili:
• pgrep, per trovare un processo in base a determinati criteri
• pkill, per inviare un segnale ai processi individuati in base a determinati criteri
• killall, per inviare un segnale a tutti i processi di un determinato programma
• nohup, per avviare un programma in modo che non termini quando viene chiuso il terminale da cui è stato
lanciato
• lsof -p, per avere un elenco dei file utilizzati da un determinato processo
5.1.19
Gestione delle priorità
Ad ogni processo è associato un livello di priorità.
-20 (alta)
0 (normale)
19 (bassa)
+------------------------+--------------------------+
I programmi possono essere avviati con bassa priorità (da tutti) o con alta priorità (da root) tramite il comando
nice
Ai processi può essere cambiata la priorità con il comando renice.
5.1.20
Gestione interattiva dei processi
Per una gestione interattiva dei processi, può essere utile il programma top.
Alcune opzioni interessanti possono essere attivate con la pressione di:
• [spazio], per aggiornare il display
• h, per ottenere aiuto
• k, per inviare un segnale ad un processo
• i, per mostrare/nascondere i processi in stato Sleep/Zombie
• n, per indicare quanti processi mostrare
• r, per cambiare la priorità di un processo
57
5.1.21
Esercizi
• Provare diverse opzioni del comando ps, aiutandosi con la guida in linea.
• Attivare un processo in background, portarlo in foreground, sospenderlo, riattivarlo in background e/o in
foreground.
• Usare il comando jobs per visualizzare l’elenco dei lavori in esecuzione in background.
• Inviare segnali di tipo SIGSTOP, SIGINT, SIGKILL ad un processo.
• Verificare con ps gli stati Running, Interruptible sleep, Stopped, Defunct (zombie) di processi appositamente creati.
• Verificare come i segnali possono essere gestiti da un programma
• Inviare un segnale di tipo SIGUSR1 ad un processo di dd
• Usare il programma bc per calcolare le prime 2000 cifre di Pi Greco, misurando il tempo impiegato con
time, prima in maniera normale e poi con bassa priorità
5.2
5.2.1
Backup e compressione dati
Tipi di backup
Le strategie di backup possono essere diverse a seconda delle necessità e delle quantità di dati da gestire.
Si suole distinguere tra le seguenti modalità:
• backup completo (d1, d2, d3, d4, d5...)
• backup incrementale (d1, d2-d1, d3-d2, d4-d3, d5-d4...)
• backup differenziale (d1, d2-d1, d3-d1, d4-d1, d5-d1...)
5.2.2
Tar
Il comando tar serve a riunire in un unico file il contenuto di una o più directory.
$ tar -cvf archivio.tar documenti/
documenti/
documenti/elencoutenti.txt
documenti/elencoservizi.txt
documenti/protocolli.txt
Di default tar non si occupa della compressione e non dereferenzia i link simbolici.
5.2.3
Tar (lista ed estrazione)
Per vedere i contenuti di un file tar si usa il comando tar -t, per estrarli il comando tar -x.
$ tar -tvf
drwxr-xr-x
-rw-r--r--rw-r--r-lrwxrwxrwx
archivio.tar
loris/jasiu
loris/jasiu
julie/jasiu
loris/jasiu
0
2297
15853
0
2007-03-22
2007-03-21
2007-03-21
2007-03-22
15:52
15:27
15:27
15:52
documenti/
documenti/elencoutenti.txt
documenti/elencoservizi.txt
documenti/protocolli.txt -> ../../fuoristruttura/protocolli.txt
$ tar -xvf archivio.tar
documenti/
documenti/elencoutenti.txt
documenti/elencoservizi.txt
documenti/protocolli.txt
58
5.2.4
Tar (estrazione singoli file)
I singoli file o le singole directory possono essere estratte usando la modalità interattiva (tar -xw) oppure
specificandone il nome.
$ tar -xvwf archivio.tar
extract ‘documenti’?y
documenti/
extract ‘documenti/elencoutenti.txt’?y
documenti/elencoutenti.txt
extract ‘documenti/elencoservizi.txt’?n
extract ‘documenti/protocolli.txt’?n
$ tar -xvf archivio.tar documenti/elencoutenti.txt
documenti/elencoutenti.txt
5.2.5
Tar e la compressione
I file tar spesso vengono compressi. Normalmente si usa compress, gzip o bzip2. Il comando tar può essere
usato direttamente con i rispettivi filtri:
$ tar -cvzf archivio.tar.gz documenti
$ tar -cvjf archivio.tar.bz2 documenti
$ tar -cvZf archivio.tar.Z documenti
$ file archivio*
archivio.tar:
archivio.tar.bz2:
archivio.tar.gz:
archivio.tar.Z:
# gzip
# bzip2
# compress
POSIX tar archive
bzip2 compressed data, block size = 900k
gzip compressed data, from Unix, last modified: Thu Mar 22 18:24:43 2007
compress’d data 16 bits
È buona prassi comprimere una tutti i file di una directory “dall’esterno” (includendo quindi anche la directory
stessa).
5.2.6
Tar: riepilogo azioni
Il comando tar va sempre usato con una delle seguenti “azioni” da specificare come prima opzione:
• A (--concatenate): aggiunge un archivio tar ad un altro
• c (--create): crea un file tar
• d (--diff): mostra le differenze tra un archivio e un file system, riportando le differenze
• r (--append): aggiunge dei file ad un archivio
• t (--list): elenca i contenuti di un archivio
• u (--update): aggiorna un archivio con file nuovi o modificati
• x (--extract): estrae i contenuti di un archivio
5.2.7
Compressione dei singoli file
Anche i singoli file possono essere compressi, direttamente con i programmi gzip, bzip2 e compress.
Di default, i file originali vengono sostituiti con le copie compresse, ma è possibile fare altrimenti con l’opzione
-c (--stdout):
$ ls
elencoservizi.txt elencoutenti.txt
$ gzip elencoservizi.txt
$ ls
elencoservizi.txt.gz elencoutenti.txt
$ gzip -c elencoutenti.txt > elencoutenti.gz
$ ls
elencoservizi.txt.gz elencoutenti.gz elencoutenti.txt
59
5.2.8
Decompressione dei singoli file
I file compressi possono essere estratti con i comandi gunzip, bunzip2, uncompress.
I file compressi con gzip e compress possono essere visualizzati al volo con zcat e zless.
5.2.9
Zip e Unzip
Il popolare formato zip è utilizzabile con Linux attraverso i programmi zip e unzip, che permettono di avere
una certa compatibilità con il mondo “windoze”.
Da tenere presenti alcune differenze fondamentali nelle modalità predefinite:
• zip dereferenzia i link simbolici
• zip non opera ricorsivamente
È possibile però ovviare con le opportune opzioni:
$ zip documenti.zip documenti
adding: documenti/ (stored 0%)
# senza ricorsione
$ zip -r
updating:
adding:
adding:
adding:
documenti.zip documenti
# i link simbolici vengono dereferenziati
documenti/ (stored 0%)
documenti/elencoutenti.txt (deflated 61%)
documenti/elencoservizi.txt (deflated 77%)
documenti/protocolli.txt (deflated 66%)
$ zip -ry
updating:
updating:
updating:
updating:
documenti.zip documenti # i link simbolici non vengono dereferenziati
documenti/ (stored 0%)
documenti/elencoutenti.txt (deflated 61%)
documenti/elencoservizi.txt (deflated 77%)
documenti/protocolli.txt (stored 0%)
5.2.10
Cpio
Il programma cpio è a volte usato per la sua caratteristica di ottenere i file da archiviare dallo standard input
(per questo lo si usa spesso con find ).
Ha tre modalità di lavoro:
• cpio -o serve ad archiviare
• cpio -i serve ad estrarre
• cpio -p serve a trasferire
Un esempio d’uso:
$ find struttura | cpio -o | gzip > struttura.cpio.gz
71 blocks
$ zcat struttura.cpio.gz | cpio -i
71 blocks
5.2.11
# archiviazione
# estrazione
Cpio (modalità copy-pass)
La modalità copy-pass effettua un’archiviazione in una directory diversa.
$ find documenti -name ’*txt’| cpio -pd destinazione/
36 blocks
L’opzione -d serve a creare le eventuali directory intermedie necessarie.
60
5.2.12
Md5sum
Il controllo dell’integrità di un file, soprattutto dopo che esso è stato trasferito via rete o su un supporto
rimovibile, può essere importante. Per esso è conveniente l’uso del programma md5sum, che calcola un checksum
a 128 bit di un file o del proprio standard input, secondo quanto previsto dall RFC 132125 .
$ md5sum mybackup.tgz
09b8cab17866102796512ff054957bc5
mybackup.tgz
Spesso l’output viene reindirizzato su un file chiamata MD5SUMS, usato poi per il controllo:
$ md5sum mybackup.tgz > MD5SUMS
$ md5sum -c MD5SUMS
mybackup.tgz: OK
5.2.13
Rsync
Il programma rsync può essere utilizzato per diversi scopi. È utilissimo per mantenere sincronizzati due filesystem
(o due alberi di directory), copiando solo i file modificati dopo l’ultima operazione di backup.
$ rsync -avz documenti documenti_copia
# copia la directory documenti
building file list ... done
sent 220 bytes received 20 bytes 480.00 bytes/sec
total size is 18185 speedup is 75.77
$ rsync -avz documenti/ documenti_copia
# copia i contenuti della direcory documenti
building file list ... done
sent 209 bytes received 20 bytes 458.00 bytes/sec
total size is 18185 speedup is 79.41
5.2.14
Rsync da/verso altro host
La sincronizzazione può essere fatta anche da o verso un altro host raggiungibile via ssh.
$ rsync -avz documenti loris@mercurio:documenti
# copia la directory documenti
# sull’host mercurio
Per operazioni di sincronizzazione periodiche conviene usare meccanismi di login senza invio di password (vedi
ssh-keygen).
5.2.15
Dump e Restore
Il backup di dati da partizioni ext2 ed ext3 può essere fatto con il programma dump, che permette backup interi
e incrementali.
loris@jasiu:~/Desktop/esperimenti/struttura$ dump -0uf
DUMP: Date of this level 0 dump: Thu Mar 22 21:51:42
......
DUMP: Date of this level 0 dump: Thu Mar 22 21:51:42
DUMP: Date this dump completed: Thu Mar 22 21:51:53
DUMP: Average transfer rate: 4302 kB/s
DUMP: DUMP IS DONE
boot.dump /boot
2007
2007
2007
Il ripristino va fatto con il comando restore.
5.2.16
Partimage
Partimage è un programma interattivo che può fare un backup completo (ed il successivo ripristino) dei blocchi
utilizzati di una partizione.
Il backup e il ripristino possono essere fatti su/da un altro host, tramite rete.
25 http://www.faqs.org/rfcs/rfc1321.html
61
5.2.17
Backup su CD/DVD
A volte può essere comodo fare il backup dei dati su CD-ROM o DVD-ROM.
Esistono a tale scopo le utility mkisofs e cdrecord per, rispettivamente, creare le immagini ISO dei dischi da
produrre e successivamente masterizzarli.
$ mkisofs -o backup.iso -JRAVv dir1 # crea l’immagine ISO di un cd-rom
$ cdrecord -v -eject speed=4 dev=0,3,0 backup.iso
# masterizza il cd
5.2.18
DVDisaster
Il programma dvdisaster26 consente di inserire nell’immagine ISO di un DVD dei dati di controllo che permettono
il ripristino completo dei dati principali nel malaugurato casa di corruzione (es. superficie graffiata).
5.2.19
Sistemi avanzati per il backup
Per esigenze di più alto livello, si può pensare di utilizzare software specifici, come ad esempio:
• Bacula27
• Amanda28
5.2.20
Attenzione a. . .
Nel definire le procedure di backup e ripristino bisogna ricordarsi di conrollare che vengano preservati:
• proprietari dei file
• permessi e ACL
• timestamp
• link simbolici
• percorsi dei file (assoluti o relativi)
5.2.21
Esercizi
1. comprimere un file di testo con zip, gzip, compress e bzip2, provando le diverse opzioni per la compressione;
verificare i risultati ottenuti
2. creare un archivio tar non compresso a partire da una directory
3. elencare i file appartenenti ad un archivio tar
4. estrarre i file appartenenti ad un archivio tar
5. scaricare il file all’url [[TODO]], determinare con file di che tipo è il suo contenuto e procedere in una
sorta di caccia al tesoro
5.3
5.3.1
Gestione degli utenti e dei gruppi
Utenti e gruppi
Utenti e gruppi sono normalmente memorizzati nei file /etc/passwd e /etc/group.
I numeri identificativi dell’utente (User Id, o UID) e del gruppo (Group Id, o GID) possono andare da 0 a
65535 (nei sistemi tradizionali).
L’utente root ha UID 0.
Tra gli altri utenti tipicamente presenti vi sono:
26 http://dvdisaster.net/en/
27 http://www.bacula.org
28 http://www.amanda.org
62
• utenti di sistema (di solito con UID inferiori a 100);
• utenti umani (di solito con UID superiori a 500, a 1000, a 10000, a seconda delle configurazioni);
• un utente nobody, per la gestione di attività che si vogliono mantenere anonime (es. anonymous ftp).
5.3.2
Il file /etc/passwd
Il file /etc/passwd contiene le informazioni sugli utenti del sistema.
Ogni riga contiene le informazioni su un utente. Ad esempio:
alice:x:1011:10006:Alice Alessandrini:/home/alice:/bin/bash
La riga contiene i seguenti campi (delimitati da :)
• username (alice);
• segnaposto per la password (x) - sempre più frequentemente le password (cifrate) vengono memorizzate
nel file /etc/shadow ;
• UID (1011)
• GID (10006) - gruppo primario
• campo commento / nome completo (Alice Alessandrini) - anche detto gecos per motivi storici (da
General Electrics Comprehensive Operating System)
• home directory (/home/alice)
• shell predefinita (/bin/bash)
Il campo gecos a volte viene suddiviso in sottocampi separati da virgole (vedi chfn(1) o finger(1)).
5.3.3
Il file /etc/group
Il file /etc/group contiene le informazioni sui gruppi.
Ogni riga contiene le informazioni su un utente. Ad esempio:
contab:x:10007:alice,carlo
produz:x:10008:berto
La riga contiene i seguenti campi (delimitati da :)
• groupname (contab);
• segnaposto per la password (x) - sempre più frequentemente le password, se utilizzate, vengono memorizzate nel file /etc/gshadow ;
• username delle persone che appartengono al gruppo come gruppo secondario.
I gruppi possono contenere solo utenti, non altri gruppi.
5.3.4
Leggere i dati dei database di sistema
I database di sistema, come /etc/passwd, /etc/group, /etc/services, /etc/protocols, /etc/hosts, possono essere
letti direttamente oppure con il programma getent.
getent presenta i dati del database di sistema corrente nella forma tradizionalmente impiegata nei file di testo,
eliminando eventuali righe di commento presenti.
È particolarmente utile quando il sistema usa altre forme di autenticazione (es. un server LDAP).
$ getent passwd
[...]
alice:x:1035:1005:Alice,,,:/home/alice:/bin/bash
bob:x:1036:1013:Bob,,,:/home/bob:/bin/bash
[...]
63
5.3.5
Modificare i dati degli utenti e dei gruppi
È in genere poco raccomandabile modificare manualmente i file contenenti i dati relativi agli utenti e ai gruppi.
In genere è preferibile:
• usare gli appositi comandi (es. useradd, usermod, ecc.) per agire sulle righe dei singoli utenti;
• usare i programmi dedicati per agire su tutto il file (es. vipw, vigr).
5.3.6
Aggiungere utenti
Gli utenti possono essere aggiunti con uno dei seguenti comandi:
• useradd (comando di basso livello)
• adduser (comando di alto livello)
Ad esempio:
$ sudo useradd james
$ sudo adduser jenny
Adding user ‘jenny’ ...
Adding new group ‘jenny’ (1002) ...
Adding new user ‘jenny’ (1001) with group ‘jenny’ ...
Creating home directory ‘/home/jenny’ ...
Copying files from ‘/etc/skel’ ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for jenny
Enter the new value, or press ENTER for the default
Full Name []: Jenny Smith
Room Number []: 12
Work Phone []: +39-0000-00001
Home Phone []: +39-0000-00002
Other []:
Is the information correct? [y/N] y
5.3.7
Aggiungere utenti - pattern per gli username
Evitate di creare utenti il cui username è basato sul pattern cognome-nome.
Se un utente si chiama Aldo Bianchi andranno evitati bianchia, bianchi.a, bianchialdo, bianchi.aldo, bianchi aldo,
ecc.
Andrà invece adottato uno username come aldo, abianchi, a.bianchi, aldobianchi, aldo.bianchi, aldo bianchi,
ecc. (a meno che esso non debba essere completamente scollegato dal nome reale, come succede spesso con i
nickname).
Ulteriori informazioni al riguardo di questo argomento, anche di tipo informatico, si trovano nel blog nome-ecognome29 .
5.3.8
Aggiungere utenti - valori di default
Per useradd i valori di default sono definibili con l’opzione -D (vengono inseriti nel file /etc/default/useradd ).
I valori di default per adduser sono invece nel file /etc/adduser.conf.
29 http://nome-e-cognome.blogspot.com/
64
5.3.9
Aggiungere utenti - operazioni batch
Quando si devono inserire molti utenti, ad esempio leggendo le informazioni su di loro da altre fonti, si possono
usare comandi per operazioni batch.
In particolare, possono essere utili chpasswd e newusers.
$ cat nuoviutenti
jackie:segreto:2000::Jackie White:/home/jackie:/bin/bash
freddie:segretissimo:2001::Freddie Bloom:/home/freddie:/bin/bash
$ sudo newusers nuoviutenti
$ getent passwd | tail -2
jackie:x:2000:65538:Jackie White:/home/jackie:/bin/bash
freddie:x:2001:65535:Freddie Bloom:/home/freddie:/bin/bash
$ echo julie:pulcinella | sudo chpasswd
5.3.10
Aggiungere gruppi
I gruppi possono essere aggiunti con uno dei seguenti comandi:
• groupadd (comando di basso livello)
• addgroup (comando di alto livello)
Ad esempio:
$ sudo groupadd bureau
$ sudo addgroup office
Adding group ‘office’ (GID 1004) ...
Done.
5.3.11
Modificare le informazioni sugli utenti
Le informazioni sugli utenti possono essere modificate con il programma usermod.
$ getent group | grep office
office:x:1004:jenny
$ sudo usermod -l jay jenny
$ getent group | grep office
office:x:1004:jay
$ getent passwd jay
jay:x:1001:1002:Jenny Smith,12,+39-0000-00001,+39-0000-00002:/home/jenny:/bin/bash
5.3.12
Eliminare utenti e gruppi
Poco sorprendentemente, gli utenti e i gruppi possono essere eliminati con i programmi userdel e groupdel
(basso livello), deluser e groupdel (alto livello).
Quando gli utenti vengono rimossi, bisogna decidere cosa fare delle loro cose (es. la home directory).
N.B. Se si vuole disattivare un account temporaneamente, è sufficiente effettuare il lock della password (usermod -L <username
l’unlock viene effettuato con usermod -U <username>.
5.4
5.4.1
Gestione delle quote disco
Impostare e gestire le quote disco
Spesso capita, in un sistema multiutente, di dover limitare lo spazio su disco disponibile per ogni singolo utente
o gruppo.
Le quote disco (per utente e/o per gruppo) possono essere abilitate sui singoli filesystem innestati (non sulle
directory).
65
Per attivare in maniera permanente le quote disco è necessario agire sul file /etc/fstab.
Ad esempio, potrebbe essere presente una voce come
/dev/hdc0 /home/users
ext3
defaults,usrquota,grpquota 0
0
Più avanti vedremo un esempio su un disco fittizio che possiamo usare per delle prove.
5.4.2
Concetti importanti relativi alle quote disco
È bene distinguere:
• per-user hard limit (non superabile)
• per-user soft limit (superabile per un certo periodo)
• per-group hard limit
• per-group soft limit
• grace period (il periodo di cui sopra)
5.4.3
Il comando Quota
Con il comando quota si può verificare qual è la situazione del singolo utente o gruppo.
$ quota
Disk quotas for user loris (uid 1000):
Filesystem blocks
quota
limit
grace
/dev/loop1
3516*
3000
4000
6days
files
2
quota
0
limit
0
grace
$ sudo quota -u jackie
Disk quotas for user jackie (uid 2000):
Filesystem blocks
quota
limit
grace
/dev/loop1
1005*
1000
1500
7days
files
1
quota
0
limit
0
grace
(N.B.) Il comando indicato, cosı̀ come quelli presentati successivamente, funziona a patto di avere una partizione
o un disco innestato (mounted ) con le quote attivate e definite. Nell’esercitazione che segue vengono date
indicazioni in merito.
5.4.4
I comandi Quotaon e Quotaoff
Con i comandi quotaon e quotaoff si può abilitare e disabilitare, rispettivamente, la gestione delle quote sui
filesystem precedentemente configurati.
$ sudo quotaon -v --all
/dev/loop1 [/home/discoq]: group quotas turned on
/dev/loop1 [/home/discoq]: user quotas turned on
$ sudo quotaoff -v --all
/dev/loop1 [/home/discoq]: group quotas turned off
/dev/loop1 [/home/discoq]: user quotas turned off
quotaon di solito è attivato automaticamente al boot grazie alla configurazione degli script di avvio in /etc/init.d,
che si possono anche chiamare direttamente:
$ sudo /etc/init.d/quota start
* Checking quotas...
* Turning on quotas...
$ sudo /etc/init.d/quota stop
* Turning off quotas...
[ OK ]
[ OK ]
[ OK ]
66
5.4.5
Il comando Quotacheck
Con il comando quotacheck si controlla la coerenza del database delle quote: eventuali problemi vengono
segnalati e, se possibile, risolti.
È raccomandabile eseguire quotacheck con le quote disattivate:
$ sudo quotaoff -av
/dev/loop1 [/home/discoq]: group quotas turned off
/dev/loop1 [/home/discoq]: user quotas turned off
$ sudo quotacheck -aguv
quotacheck: Scanning /dev/loop1 [/home/discoq] done
quotacheck: Checked 3 directories and 4 files
$ sudo quotaon -av
/dev/loop1 [/home/discoq]: group quotas turned on
/dev/loop1 [/home/discoq]: user quotas turned on
5.4.6
Il comando Edquota
Con il comando edquota si impostano le quote degli utenti e dei gruppi.
Si tratta di un comando interattivo, che avvia l’editor di riferimento:
Disk quotas for user loris (uid 1000):
Filesystem
blocks
/dev/loop1
3516
soft
3000
hard
4000
inodes
2
soft
0
hard
0
~
"/tmp//Edp.aCpxrAo" 3L, 217C
Per ogni utente/filesystem, si possono impostare i limiti soft e hard (sia per i blocchi, sia per gli inode), avendo
come riferimento le quantità attualmente impegnate.
5.4.7
Il comando Setquota
Il comando setquota permette di impostare gli stessi limiti di edquota, ma senza interattività:
$ sudo setquota -u loris 3000 4000 0 0 /home/discoq
5.4.8
Sforamento quota
Se si eccede il proprio limite, le operazioni di scrittura vengono bloccate:
$ dd if=/dev/zero of=grandefile count=5000
loop1: write failed, user block limit reached.
dd: writing to ‘grandefile’: Disk quota exceeded
963+0 records in
962+0 records out
492544 bytes (493 kB) copied, 0.0593655 seconds, 8.3 MB/s
Se non si supera la quota disponibile di inode, si possono ancora creare file (vuoti).
Attenzione: non sempre il fallimento della scrittura che fallisce per motivi di quota superata viene chiaramente
indicato.
5.4.9
Impostazione del Grace period
La durata del Grace period può essere impostata interattivamente con edquota -t o da riga di comando con
setquota -t.
67
5.4.10
Rapporto con Repquota
Con il comando repquota si può avere un rapporto sullo stato di uso del disco:
$ sudo repquota -a
*** Report for user quotas on device /dev/loop1
Block grace time: 7days; Inode grace time: 7days
Block limits
File limits
User
used
soft
hard grace
used soft hard grace
---------------------------------------------------------------------root
-1501
0
0
5
0
0
loris
+4000
3000
4000 6days
6
0
0
jackie
+1005
1000
1500 6days
1
0
0
5.4.11
Quote disco - esercitazione (1)
Per potersi esercitare senza creare appositamente una partizione vera, è possibile creare un file su disco che
verrà considerato a tutti gli effetti come una partizione:
$ sudo dd count=20000 if=/dev/zero of=/home/discovirtuale
20000+0 records in
20000+0 records out
10240000 bytes (10 MB) copied, 0.857081 seconds, 11.9 MB/s
$ sudo mkfs.ext3 -F /home/discovirtuale
mke2fs 1.40-WIP (14-Nov-2006)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
2512 inodes, 10000 blocks
...
This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
5.4.12
Quote disco - esercitazione (2)
Per abilitare la gestione delle quote disco, il file /etc/fstab deve contenere una riga dove questo supporto è
dichiarato. Ad esempio, si potrebbe aggiungere una riga come la seguente:
/home/discovirtuale /home/discoq
ext3
defaults,usrquota,grpquota 0
0
Il disco creato e formattato può essere innestato in una directory vuota con il comando mount.
$ sudo mount -o loop /home/discoq
# l’opzione -o loop è necessaria perché in questo caso si tratta di un file
Se per il file system è abilitato il journaling, si possono usare le opzioni usrjquota e grpjquota:
... defaults,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0
La voce jqfmt serve a specificare il formato per il file delle quote, da usare al posto di quello di default.
5.4.13
Quote disco - esercitazione (3)
La radice del file system innestato, su cui opera la gestione delle quote, deve contenere i due file (o uno solo,
dipende dalle esigenze) aquota.user e aquota.group, leggibili solo da root.
$ sudo touch /home/discoq/aquota.user
$ sudo touch /home/discoq/aquota.group
$ sudo chmod 600 /home/discoq/aquota.*
Se si desidera che gli utenti possano verificare la loro situazione autonomamente, i permessi dovranno essere
impostati a 644.
68
5.4.14
Quote disco - esercitazione (4)
Per inizializzare i due file, si usa il programma quotacheck.
$ sudo quotacheck -avug
quotacheck: Scanning /dev/loop1 [/home/discoq] done
quotacheck: Checked 3 directories and 4 files
Nota: alla prima esecuzione, viene emesso un warning, perché i file sono vuoti. Dopo l’inizializzazione, non lo
sono più:
$ ls -l /home/discoq/aquota.*
-rw------- 1 root root 6144 2007-12-09 21:02 /home/discoq/aquota.group
-rw------- 1 root root 6144 2007-12-09 21:02 /home/discoq/aquota.user
5.4.15
Quote disco - esercitazione (5)
Per attivare il controllo delle quote, si usa quotaon:
$ sudo quotaon /home/discoq
Si può ottenere un rapporto sullo stato corrente con repquota:
$ sudo repquota -v /home/discoq
*** Report for user quotas on device /dev/loop1
Block grace time: 7days; Inode grace time: 7days
Block limits
File limits
User
used
soft
hard grace
used soft hard grace
---------------------------------------------------------------------root
-1500
0
0
4
0
0
Statistics:
Total blocks: 6
Data blocks: 1
Entries: 1
Used average: 1.000000
5.5
5.5.1
Autorizzazioni e deleghe
Permessi sui file
Un primo importante livello di autorizzazioni è quello impostato con i permessi sui file e le directory (rwx : read,
write, execute), in abbinamento all’utente proprietario, al gruppo proprietario, agli “altri” (ugo: user, group,
others).
Un secondo livello è impostabile con i bit SUID e SGID, che consentono, come visto, di far eseguire programmi
con i permessi del proprietario (o del gruppo proprietario) del file eseguibile.
5.5.2
Privilegi utente
Nei sistemi Debian/Ubuntu è possibile impostare privilegi particolari per gli utenti di un sistema desktop facendo
appartenere o meno questi ultimi a determinati gruppi:
$ groups alice
studenti plugdev lpadmin
5.5.3
Corrispondenza tra privilegi e gruppi
Nei sistemi Debian/Ubuntu i privilegi corrispondono all’appartenenza ai gruppi indicati qui di seguito.
• plugdev: Accedere automaticamente a dispositivi di memoria esterni
• video: Acquisire video da TV o Webcam e usare l’accelerazione 3d
69
Figura 3: Proprietà dell’account
• admin: Amministrare il sistema
• sambashare: Condividere i file con la rete locale
• lpadmin: Configurare le stampanti
• dip: Connettere a Internet usando un modem
• netdev: Connettere a reti wireless ed ethernet
• fax: Inviare e ricevere fax
• adm: Monitorare i registri di sistema
• fuse: Montare i filesystem in userspace
• scanner: Usare gli scanner
• audio: Usare i dispositivi audio
• dialout: Usare i modem
• tape: Usare le unità a nastro
• cdrom: Usare le unità CD-ROM
5.5.4
Su
Il programma su (switch user ) consente di “impersonare” un altro utente, aprendo una shell o eseguendo un
determinato comando, a patto di conoscerne la password (a meno di non essere root, che può impersonare
chiunque anche senza conoscerne la password).
In assenza di indicazione, viene impersonato l’utente root, per cui erroneamente a volte il nome del programma
viene considerato con il significato di super user.
Con l’opzione -l la shell viene aperta con le impostazioni dell’utente “impersonato”:
$ pwd
/tmp
$ su
Password:
# pwd
/tmp
# exit
$ su -l
Password:
# pwd
/root
70
5.5.5
Su -c
Tramite il programma su è possibile eseguire un comando per conto di un altro utente:
# whoami
root
# su -l loris -c whoami
loris
5.5.6
Sudo
Il programma sudo (switch user and do) consente ad un utente di esercitare una delega (cioè di eseguire un
programma che non potrebbe altrimenti eseguire) predisposta per lui da root.
I vantaggi:
• è possibile delegare un utente a fare alcune operazioni e non altre
• non è necessario che la password di root sia nota (e neppure che essa esista)
• viene tenuta traccia nei file di log delle operazioni svolte
Nella configurazione standard, per esercitare una delega l’utente deve digitare la propria password (in modo da
evitare il problema del “terminale lasciato aperto”).
5.5.7
Il file /etc/sudoers
Il file contenente le “deleghe” è /etc/sudoers. È consigliabile modificare tale file con il comando visudo (che
effettua dei controlli al momento del salvataggio).
Un esempio di contenuto potrebbe essere il seguente, con si autorizzano gli utenti del gruppo contab ad eseguire
il comando /bin/cat per visualizzare il file /tmp/rootfile.txt.
# Host alias specification
Host_Alias SCHOOL=biegacz,geeky
# User alias specification
# Cmnd alias specification
Cmnd_Alias TMPVIEW = /bin/cat /tmp/rootfile.txt
# User privilege specification
root
ALL=(ALL) ALL
# Members of the admin group may gain root privileges
%admin
ALL=(ALL) ALL
%contab
SCHOOL=(ALL) TMPVIEW
Si veda sudoers(5) per esempi approfonditi.
5.5.8
Esercizio delle deleghe
Un utente può sapere di quali deleghe dispone con il comando sudo -l ed esercitarne una con il comando sudo:
$ cat /tmp/rootfile.txt
cat: /tmp/rootfile.txt: Permission denied
$ sudo cat /tmp/rootfile.txt
[sudo] password for john:
[...]
[Contents of the file...]
$ sudo -l
User john may run the following commands on this host:
(ALL) /bin/cat /tmp/rootfile.txt
71
5.5.9
Esecuzione di comandi a nome di altri utenti
Può essere comodo (o necessario) eseguire comandi impersonando altri utenti, reali o di sistema.
$ sudo -u www-data whoami
www-data
$ sudo -u alice whoami
alice
$ sudo -u alice touch /tmp/file_di_alice.txt
$ ls -l /tmp/file_di_alice.txt
-rw-r--r-- 1 alice
studenti
0 2009-07-20 06:04 file_di_alice.txt
Sulla base di questo si possono predisporre degli script che testano i permessi degli utenti:
$ sudo -u alice touch /tmp/prova.txt && \
echo ’alice riesce a scrivere in /tmp’ || \
echo ’alice non riesce a scrivere in /tmp’
alice riesce a scrivere in /tmp
$ sudo -u alice touch /etc/prova.txt && \
echo ’alice riesce a scrivere in /etc’ || \
echo ’alice non riesce a scrivere in /etc’
touch: cannot touch ‘/etc/prova.txt’: Permission denied
alice non riesce a scrivere in /etc
5.5.10
Registrazione delle operazioni basate su delega
Il file /var/log/auth.log contiene informazioni su chi e quando ha esercitato una delega:
Jul
8 15:14:30 biegacz sudo:
5.5.11
john : TTY=ttyp5 ; PWD=/tmp ; USER=root ; COMMAND=/bin/cat /tmp/rootfile.txt
Sudo e ridirezione dell’output
Se si vuole scrivere in una directory in cui non si hanno permessi di scrittura si può sfruttare sudo, ma non con
il classico meccanismo dello standard output.
Ad esempio, immaginiamo di dover scrivere un file con data e ora corrente nella directory /root:
$ date > /root/operazioni.txt
# manca il permesso di scrittura
bash: /root/operazioni.txt: Permission denied
$ sudo date > /root/operazioni.txt # non va bene...
bash: /root/operazioni.txt: Permission denied
$ date | sudo tee /root/operazioni.txt >/dev/null
# bingo!
In alternativa, si potrebbe usare dd, con il bonus di poter accodare i dati (modalità append ):
$ date | sudo dd of=/root/operazioni.txt conv=notrunc oflag=append 2>/dev/null
5.5.12
Fakeroot
Può capitare che alcuni programmi richiedano permessi di root per svolgere alcune operazioni legate alla manipolazione dei file. L’esempio tipico è quello di un utente che vuole creare un archivio compresso contenente dei
file che devono risultare dell’utente root quando (sulla macchina in cui) viene decompresso.
La soluzione è di usare il programma fakeroot, che lavora sostituendo provvisoriamente le librerie usate per le
funzioni di manipolazione dei file. Naturalmente nessun permesso reale viene acquisito. Si veda come esempio
la seguente sessione:
charlie$ whoami
# verifico di essere l’utente charlie
charlie
charlie$ ls -l bashrc # nella directory corrente ho un file di mia proprietà
-rw-r--r-- 1 charlie studenti 93 2009-07-21 07:22 bashrc
charlie$ fakeroot
# divento root (ma è una finzione)
root# whoami
# sembra vero, cambia anche il prompt :-)
root
root# ls -l bashrc
# il file sembra diventato di root
72
-rw-r--r-- 1 root root 93 2009-07-21 07:22 bashrc
root# tar czf bashrc.tgz bashrc
# creo un archivio con tar
root# touch /root/qualcosa
# provo a fare qualcos’altro come root, ma fallisco
touch: cannot touch ‘/root/qualcosa’: Permission denied
root# exit
# termino il lavoro come finto root
charlie$ tar tvzf bashrc.tgz
# verifico i permessi all’interno del file tar
-rw-r--r-- root/root
93 2009-07-21 07:22 bashrc
5.5.13
Attributi ext2
I filesystem di tipo ext2 e successivi permettono di imporre attributi speciali ai file mediante il comando chattr.
In particolare, possono rivelarsi utili:
• a: apertura in scrittura solo in modalità append
• i : il file è immodificabile e non può essere cancellato o rinominato
• S : ogni modifica al file viene immediatamente scritta su disco
Gli attributi possono essere visualizzati con il comando lsattr:
$ sudo chattr +i documento
$ lsattr documento
----i-------------- documento
$ mv documento documento2
mv: cannot move ‘documento’ to ‘documento2’: Operation not permitted
5.5.14
Access Control List
Se una partizione è innestata (mounted ) con l’opzione acl, su di essa è possibile operare usando delle access
control list per consentire di specificare in maniera più granulare quali utenti (o quali gruppi) possono accedere
(in lettura, scrittura e/o esecuzione) su determinati file o directory.
Ad esempio, supponiamo che Alice abbia il file documento.txt, al momento leggibile solo da lei:
alice$ ls -l documento.txt
-rw------- 1 alice studenti 68 2009-07-20 09:27 documento.txt
alice$ cat documento.txt
Questo è un documento di Alice.
Ma anche Bob deve poterlo leggere.
Alice può aggiungere il permesso di lettura per Bob con il programma setfacl :
alice$ setfacl -m user:bob:r documento.txt
alice$ ls -l documento.txt
-rw-r-----+ 1 alice studenti 68 2009-07-20 09:27 documento.txt
Bob potrà quindi leggere il documento:
bob$ cat documento.txt
Questo è un documento di Alice.
Ma anche Bob deve poterlo leggere.
5.5.15
Visualizzare le ACL
Per visualizzare le ACL impostate, si usa il programma getfacl :
alice$ getfacl documento.txt
# file: documento.txt
# owner: alice
# group: studenti
user::rwuser:bob:r-group::--mask::r-other::---
73
Può essere comoda anche una visione tabulare:
alice$ getfacl --tabular documento.txt
# file: documento.txt
USER
alice
rwuser
bob
r-GROUP studenti r-mask
r-other
r--
5.5.16
ACL e permessi standard
Il programma ls mostra un segno + dopo la lista dei permessi standard per segnalare la presenza di ACL, che
avvertono di eventuali problemi:
alice$ ls -l documento.txt
-rw-r-----+ 1 alice studenti 68 2009-07-20 09:27 documento.txt
Da questo output sembrerebbe che un utente del gruppo studenti, come Charlie, possa accedere in lettura al
file, ma cosı̀ non è:
charlie$ id
uid=1007(charlie) gid=1014(studenti) groups=1014(studenti)
charlie$ cat documento.txt
cat: documento.txt: Permission denied
Perché questo avviene? I bit standard riservati al gruppo vengono usati per indicare i permessi massimi consentiti
dalle ACL agli utenti (mask ).
5.5.17
Ereditarietà delle ACL
È possibile specificare, con l’opzione -d, un default per una directory, in modo che esso venga applicato a tutti
i file in essa creati:
alice$ setfacl -d -m user:bob:rx lettere
alice$ fortune > lettere/doc1.txt
bob$ cat lettere/doc1.txt
You display the wonderful traits of charm and courtesy.
5.5.18
Copia di file con ACL
Per copiare file preservando le ACL è necessario usare l’opzione -a del programma cp, oppure -A di rsync.
Il programma tar supporta le ACL, ma non (ancora) in Ubuntu (8.10). Si può ovviare al problema creando un
file di testo contenente le ACL, facendo il backup anche di quello e ripristinando le ACL dopo il ripristino dei
file:
$ getfacl -R * > ACLs.txt
$ sudo setfacl --restore=ACLs.txt
5.5.19
# backup delle ACL (con ricorsione)
# ripristino delle ACL
PolicyKit
(rinvio) Un sistema più granulare di autorizzazioni, soprattutto legate all’uso in ambiente desktop, è quello
previsto dal progetto PolicyKit30 .
30 http://hal.freedesktop.org/docs/PolicyKit/
74
5.6
5.6.1
Init e il processo di avvio
Il processo di avvio (prima parte)
Il processo tradizionale di avvio (boot) prevede i seguenti passi:
• accensione hardware
• caricamento BIOS (basic input/output system)
• caricamento del MBR (master boot record ) dai primi 512 byte del primo settore del disco cofingurato come
disco di avvio
• esecuzione del codice del boot loader (es. lilo o grub)
• esecuzione del kernel compresso
• inizializzazione dispositivi, caricamento moduli, ricerca e attivazione dell’initrd (initial RAM disk), attivazione del file system principale (/ )
• attivazione del processo 1 (/sbin/init)
5.6.2
Il processo di avvio (seconda parte)
Successivamente al caricamento di init vengono compiuti i seguenti passi:
• init legge il proprio file di configurazione (/etc/inittab)
• init esegue lo script /etc/init.d/rcS (Debian/Ubuntu) oppure /etc/rc.d/init.d/rc.sysinit (RedHat/Fedora/CentOS)
• controllo del file system, innesto (mount) dei file system locali, attivazione della rete, innesto file system
remoti
• passaggio al runlevel di default, con esecuzione degli script relativi
• attivazione dei terminali
• attivazione (se prevista) di X Window (es. con GDM )
5.6.3
Avvio e distribuzioni GNU/Linux
La seconda parte del processo di avvio avviene in maniera diversa a seconda della distribuzione.
In particolare:
• i sistemi basati sul modello Debian hanno gli script relativi ai servizi da avviare in /etc/init.d (con
link simbolici in /etc/rc0.d, /etc/rc1.d ecc.), mentre i sistemi basati sul modello RedHat li hanno in
/etc/rc.d/init.d (con link simbolici in /etc/rc.d/rc0.d, /etc/rc.d/rc1.d ecc.)
• la definizione dei runlevel è differente (sotto RedHat è più dettagliata)
• Ubuntu, a partire dalla versione 7.04 Feisty, ha adottato un modello alternativo, basato su eventi, denominato Upstart, compatibile ma di impostazione diversa
5.6.4
I bootloader
I due bootloader (caricatori del sistema operativo) più comunemente usati con Linux sono LILO (Linux Loader)
e GNU GRUB (GRand Unified Bootloader):
• il file di configurazione di LILO è /etc/lilo.conf ; perché le modifiche abbiano effetto, bisogna impartire il
comando lilo
• il file di configurazione di GRUB è /boot/grub/menu.lst; le voci di menù possono essere modificate all’avvio
(ad esempio con l’aggiunta di parametri) ed è a disposizione una piccola shell.
75
5.6.5
Configurazione di init
Il file di configurazione di init è /etc/inittab: esso contiene informazioni sul runlevel di default, sul numero di
terminali da attivare, sul trap della combinazione di tasti ctrl-alt-del ecc.
5.6.6
I runlevel
Un runlevel consiste nella definizione dello stato di un sistema mediante l’indicazione di quali programmi devono
essere eseguiti (eventualmente, in quale ordine) e di quali servizi devono essere attivati.
Tradizionalmente, vengono individuati i seguenti runlevel :
• 0 (system halt) nessun processo in esecuzione, ma calcolatore acceso)
• 1 (single-user) modalità manutenzione straordinaria
• 2 (multi-user) default sistemi Debian
• 3 (text-mode multi-user) su sistemi RedHat
• 4 non usato
• 5 (graphic-mode multi-user) su sistemi RedHat
• 6 (reboot) su sistemi RedHat
Per sapere qual è il runlevel corrente si può impartire il comando runlevel (che mostra anche il runlevel
precedente, oppure N se questo è assente).
$ runlevel
N 2
Per passare da un runlevel ad un altro si può usare il comando telinit.
5.6.7
Gli script di avvio dei servizi
Gli script di avvio/terminazione dei servizi (o, in generale, dei programmi) da eseguire quando si entra o esce
in un determinato runlevel sono posti nella directory /etc/init.d (Debian) o /etc/rc.d/init.d (RedHat).
Si tratta di script impostati in modo da poter essere invocati anche manualmente per avviare (parametro start),
terminare (parametro stop), riavviare (parametro restart) un servizio (oppure, con il parametro reload, fargli
rileggere il file di configurazione).
$ sudo /etc/init.d/apache2 start
* Starting web server apache2
$ sudo /etc/init.d/apache2 reload
* Reloading web server config apache2
$ sudo /etc/init.d/apache2 restart
* Restarting web server apache2
$ sudo /etc/init.d/apache2 stop
* Stopping web server apache2
[ OK ]
[ OK ]
[ OK ]
[ OK ]
Le varie distribuzioni mettono a disposizione “scorciatoie” per invocare questi script, come service e invoke-rc.d.
5.6.8
Definizione dei runlevel
Cosa esattamente avviare quando il sistema entra in un particolare runlevel è determinato dai link simbolici
presenti nella directory di quel runlevel.
I link simbolici hanno un nome che inizia per S (start) o per K (kill), più un numero che indica la priorità (utile
se si vuole garantire che un determinato servizio parta solo dopo un altro).
$ ls /etc/rc2.d/
K74bluetooth
README
S05vbesave
S10acpid
S10powernowd.early
S10sysklogd
S10xserver-xorg-input-wacom
S11klogd
S12dbus
S12hal
S16ssh
S19cupsys
S20apmd
S20apport
S20hotkey-setup
S20incron
S20makedev
S20nvidia-kernel
S20postfix
S20powernowd
S20rsync
S20samba
S22consolekit
S23ntp
S24avahi-daemon
S24dhcdbd
S30gdm
S65firestarter
76
S89anacron
S89atd
S89cron
S91apache2
S98usplash
S99acpi-support
S99laptop-mode
S99rc.local
S99rmnologin
S99stop-readahead
5.6.9
Configurazione dei runlevel
La configurazione dei runlevel può essere fatta:
• manualmente, tramite modifica dei link simbolici presenti
• da riga di comando, con strumenti quali chkconfig (RedHat), update-rc.d (Debian) ecc.
• tramite GUI, con strumenti quali ntsysv (RedHat), sysv-rc-conf, sysvconfig (Debian), services-admin
(Gnome)
Figura 4: Uso di sysvconfig
5.6.10
Chkconfig
La configurazione dei vari servizi può essere agevolmente effettuata con chkconfig, strumento tipico dei sistemi
RedHat ma portato anche su Ubuntu.
$ sudo chkconfig --add verysimplewebserver
Adding system startup for /etc/init.d/verysimplewebserver ...
$ sudo chkconfig --del verysimplewebserver
Removing any system startup links for /etc/init.d/verysimplewebserver ...
$ sudo chkconfig --level 234 verysimplewebserver on
Adding system startup for /etc/init.d/verysimplewebserver ...
$ chkconfig --list | grep verysimplewebserver
verysimplewebserver
1:none 2:on
3:on
4:on
5:none 6:none S:none
Sotto Ubuntu, con l’opzione --dryrun si può vedere quali comandi verrebbero eseguiti.
5.6.11
Informazioni negli script di avvio
Gli script relativi ai servizi contengono delle informazioni, sotto forma di commento, che vengono utilizzate per
sapere quali sono i livelli di priorità di default.
Le prime righe dello script httpd di un sistema Fedora 8 :
#!/bin/bash
# httpd
Startup script for the Apache HTTP Server
# chkconfig: - 85 15
Le prime righe dello script apache2 di un sistema Ubuntu 7.10 :
#!/bin/sh -e
[snip]
# Default-Start:
# Default-Stop:
### END INIT INFO
2 3 4 5
0 1 6
77
5.6.12
Sequenze di avvio “moderne”
I sistemi moderni (specialmente desktop e laptop) hanno bisogno di gestire la sequenza di avvio:
• secondo un modello ad eventi, ad esempio facendo avviare un servizio quando viene collegato un disco
USB o a seconda della presenza o meno di un collegamento di rete
• con una gestione chiara delle dipendenze (da cui determinare l’ordine di avvio, in luogo dell’ordine numerico
tradizionale)
• con la possibilità di un avvio in parallelo dei servizi
Sono state studiate diverse forme moderne di gestione della sequenza di avvio:
• initNG31
• Apple Launchd32
• Solaris Service Management Facility33
• Ubuntu Upstart34 , usato anche da Fedora
• kyuba35
Nei sistemi che usano Upstart, la configurazione di init viene fatta attraverso i file presenti nella directory
/etc/event.d.
5.6.13
Spegnere il sistema
Per spegnere il sistema si deve impartire il comando shutdown.
$ sudo shutdown -h now
$ sudo shutdown -r now
$ sudo shutdown -t 10
# spegne il sistema immediatamente
# riavvia il sistema dopo averlo spento
# spegne il sistema dopo 10 secondi
Per altre opzioni interessanti, si veda shutdown(8).
Sono normalmente a disposizione anche le forme sintetiche halt, reboot e poweroff.
5.6.14
Esercizi
• Verificare la corrispondenza tra link simbolici della directory del runlevel corrente e processi attivi.
• Provare ad avviare/terminare uno dei servizi presenti con i comandi della directory init.d.
• Cambiare l’impostazione di un runlevel (ad es. eliminando da esso l’attivazione di un servizio) e verificare
il cambiamento dei link simbolici (ad esempio usando find).
5.7
5.7.1
Inetd e Xinetd
Servizi, démoni e processi serventi
Per servizio si intende un programma che, su richiesta di un programma cliente, effettua qualche tipo di lavoro
(e solitamente fornisce un feedback). Per quanto riguarda questa definizone, non importano i dettagli tecnici
dell’implementazione.
Per démone (daemon) si intende un programma che è in esecuzione continua in background, in attesa di
richieste di attivazione da parte di qualche cliente.
I servizi possono essere implementati:
• come démoni (c.d. servizi stand-alone)
• come processi serventi (server processes, c.d. servizi on-demand )
La differenza fondamentale consiste nel fatto che i servizi on-demand non sono costantemente in esecuzione, ma
vengono invocati solo quando necessario.
31 http://www.initng.org
32 http://developer.apple.com/MacOsX/launchd.html
33 http://www.sun.com/bigadmin/content/selfheal/smf-quickstart.jsp
34 http://upstart.ubuntu.com
35 http://kyuba.org/kyuba
78
5.7.2
Il superdemone
Ad occuparsi dell’invocazione dei processi serventi, quando necessario, è un super-démone, che rimane in ascolto
“per conto terzi”.
Questo super-démone è, a seconda della distribuzione/configurazione, inetd oppure xinetd.
Concettualmente, i due superdemoni sono simili. La differenza sta in una configurazione più precisa che si può
avere con il secondo (non a caso: la x sta per extended ).
La configurazione è:
• per inetd, nel file /etc/inetd.conf (una riga per ogni servizio)
• per xinetd, nella directory /etc/xinetd.d (un file per ogni servizio)
5.7.3
Configurazione di un servizio gestito dal super-démone
La configurazione di un servizio stand-alone (nell’esempio, swat) può essere fatta in uno dei modi seguenti.
Se si usa inetd, con una riga tipo:
swat
stream
tcp
nowait.400
root
/usr/sbin/tcpd
/usr/sbin/swat
Se si usa xinetd, con un file tipo:
# default: off
service swat
disable = no
port
= 901
socket_type = stream
wait
= no
only_from
= 127.0.0.1
user
= root
server
= /usr/sbin/swat
log_on_failure += USERID
}
5.7.4
TCP wrappers
È possibile configurare da quali host è possibile la connessione a servizi gestiti dal super-démone (o che usano
la libreria librwap.
I due file che controllano le connessioni possibili sono:
• /etc/hosts.allow (letto per primo)
• /etc/hosts.deny (letto per secondo)
Valgono i seguenti criteri:
• prima corrispondenza (per quanto riguarda l’ordine di lettura dei file e delle righe dei file)
• lettura ad ogni richiesta (modifiche con impatto immediato)
• lettura solo in caso di esistenza
Per dettagli sui file, si veda hosts_access(5).
5.8
5.8.1
Kernel, gestione, configurazione e compilazione
Kernel monolitici vs. kernel modulari
Un kernel (nucleo del sistema operativo) può essere compilato come:
• monolitico (se include staticamente il codice per tutti i possibili dispositivi hardware a disposizione)
• modulare (se include solo il codice per l’hardware principale, e ha a disposizione dei moduli, da caricare
quando necessario, per la gestione di vari altri dispositivi)
La maggior parte degli utenti Linux usa kernel modulari, perché ciò garantisce una maggior flessibilità.
79
5.8.2
Che kernel sto usando?
Per sapere qual è il kernel in uso si può usare il comando uname -r:
$ uname -r
2.6.27-11-generic
N.B. Da non confondersi con la versione della distribuzione usata:
$ lsb_release -a
Distributor ID: Ubuntu
Description:
Ubuntu 8.10
Release:
8.10
Codename:
intrepid
A partire dal kernel 2.5.48 ci sono state modifiche importanti alla gestione dei moduli (estensione .ko, versioni
diverse dei programmi di gestione, ecc.).
5.8.3
Impostazioni dinamiche del kernel
Con il programma sysctl si possono impostare o leggere i valori di configurazione del kernel.
$ sudo sysctl -w kernel.hostname=biegacz
kernel.hostname = biegacz
$ sudo sysctl kernel.hostname
kernel.hostname = biegacz
Il file /etc/sysctl.conf contiene la configurazione letta all’avvio del calcolatore.
5.8.4
Moduli
I moduli disponibili sono nella directory /lib/modules, all’interno di una sottodirectory per la specifica versione
di kernel:
$ ls -F /lib/modules/$(uname -r)
build@
madwifi/
modules.ieee1394map
extra/
modules.alias
modules.inputmap
initrd/ modules.ccwmap modules.isapnpmap
kernel/ modules.dep
modules.ofmap
modules.pcimap
modules.seriomap
modules.symbols
modules.usbmap
net/
ubuntu/
volatile/
Nella maggior parte dei casi, i moduli vengono caricati automaticamente quando necessario. In casi di particolari
necessità, può essere utile saper elencare, caricare o rimuovere moduli dal kernel.
5.8.5
Elenco dei moduli caricati
L’elenco dei moduli caricati si ottiene con il comando lsmod (oppure, con output diverso, visualizzando il file
/proc/modules).
$ lsmod | head -10
Module
vesafb
wlan_tkip
aes_i586
geode_aes
blkcipher
aes_generic
wlan_ccmp
af_packet
binfmt_misc
Size
8964
13568
33536
7176
8324
27712
9600
23812
12808
Used by
0
0
0
0
1 geode_aes
0
0
0
1
80
5.8.6
Caricamento di un modulo
I moduli possono essere caricati direttamente con insmod, che però non risolve automaticamente le dipendenze:
$ cd /lib/modules/‘uname -r‘
$ find . -iname msdos
./kernel/fs/msdos
$ sudo insmod ./kernel/fs/msdos/msdos.ko
insmod: error inserting ’./kernel/fs/msdos/msdos.ko’: -1 Unknown symbol in module
$ sudo insmod ./kernel/fs/fat/fat.ko
$ sudo insmod ./kernel/fs/msdos/msdos.ko
(Teoricamente dovrebbe essere possibile inserire i moduli usando solo il loro nome, senza il percorso completo)
5.8.7
Rimozione di un modulo
I moduli possono essere rimossi con rmmod, che però fallisce se ci sono dipendenze:
$ sudo rmmod fat
ERROR: Module fat is in use by msdos
$ sudo rmmod msdos
$ sudo rmmod fat
5.8.8
Informazioni su un modulo
Si possono ottenere informazioni su un modulo (ad esempio le sue dipendenze) con modinfo:
$ modinfo msdos
filename:
description:
author:
license:
srcversion:
depends:
vermagic:
5.8.9
/lib/modules/2.6.24-16-generic/kernel/fs/msdos/msdos.ko
MS-DOS filesystem support
Werner Almesberger
GPL
4BF2299125E22266BA734C0
fat
2.6.24-16-generic SMP mod_unload 586
Installazione e rimozione semplificate
Con il comando modprobe si possono installare e rimuovere i moduli con il riconoscimento automatico delle
dipendenze:
$ sudo modprobe -v msdos
insmod /lib/modules/2.6.24-16-generic/kernel/fs/fat/fat.ko
insmod /lib/modules/2.6.24-16-generic/kernel/fs/msdos/msdos.ko
$ sudo modprobe -rv msdos
rmmod /lib/modules/2.6.24-16-generic/kernel/fs/msdos/msdos.ko
rmmod /lib/modules/2.6.24-16-generic/kernel/fs/fat/fat.ko
5.8.10
Tipi e formati di kernel
Il kernel di Linux è un file eseguibile risultante dalla compilazione dei sorgenti del kernel stesso.
Bisogna distinguere:
• vmlinux, il kernel in forma non compressa e non avviabile (dove vm sta per virtual memory, caratteristica
gestita fin dalle primissime versioni), stadio intermedio del processo di generazione del kernel
• zImage, una versione compressa (con gzip) e avviabile del kernel, usata in vecchi calcolatori (per i quali
è necessario la scompattazione in memoria bassa, sotto i 640 KiB)
• bzImage, una versione compressa (sempre con gzip) e avviabile del kernel, usata nei calcolatori moderni
(la b sta per big)
• vmlinuz*, le versioni di kernel effettivamente avviabili al boot (possono essercene diverse)
81
5.8.11
I sorgenti del kernel
Il codice sorgente del kernel linux è disponibile nei Linux Kernel Archives36 .
Sono molte le patch rese disponibili da programmatori e aziende di tutto il mondo. Il kernel ufficiale, senza
queste patch, è detto kernel vanilla.
I numeri di versione hanno la forma major.minor.patchlevel.
Un valore pari per minor indica un kernel indicato come stabile, un valore dispari un kernel di sviluppo (non
c’è ancora un kernel 2.7).
5.8.12
Verifica della firma digitale
I file disponibili su www.kernel.org sono firmati digitalmente con gpg da [email protected].
Dopo aver scaricato un file, è consigliabile verificarne la firma digitale:
$ wget -c http://www.eu.kernel.org/pub/linux/kernel/v2.6/patch-2.6.25.gz
[snip]
16:09:32 (65.55 KB/s) - "patch-2.6.25.gz" salvato [11759164/11759164]
$ wget -c http://www.eu.kernel.org/pub/linux/kernel/v2.6/patch-2.6.25.gz.sign
[snip]
16:09:52 (7.88 MB/s) - "patch-2.6.25.gz.sign" salvato [248/248]
$ gpg --verify patch-2.6.25.gz.sign patch-2.6.25.gz
# dopo aver importato la chiave pubblica...
gpg: Firma fatta da gio 17 apr 2008 05:23:09 CEST usando DSA ID chiave 517D0F0E
gpg: Good signature from "Linux Kernel Archives Verification Key &lt;[email protected]&gt;"
5.8.13
Le fasi della compilazione del kernel
Per ricompilare il kernel, si deve procedere in questo modo:
1. scaricare gli strumenti di lavoro (compilatore, linker ecc.)
2. scaricare i sorgenti del kernel (della propria distribuzione o vanilla) e scompattarla
3. scaricare eventuali patch che si desiderano utilizzare
4. applicare le patch
5. fare la configurazione (vedi oltre)
6. compilare (approfondimento successivo)
7. installare e testare (approfondimento successivo)
5.8.14
Configurazione del kernel (1)
La configurazione avviene tramite appositi strumenti (alternativi tra loro) che aiutano a creare il file .config.
• make config (interfaccia testuale di base)
• make menuconfig (interfaccia testuale semigrafica, basata su ncurses)
• make xconfig (interfaccia grafica Xwindow)
• make gconfig (interfaccia grafica basata su librerie gtk )
• make oldconfig (partenza dalla configurazione corrente, crea il file .config senza fare domande)
36 http://www.kernel.org
82
5.8.15
Configurazione del kernel (2)
Per ogni caratteristica distintiva (feature) bisogna indicare se si desidera che essa:
• venga inclusa in maniera statica
• venga inclusa come modulo
• non venga inclusa
Può essere utile:
• copiare il catalogo della localizzazione in italiano37
• dare un’occhiata ad una guida che spiega nel dettaglio le voci più interessanti, come quella di sevencapitalsins38
• leggere il capitolo sulla Lettura dei codici sorgente del Kernel39 della Wikiversity
5.8.16
Compilazione
La compilazione attraversa tradizionalmente le seguenti fasi:
1. make dep (genera le dipendenze)
2. make clean (elimina file creati provvisoriamente in compilazioni precedenti)
3. make bzImage (genera il kernel compresso e avviabile)
4. make modules (genera i moduli)
5. make modules_install (installa i moduli nella directory /lib/modules/. . . )
Se tutto è andato a buon fine, si deve ancora:
1. copiare il file bzImage nella directory /boot/ (con un nome tipo vmlinuz-versionex
2. aggiornare la configurazione del bootloader (lilo o grub)
3. riavviare la macchina scegliendo il nuovo kernel, testandone le funzionalità
5.8.17
Compilazione Debian-way e Fedora-way
Compilazione ed installazione sono resi più semplici da appositi programmi che permettono di creare normali
pacchetti deb o rpm da installare e rimuovere nella maniera consueta.
$
$
$
$
$
$
make-kpkg clean
fakeroot make-kpkg --revision ~0.01 --append-to-version -versione01 hernel_image kernel_headers modules_image
cd ..
sudo dpkg -i linux-headers-*.deb
sudo dpkg -i linux-image-*.deb
sudo dpkg -i modules-image-*.deb
Al termine, ci si troverà un nuovo kernel installato e selezionabile dal menù di grub, e che potrà essere disinstallato
come qualsiasi altro pacchetto.
$ dpkg --list | grep ’linux.*versione0’
ii linux-headers-2.6.24.3-versione0 ~0.00
ii linux-image-2.6.24.3-versione0
~0.00
Header files related to Linux kernel, specifically,
Linux kernel binary image for version 2.6.24.3-versione0
Qualcosa di analogo si può fare con Fedora40 .
37 http://massimo.solira.org/pcikl/download.html
38 http://sevencapitalsins.wordpress.com/kernel
39 http://en.wikiversity.org/wiki/Reading
40 http://www.howtoforge.com/kernel
the Linux Kernel Sources
compilation fedora
83
5.8.18
Initrd e Initramfs
Nella directory /boot trovano normalmente posto anche i file initrd (initial ram disks), filesystem minimali
completi necessari per un primo avvio della macchina (che può cosı̀ avvenire anche con un kernel in cui il
supporto per particolari filesystem sia compilato come modulo). Questi file sono normalmente (dal kernel 2.6)
in formato cpio compresso con gzip e sfruttano il filesystem initramfs.
$ file /boot/initrd.img-2.6.24-16-generic
/boot/initrd.img-2.6.24-16-generic: gzip compressed data, from Unix, last modified: Wed Apr 30 22:40:44 2008
$ zcat /boot/initrd.img-2.6.24-16-generic | cpio --extract
40110 blocks
$ ls -F
bin/ conf/ etc/ init* lib/ modules/ sbin/ scripts/ usr/ var/
6
Rete
6.1
6.1.1
Configurazione di rete
Concetti importanti
Questi concetti dovrebbero essere noti:
• network
• host
• subnet
• indirizzo IP
• DHCP
• maschera di rete (“sottorete” nella terminologia MS)
• gateway
• protocollo (TCP, UDP, ICMP)
• porta
Per approfondimenti, si vedano le pagine della Wikipedia, a partire da quella sull IPv441 .
6.1.2
Maschera di rete
Una maschera di rete può essere definita secondo la notazione decimale completa (es. 192.168.1.12/255.255.224.0)
oppure con una notazione abbreviata, indicando il numero di bit che identificano la rete (es. 192.168.1.12/19).
Il programma ipcalc può aiutare nei calcoli necessari alla gestione degli indirizzi IP:
$ ipcalc 192.168.1.12/19
Address:
192.168.1.12
Netmask:
255.255.224.0 = 19
Wildcard: 0.0.31.255
=>
Network:
192.168.0.0/19
HostMin:
192.168.0.1
HostMax:
192.168.31.254
Broadcast: 192.168.31.255
Hosts/Net: 8190
6.1.3
11000000.10101000.000 00001.00001100
11111111.11111111.111 00000.00000000
00000000.00000000.000 11111.11111111
11000000.10101000.000 00000.00000000
11000000.10101000.000 00000.00000001
11000000.10101000.000 11111.11111110
11000000.10101000.000 11111.11111111
Class C, Private Internet
Interfacce di rete
Le interfacce di rete ethernet sono di norma indicate come eth0, eth1, ecc.
L’interfaccia wireless è indicata come wlan0, oppure con un nome che indica il chipset usato (es. ath0 per le
interfacce Atheros).
Esiste inoltre, in tutti i sistemi, un’interfaccia di loopback, denominata lo.
41 http://it.wikipedia.org/wiki/IPv4
84
6.1.4
Gestione interfacce
È possibile visualizzare (e modificare) la configurazione delle interfacce di rete tramite il programma ifconfig.
$ ifconfig ath0
ath0
Link encap:Ethernet HWaddr 00:C0:A8:FD:AC:47
inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::2c0:a8ff:fefd:ac47/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:311901 errors:0 dropped:0 overruns:0 frame:0
TX packets:248500 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:337537207 (321.9 MB) TX bytes:116760011 (111.3 MB)
La configurazione da usare all’avvio del sistema è memorizzata nei file della directory /etc/sysconfig/networkscripts (sistemi RedHat/Fedora) o nel file /etc/network/interfaces (sistemi Debian/Ubuntu).
6.1.5
Gestione indirizzo gateway
È possibile visualizzare (e modificare) l’indirizzo del gateway di default tramite il programma route.
$ route
Kernel IP routing table
Destination
Gateway
192.168.1.0
*
link-local
*
default
.
Genmask
255.255.255.0
255.255.0.0
0.0.0.0
Flags
U
U
UG
Metric
0
1000
100
Ref
0
0
0
Use
0
0
0
Iface
ath0
ath0
ath0
La modifica può avvenire tramite i file di configurazione delle interfacce di rete oppure con il comando:
route add default gw 192.168.1.1
6.1.6
Corrispondenza tra indirizzo MAC e IP
Per ottenere una tabella con le corrispondenze tra indirizzi fisici delle interfacce di rete (MAC addresses) e
indirizzi IP, si può consultare la tabella ARP:
$ arp -n
Address
192.168.0.5
192.168.0.1
6.1.7
HWtype
ether
ether
HWaddress
00:15:f2:70:0f:4a
00:0c:f6:39:8e:da
Flags Mask
C
C
Iface
wlan0
wlan0
Ip
Il modo più moderno per operare sull’infrastruttura IP della propria macchina è tramite il programma ip, che
consente di gestire interfacce di rete, rotte, ecc.
$ ip addr show
[...]
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:c0:a8:fd:ac:47 brd ff:ff:ff:ff:ff:ff
i$ ip route show
[...]
default via 192.168.1.1 dev wlan0 proto static
default dev eth0 scope link metric 1000
6.1.8
Risoluzione dei nomi di host
L’attività con cui ad un nome di dominio pienamente qualificato viene fatto corrispondere un determinato
indirizzo IP è detta risoluzione del nome.
Essa avviene basandosi su un file di testo (/etc/hosts) presente sulla macchina, oppure interrogando un nameserver (server DNS), indicato nel file /etc/resolv.conf. L’ordine di ricerca è specificato nel file /etc/nsswitch.conf.
85
$ cat /etc/nsswitch.conf
[...]
hosts:
networks:
[...]
files mdns4_minimal [NOTFOUND=return] dns mdns4
files
Nota: le voci mdns4 hanno a che fare con il sistema di risoluzione di nomi e servizi nelle reti locali Avahi42 .
6.1.9
Programmi di utilità
Esistono innumerevoli programmi di utilità che possono essere impiegati per la configurazione e per la diagnosi
di problemi inerenti la rete.
La nostra cassetta degli attrezzi contiene:
• ifconfig
• ip
• route
• dhcpcd, dhclient, pump
• host, nslookup, dig
• hostname
• netstat
• ping
• traceroute
• tcpdump, ethereal, wireshark, nmap
Curiosità: apparentemente, nmap43 è il programma più usato per la rappresentazione delle attività di hacking
nei film.
6.1.10
Netstat
Il programma netstat mostra informazioni su tutte le connessioni attive:
$ netstat --protocol=inet,inet6 -n
Active Internet connections (senza server)
Proto Recv-Q Send-Q Local Address
tcp
0
0 192.168.0.100:39261
tcp
0
0 192.168.0.100:37817
Foreign Address
209.85.135.18:443
210.84.125.17:443
State
TIME_WAIT
ESTABLISHED
È anche possibile elencare i servizi in ascolto (con le relative porte occupate):
$ netstat --protocol=inet,inet6 -nl
tcp
0
0 127.0.0.1:3306
tcp
0
0 127.0.0.1:25
tcp6
0
0 :::80
0.0.0.0:*
0.0.0.0:*
:::*
LISTEN
LISTEN
LISTEN
42 http://avahi.org
43 http://nmap.org/movies.html
86
6.1.11
Connessioni PPP
Per configurare una connessione di rete tramite modem o su reti ISDN (o, in generale, tramite porta seriale) si
usa il PPP (Point-to-Point Protocol).
La configurazione più semplice di un modem seriale può essere fatta con il programma wvdialconf e le connessioni
possono essere avviate con il programma wvdial.
Altrimenti, si può usare il programma setserial per configurare il modem (ad esempio impostando il baud rate),
uno script per il programma chat per impostare il dialogo di connessione e il programma pppd per gestire la
connessione stessa.
Linux supporta i seguenti metodi di autenticazione PPP:
• PAP (Password Authentication Protocol )
• CHAP (Challenge Handshake Authentication Protocol )
• MSCHAP (Microsoft CHAP )
6.1.12
Ottenimento di indirizzo IP
Per ottenere tramite DHCP un indirizzo IP in una rete, è sufficiente eseguire il comando dhclient:
$ sudo dhclient
Internet Systems Consortium DHCP Client V3.1.2
...
Listening on LPF/wlan0/00:c0:a8:fd:ac:47
Sending on
LPF/wlan0/00:c0:a8:fd:ac:47
...
Sending on
Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
DHCPOFFER of 192.168.178.20 from 192.168.178.1
DHCPREQUEST of 192.168.178.20 on eth0 to 255.255.255.255 port 67
DHCPACK of 192.168.178.20 from 192.168.178.1
bound to 192.168.178.20 -- renewal in 423819 seconds.
6.1.13
Configurazione tramite interfaccia grafica
Naturalmente, è possibile la configurazione di molti aspetti relativi all’ambiente di rete tramite interfaccia
grafica. È sufficiente usare il programma network-admin (Sistema/Amministrazione/Rete).
Figura 5: Configurazione di rete con GNOME
6.1.14
Strumenti di rete
Il programma gnome-nettool (Sistema/Amministrazione/Strumenti di rete) consente di effetuare in modo grafico
alcune operazioni di test.
87
Figura 6: Strumenti di rete con GNOME
6.1.15
Risoluzione dei nomi in una rete locale
In una rete locale senza server DNS e con indirizzi IP assegnati dinamicamente, la risoluzione dei nomi può
avvenire grazie ad Avahi.
Le query DNS avvengono in maniera multicast e i vari host rispondono al nome assegnato a ciascuno con il
suffisso .local.
$ ping uczen.local
PING uczen.local (192.168.0.120) 56(84) bytes of data.
64 bytes from uczen.local (192.168.0.120): icmp_seq=1 ttl=64 time=0.037 ms
...
6.2
6.2.1
Clienti di rete
Clienti per la posta elettronica
I programmi clienti per la posta elettronica vengono chiamati, in generale, MUA (Mail User Agents). Tra essi
vale la pena di ricordare:
• mutt e pine (testuali)
• evolution , thunderbird e kmail (grafici)
Può inoltre rivelarsi utile il programma uuenview, che permette di inviare messaggi con allegati binari da riga
di comando.
6.2.2
Programmi per la consegna locale della posta
Nei sistemi Un*x esiste una categoria particolare di programmi: quelli che si occupano della consegna della
posta. Sono detti MDA (Mail Delivery Agents). Il più famoso è procmail, che permette di configurare quali
azioni devono essere intraprese all’arrivo di messaggi con determinate caratteristiche.
6.2.3
Clienti FTP
Le connessioni FTP possono essere avviate con programmi grafici (es. gftp) o da riga di comando (es. ftp).
6.2.4
Clienti web
L’accesso ai documenti presenti sul web può avvenire con i classici browswer grafici. Vale la pena di segnalare
però anche:
• wget e curl (per recuperare da riga di comando pagine web e documenti vari da siti web e FTP)
88
• lynx e elinks (per navigare con interfaccia testuale o ottenere una visualizzazione in puro testo del
contenuto di una pagina web)
Con curl si possono anche fare agevolmente dei post, e la cosa può tornare utile per automatizzare operazioni
su web (con degli script).
6.2.5
Clienti Telnet, SSH ecc.
È possibile naturalmente accedere a sistemi remoti con il classico programma telnet o con il più sicuro ssh.
6.2.6
Accesso da sistemi Windows
Se si è costretti ad usare un sistema Windows, è possibile effettuare connessioni a server SSH tramite gli
utilissimi:
• puTTY44 (per connessioni testuali)
• WinSCP45 (per trasferimento di file)
• XMing46 (server XWindow per Windows)
6.2.7
NetCat
Il programma NetCat, il “coltellino svizzero della rete”, permette di effettuare connessioni TCP o inviare datagrammi UDP ed è altamente configurabile. Ad esempio, per avere informazioni sulla data di ultima modifica di
un certo documento su web, si può impartire il seguente comando:
$
echo $’HEAD /graphics/gnu-head-mini.png HTTP/1.1\nHost: www.gnu.org\n’ \
| nc www.gnu.org 80 -q 1 | grep ^Last-Modified
Last-Modified: Mon, 14 Jun 2004 15:25:31 GMT
6.3
6.3.1
Posta elettronica
MTA, MDA e MUA
Nel contesto delle applicazioni legate alla posta elettronica, si distinguono tre diversi tipologie:
• MDA (Mail Delivery Agent) con il compito di consegnare la posta al destinatario, quando questa giunge
sul sistema (e quando è generata sul sistema stesso)
• MTA (Mail Transport Agent) con il compito di far sı̀ che i messaggi giungano a destinazione (ossia fino
al sistema sul quale è presente la casella di posta del destinatario)
• MUA (Mail User Agent), il programma usato effettivamente dall’utente per gestire la propria corrispondenza elettronica
6.3.2
Mail Transport Agent
La comunicazione tra MTA avviene con il protocollo SMTP (Simple Mail Transfer Protocol). Molto spesso un
MTA integra le funzioni di MDA.
Esempi noti di MTA:
• Sendmail
• Postfix
• Exim
44 http://www.chiark.greenend.org.uk/
sgtatham/putty/
45 http://www.winscp.net
46 sourceforge.net/projects/xming
89
6.3.3
Configurazione di un MTA
La posta viene consegnata al sistema configurato come gestore della posta per un determinato dominio nei
record MX (Mail eXchange) del DNS.
$ dig virgilio.it MX
; <<>> DiG 9.5.0-P2 <<>> virgilio.it MX
[snip]
;; QUESTION SECTION:
;virgilio.it.
IN MX
;; ANSWER SECTION:
virgilio.it.
1447
IN
MX
10 mxrm.virgilio.it.
Un MTA può essere configurato per tentare una consegna diretta dei messaggi, oppure per usare altri host
specifici (seguendo apposite tabelle di routing dei messaggi), oppure ancora per affidarsi sempre ad un singolo
smarthost (ad esempio, quello del provider).
Inoltre, l’MTA può essere configurato per rifiutare/respingere messaggi con determinati contenuti, riscrivere
intestazioni, ecc.
6.3.4
Mail User Agent
È il programma con il quale l’utente (umano) interagisce effettivamente.
Permette di comporre messaggi e spedirli (tramite un MTA), di accedere alla posta locale e, in alcuni casi, di
connettersi tramite protocollo POP3 o IMAP per la ricezione/visualizzazione dei messaggi.
Esempi noti di MUA:
• mutt
• kmail
• mozilla-thunderbird
• evolution
I messaggi di posta elettronica possono essere anche composti e letti con il comando mail.
6.3.5
Mail retrieval
Può capitare che il sistema di gestione della posta di un dominio non corrisponda ad una macchina della rete
locale (casalinga o aziendale), ma che sia invece fuori (tipicamente, presso un provider).
In questo caso, è necessario recuperare la posta esternamente, direttamente con un MUA (se supporta questa
funzionalità) o con un programma specifico, che può anche gestire caselle multidrop (l’idea è che la posta non
viene scaricata dal MUA quando l’utente umano preme il pulsante “Scarica posta”, ma ad intervalli regolari da
un programma apposito, che la fa trovare “già scaricata” al MUA).
Può essere utile tenere in considerazione:
• mailfilter (cancella i messaggi indesiderati prima di scaricarli)
• fetchmail (recupera i messaggi via POP3 o IMAP)
• retchmail (recupera i messaggi via POP3, opera in multi-thread)
6.3.6
Mail management
La posta in arrivo nella propria casella può essere gestita in maniera più o meno efficace e organizzata.
Il file /.forward permette di indicare:
• a chi reindirizzare la posta in arrivo (specificando un normale indirizzo di posta elettronica)
• quale programma invocare per la gestione della posta in arrivo (usando una pipe)
90
6.3.7
Organizzazione delle cartelle di posta elettronica
In un sistema con un server di posta elettronica configurato e con degli utenti che lavorano in locale, la posta è
in genere organizzata in questo modo:
• /var/spool/mail/ : contiene i messaggi destinati ad utenti locali che ancora non sono stati letti/prelevati
(anche se è comunque possibile, per l’utente, leggerli lasciandoli lı̀)
• /mbox : è il file in cui i messaggi letti vengono spostati dopo essere stati letti tramite il comando mail
• /mail : è la directory che contiene i messaggi di posta gestiti da programmi come pine o kmail
• /Mail : è la directory che contiene i messaggi di posta gestiti da mutt (ma l’impostazione può essere
cambiata in .muttrc
Altri programmi organizzano la posta in directory diverse:
• evolution usa /.evolution/mail/local
• thunderbird usa /.mozilla-thunderbird/*.default/Mail/Local Folders (dove * indica una sequenza di
caratteri che identifica il profilo)
6.3.8
Formati delle mailbox
I formati delle mailbox variano, ma in genere sono riconducibili ad uno dei seguenti standard:
• mbox: il formato tradizionale Unix, in cui i messaggi sono disposti uno dopo l’altro in un file di testo,
con una intestazione formata da una riga From
• MMDF: una variante del formato mbox, in cui i messaggi sono separati l’uno dall’altro tramite una
sequenza di quattro <ctrl>-A
• MH: si tratta di una directory in cui i messaggi sono registrati ognuno in un file separato, con un numero
progressivo come nome di file
• Maildir: introdotto da Qmail, è simile a MH, ma gestisce tre ulteriori sottodirectory (cur, tmp, new ) e
nomi di file per i singoli messaggi si cui è garantita l’unicità (utile in ambienti condivisi)
I MUA inoltre introducono spesso, per ottimizzare le prestazioni, dei file indice nascosti (.inbox.index, .inbox.index.ids, .inbox.index.sorted ).
Inoltre, si deve tenere presente che con il formato maildir una cartella ne può contenere un’altra (e si avrà quindi
anche .nomecartella.directory).
6.3.9
Procmail
Procmail può essere invocato a livello di sistema (in combinazione con il MTA) oppure singolarmente dal singolo
utente. Qui analizziamo il secondo caso.
Il file .forward dell’utente conterrà (le virgolette sono comprese):
"| exec /usr/bin/procmail"
Nella home directory dell’utente sarà poi presente il file di configurazione .procmailrc, che conterrà le regole da
applicare ai messaggi in ingresso.
91
6.3.10
Esempio di .procmailrc (1)
Il file è unico: qui viene mostrato in più parti per esigenze di organizzazione dello spazio.
Configurazione iniziale
PATH=$HOME/bin:/usr/local/bin:/usr/bin:/bin
MAILDIR=$HOME/mail
# assicurarsi che ci sia!
LOGFILE=$HOME/.procmail/log # molto utile
IMPURI=$HOME/impuri
METAMAIL_TMPDIR=$HOME/estratti
Poi si inizia con le diverse regole.
I messaggi con il subject indicato (espressione regolare) devono essere cestinati
:0
* ^Subject.*MAKE.*MONEY.*FAST
/dev/null
6.3.11
Esempio di .procmailrc (2)
Tutti i messaggi che arrivano da Julie vanno nella mailbox indicata (che deve esistere)
:0
* ^From.*julie
$MAILDIR/julie
Tutti i messaggi che contengono la parola delivery vengono messi, ognuno in un file a sé stante, nella directory
indicata
:0
* ^Subject.*delivery
$MAILDIR/delivery
6.3.12
Esempio di .procmailrc (3)
I messaggi con contenuto in formato MIME vengono passati a gzip che li comprime aggiungendoli al file indicato.
L’elaborazione continua con le regole successive (a causa del flag c).
:0 c
* ^Content-Type
| gzip >> $IMPURI/impuri.gz
Tutti i messaggi che hanno julie nell’oggetto vengono rispediti a julie@localhost
:0 c
* ^Subject.*julie
! julie@localhost
6.3.13
Esempio di .procmailrc (4)
Tutti i messaggi che contengono la parola ‘allegato’ vengono passati a metamail, che tramite variabile d’ambiente
è informato di usare una directory specifica per i file temporanei
I flag BH indicano di effettuare il test sia su body sia su head del messaggio I flag bh indicano di passare
all’elaborazione successiva sia il body sia lo head
:0 bhHB
* ^Subject.*allegato
| metamail -q -w -x
92
6.3.14
File di log di procmail
Il file di log generato da procmail può essere analizzato con il programma mailstat:
$ mailstat log
Total
----396
43453
696
381
2638
----47564
6.3.15
Number
-----1
2
1
1
2
-----7
Folder
-----/dev/null
gzip >> $IMPURI/impuri.gz
/home/loris/mail/delivery/
/home/loris/mail/julie
/var/mail/loris
Mailfilter
Permette di cancellare i messaggi prima di scaricarli da un server POP3.
Un esempio di file di configurazione:
LOGFILE=/home/john/.mailfilter/log
SERVER=popmail.qualcuno.net
USER=john
PASS=segretodipulcinella
PROTOCOL=pop3
PORT=110
DENY=^From:[email protected]
SHOW_HEADERS=yes
VERBOSE=3
6.3.16
Esempio di script per estrarre gli allegati
(Non pubblico)
6.4
6.4.1
Servizi di rete
Nota preliminare
Questa sezione è in via di sviluppo. Se e quando sarà necessario, la aggiornerò con informazioni specifiche per i
vari servizi da installare/configurare.
6.4.2
Servizi importanti: MTA
I server che si occupano di trasportare messaggi di posta elettronica da un host all’altro vengono chiamati
MTA (Mail Transfer Agent). Usano in genere il protocollo SMTP (porta 25) e si basano sul meccanismo del
cosiddetto store and forward.
I più famosi MTA nel mondo Un*x sono:
• sendmail
• postfix
• exim
Alcune cose importanti da sapere:
• cosa sono gli alias
• cos’è uno smart host
• cosa sono i file .forward
93
6.4.3
Configurazione di Postfix
Per una configurazione basilare di Postfix, può essere utile usare il comando
sudo dpkg-reconfigure postfix
Ulteriori configurazioni andranno fatte modificando il file /etc/postfix/main.cf.
6.4.4
Uso di Postfix con relay host esterno
Nel caso si usi un relay esterno che richiede autenticazione si può usare una configurazione come la seguente:
myhostname = beamer
relayhost = mail.example.com
smtp_use_tls=no
smtp_sasl_type = cyrus
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
smtp_sasl_security_options = noanonymous
# evita ntlm
smtp_sasl_mechanism_filter = LOGIN
6.4.5
Postfix con relay host esterno: credenziali
Il file /etc/postfix/sasl/saslpasswd contiene le credenziali di autenticazione
Ad esempio:
mail.example.com
john.doe:pulcinella
Il file hash delle password dev’essere generato con il comando
sudo postmap /etc/postfix/sasl/sasl_passwd
(Attenzione che entrambi poi devono avere come permessi 600)
Può essere poi necessario impostare un nome del dominio gestito nel file /etc/mailname.
6.4.6
Servizi importanti: Apache web server
Il server web più diffuso in assoluto è Apache.
6.4.7
Servizi importanti: Network File System (lato server)
La condivisione in rete di directory può essere fatta con NFS (Network File System).
L’esportazione avviene configurando opportunamente il file /etc/exports (si veda in proposito exports(5)).
$ cat exports
# /etc/exports: the access control list for filesystems which may be exported
#
to NFS clients. See exports(5).
/home/exported/writable
/home/exported/readable
6.4.8
*.local(rw,sync,no_subtree_check)
*.local(ro,sync,no_subtree_check)
Servizi importanti: Network File System (lato client)
Sul client, l’accesso alla directory condivisa avviene con un’operazione di innesto (mount).
Tipicamente, si aggiungerà una riga simile alla seguente al file /etc/fstab:
nfsserver.local:/home/exported/writable /home/remote/writable nfs
nfsserver.local:/home/exported/readable /home/remote/readable nfs
94
rw,lock,cto,actimeo=3600
ro,lock,cto,actimeo=3600
0 0
0 0
6.4.9
Servizi importanti: Samba
Il “colloquio” con sistemi Windows può avvenire grazie alla suite di programmi Samba, che permettono ad un
calcolatore Un*x di accedere a reti SMB/CIFS (Server Message Block / Common Internet File System) sia
come cliente sia come servente (ad esempio, emulando un PDC).
6.4.10
Servizi importanti: DNS
I serventi DNS (Domain Name System) hanno come compito primario quello di fornire l’indirizzo IP di un host
dato il suo nome.
Il programma tipicamente usato nei sistemi Un*x si chiama named.
6.5
6.5.1
Log e gestione degli eventi
Tipi di log
Su una macchina Linux sono presenti diversi tipi di file di log:
• log delle applicazioni (status delle applicazioni, eventi, richieste ecc.)
• log di sistema (stato dei dischi, dell’hardware, dei processi di sistema)
• log del kernel (statistiche relative ai processi e cose del genere)
6.5.2
Dmesg
I messaggi diagnostici del kernel, emessi all’avvio e in occasione di particolari operazioni hardware (ad esempio,
quando viene collegata una nuova periferica USB), possono essere visualizzati con il comando dmesg.
$ dmesg | head -5
[
0.000000] Linux version 2.6.22-14-generic (buildd@terranova) (gcc version 4.1.3 20070929 (prerelease) (Ubuntu
4.1.2-16ubuntu2)) #1 SMP Tue Feb 12 07:42:25 UTC 2008 (Ubuntu 2.6.22-14.52-generic)
[
0.000000] BIOS-provided physical RAM map:
[
0.000000] BIOS-e820: 0000000000000000 - 000000000009dc00 (usable)
[
0.000000] BIOS-e820: 000000000009dc00 - 00000000000a0000 (reserved)
[
0.000000] BIOS-e820: 00000000000e4000 - 0000000000100000 (reserved)
6.5.3
Dove sono i file di log
Il file di log di default è /var/log/messages.
In generale, i file di log sono mantenuti tutti nella directory /var/log.
6.5.4
Organizzazione in facility
Le operazioni di cui prendere nota sono organizzate in diverse facility, corrispondenti ad alcune operazioni di
base e tradizionali.
Le facility definite sono le seguenti:
• auth (login, logout ecc.)
• authpriv (informazioni riservate)
• cron (operazioni periodiche e pianificate)
• daemon (servizi che non hanno un file di log “privato”)
• ftp
• kern (messaggi del kernel)
• lpr (demone di stampa)
• mail (sottosistema di gestione della posta elettronica)
95
• news (sottosistema usenet per i newsgroup)
• syslog (messaggi gestiti da syslogd )
• user (messaggi di livello utente)
• uucp (sottosistema UUCP)
Sono inoltre previste le facility da local0 a local7, che possono essere usati per scopi particolari.
6.5.5
Priorità delle registrazioni di log
Le registrazioni effettuate nei file di log sono associate ad uno dei seguenti livelli di priorità:
• emerg (sistema inutilizzabile)
• alert (si deve intervenire al più presto)
• crit (condizioni critiche)
• err (condizione di errore)
• warning (avvertimento)
• notice (condizione normale)
• info (messaggio informativo)
• debug (messaggio di debug)
6.5.6
Configurazione delle attività di log
Il file /etc/syslog.conf contiene l’indicazione di dove registrare i messaggi di una determinata facility con una
particolare priorità.
Ad esempio, righe di questo genere
daemon.*
kern.*
-/var/log/daemon.log
-/var/log/kern.log
indicano che i messaggi relativi alle facility daemon e kernel, di qualsiasi priorità (ad eccezione del livello debug)
devono essere registrate nei file indicati (il segno - indica che non deve essere fatto il sync dopo ogni operazione
di scrittura).
Oltre che su file, le registrazioni di log possono essere mandate ad un terminale, ad un’altra macchina, a una
lista di utenti collegati ecc. In proposito, si veda syslog.conf(5).
6.5.7
Logger
Con il programma logger si possono registrare operazioni per una determinata facility/priorità.
Ad esempio:
$ logger -p local0.notice aggiornato orologio di sistema
$ tail -1 /var/log/messages
Mar 30 22:33:06 localhost loris: aggiornato orologio di sistema
6.5.8
xconsole
Da una sessione grafica, è possibile monitorare le registrazioni di log tramite xconsole, tramite il comando
xconsole -file /dev/xconsole &.
Si può determinare quali registrazioni far comparire sull’xconsole impostando il file /etc/syslog.conf con |/dev/xconsole
per le facility/priorità desiderate.
96
6.5.9
Lastlog
Può essere utile sapere quando è stato fatto l’ultimo login da un determinato utente. Quest’informazione si può
ottenere con il comando lastlog.
$ lastlog --user
Nome utente
loris
$ lastlog --user
Nome utente
alice
loris
Porta
tty1
dino
Porta
pts/4
Da
Ultimo accesso
dom mar 30 22:39:19 +0200 2008
Da
Ultimo accesso
07ud-w-l07-003.d mar mar 25 14:59:28 +0100 2008
Si veda lastlog(8) per ulteriori informazioni.
6.5.10
Rotazione dei file di log
La rotazione/compressione dei file di log è affidata al programma logrotate, invocato da cron a scadenze regolari e
configurato tramite il file /etc/logrotate.conf (e i file della directory /etc/logrotate.d per i log delle applicazioni).
Si veda lastlog(8) per ulteriori informazioni.
6.5.11
Reazione ad eventi
Potrebbe essere utile avviare uno script o, in generale, compiere una determinata azione, quando si verifica un
determinato evento registrato in un file di log. Una strategia possibile è quella di usare il programma inotifywait,
come nel seguente esempio:
#!/bin/sh
while inotifywait -e modify /var/log/messages; do
if tail -n1 /var/log/messages | grep httpd; then
gdialog --msgbox "Apache needs love!"
fi
done
6.5.12
File di log delle applicazioni
Molte applicazioni server registrano i propri log in directory separate. Ad esempio:
• il server web Apache in /var/log/apache2
• il server proxy Squid in /var/log/squid
• il server di database MySQL in /var/log/mysql
6.6
6.6.1
Netfilter e Iptables
Tra noi e il mondo
Figura 7: Schema di rete
Un calcolatore con il sistema operativo Linux può operare in diversi modi e con diverse funzioni all’interno di
una rete:
• Routing
• NAT / Masquerading
• SNAT, DNAT, Port Forwarding
97
• Filtering
• Logging
• Intrusion detection
• Load balancing / Traffic shaping
6.6.2
Routing
Un calcolatore con due interfacce di rete può agire da router facendo transitare i pacchetti dall’una all’altra.
Allo scopo, è necessario abilitare il cosiddetto ip forwarding, in maniera statica agendo sulla configurazione del
kernel (file /etc/sysctl.conf ) con l’impostazione
net.ipv4.ip_forward=1
oppure in maniera dinamica impartendo il comando:
sudo sysctl -w net.ipv4.ip_forward=1
Gli altri calcolatori dovranno indicarlo come (default) gateway.
6.6.3
NAT / Masquerading
Un calcolatore può:
• nascondere gli indirizzi IP di una rete verso l’esterno, mascherandoli con il proprio (SNAT, Source Network
Address Translation)
• fingere (nei confronti del mondo esterno) di offrire dei servizi, che in realtà sono offerti da un calcolatore
della rete interna (DNAT, Destination Network Address Translation)
Nel caso di calcolatori con indirizzo IP assegnato dinamicamente (tipicamente dal fornitore di connettività), il
source NAT viene chiamato masquerading.
Quando ce n’è bisogno, nei pacchetti viene alterato anche il numero della porta (PAT, Port Address Translation).
6.6.4
Source NAT / PAT
connessioni TCP viste
all’esterno
connessioni TCP viste
localmente
.---------------.
199.3.2.1:23
|
| 199.1.2.3:23
.---------.
<- - - - - - - - - - - - ->|
|<- - - - - - - - - - - ->| cliente |
196.1.2.3:1050 |
|
192.168.1.1:1050 ‘---------’
|
NAT/PAT
|
200.7.8.9:23
|
| 200.7.8.9:23
.---------.
<- - - - - - - - - - - - ->|
|<- - - - - - - - - - - ->| cliente |
196.1.2.3:1093 |
|
192.168.1.2:1050 ‘---------’
‘---------------’
Immagine tratta dagli Appunti di informatica libera47 di Daniele Giacomini.
6.6.5
Destination NAT
connessione TCP vista
all’esterno
connessione TCP vista
localmente
.---------------.
199.3.2.1:1045
|
| 199.1.2.3:1045
<- - - - - - - - - - - - ->|
NAT/PAT
|<- - - - - -.
196.1.2.3:80 |
|
:
‘---------------’
:
:
V 192.168.1.1:80
.----------.
| servente |
|
HTTP
|
| interno |
‘----------’
47 http://informaticalibera.net/
98
Immagine tratta dagli Appunti di informatica libera48 di Daniele Giacomini.
6.6.6
Filtering
Il filtraggio consiste nel decidere se far passare o no determinati pacchetti / segmenti.
Le decisioni possono essere prese:
• a livello hardware (es. sul MAC address)
• a livello di pacchetto / segmento (liv. 3–4 ISO/OSI)
– ispezione stateless
– ispezione stateful
• a livello applicativo (es. server proxy)
6.6.7
In base a cosa filtrare?
Per decidere della sorte di un pacchetto / segmento ci si può basare:
• sui contenuti
– interfaccia di rete
– mac address
– indirizzo ip sorgente/destinazione
– protocollo (TCP, UDP, ICMP)
– porta sorgente/destinazione
• sullo stato (ispezione stateful )
– new
– established
– related
– invalid
6.6.8
Netfilter e Iptables
Netfilter è la componente del kernel che si occupa del transito dei pacchetti IP.
Iptables è il comando con cui si amministrano le tabelle che usa Netfilter.
6.6.9
Le tabelle
Iptables gestisce tre tabelle in cui vengono definite le catene:
• filter (default)
• nat
• mangle
6.6.10
La tabella filter
La tabella filter ha lo scopo di determinare quali pacchetti / segmenti devono essere fatti transitare. Contiene
le catene:
• INPUT (pacchetti destinati all’host)
• FORWARD (pacchetti in transito)
• OUTPUT (pacchetti in uscita dall’host)
48 http://informaticalibera.net/
99
6.6.11
La tabella nat
La tabella nat ha lo scopo di determinare che tipo di operazioni sugli indirizzi IP e sulle porte TCP/UDP
devono essere fatte sui pacchetti in transito. Contiene le catene:
• PREROUTING (pacchetti in ingresso, DNAT)
• OUTPUT (pacchetti originati nell’host, DNAT)
• POSTROUTING (pacchetti in uscita, SNAT, MASQUERADE)
6.6.12
La tabella mangle
La tabella mangle ha lo scopo di determinare quali operazioni di manipolazione devono essere fatte sui pacchetti
in transito (ad esempio, modifica del TTL, time to live). Contiene le catene:
• PREROUTING (pacchetti in ingresso)
• OUTPUT (pacchetti originati nell’host)
6.6.13
Le catene
Di ogni pacchetto IP, viene decisa la sorte tramite il controllo di regole organizzate in catene.
Le regole hanno la forma
descrizione -> azione
Alla prima corrispondenza della descrizione, si applica l’azione (le regole successive vengono ignorate, tranne
nel caso in cui l’azione sia una registrazione dell’evento nel file di log).
In assenza di corrispondenze si applica la policy di default.
6.6.14
Comandi Iptables
Vediamo alcuni semplici comandi di iptables:
• visualizzazione delle regole correnti
– sudo iptables -nL INPUT
– sudo iptables -nL -t nat PREROUTING
• cancellazione di tutte le regole
– sudo iptables -F INPUT
• inserimento di una regola
– iptables -A INPUT [match] [operazione]
• eliminazione di una regola
– iptables -D INPUT [match] [operazione]
• impostazione di regole di “default” (policies)
– iptables -P INPUT [operazione]
• creazione di proprie catene
– iptables -N MiaCatena
100
6.6.15
Alcuni esempi di comandi
Qui di seguito sono riportati alcuni comandi con cui è possibile iniziare ad esercitarsi. Una lettura di iptables(8)
è quanto mai raccomandabile.
$ sudo iptables -nL INPUT
# mostra le regole correnti per la tabella filter
$ sudo iptables -F INPUT
# cancella la catena INPUT della tabella filter
$ sudo iptables -A INPUT -p tcp --dport 80 -j REJECT
# aggiunge la regola per rifutare tutti i pacchetti TCP
# destinati alla porta 80
$ sudo iptables -A INPUT -p tcp --syn -j REJECT
# aggiunge la regola per rifiutare tutti i pacchetti TCP
# con il bit syn impostato (che serve a iniziare una
# connessione)
$ sudo iptables -t nat -A OUTPUT -p tcp --dport 7080 -j REDIRECT --to-port 80
# aggiunge la regola per cui tutti i pacchetti TCP
# destinati alla porta 7080 vengono reindirizzati alla
# porta 80
$ sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 192.168.1.127:80
# aggiunger la regola per cui tutti i pacchetti TCP
# destinati alla porta 80 vengono reindirizzati al calcolatore
# con indirizzo IP 192.168.1.127
6.6.16
Save e Restore
La situazione corrente delle regola impostate può essere “fotografata” con il programma iptables-save, che
produce un file di testo leggibile dal programma iptables-restore.
$ sudo iptables-save > config
$ sudo iptables-restore < config
6.6.17
Il problema dell’FTP passivo
In alcune connessioni FTP, il client comunica al server FTP il numero di una porta sulla quale si pone in attesa
di connessione per ricevere i dati (FTP passivo).
Questa porta è bloccata per i pacchetti che iniziano connessioni dall’esterno.
Per fortuna esistono moduli del kernel che ci aiutano:
sudo modprobe ip_nat_ftp
sudo modprobe ip_conntrack_ftp
6.6.18
I proxy server
I proxy server (serventi intermediari) funzionano in userspace, a livello applicativo:
• interpretano alcuni particolari protocolli (es. HTTP, FTP)
• possono avere funzioni di cache collettiva
• possono essere fatti funzionare in maniera trasparente
6.7
6.7.1
Samba
Samba
Su Samba, il software che consente di effettuare molte cose per lo scambio di informazioni tra Windows e Linux,
ci sarebbero molte cose da dire. Qui appunterò soprattutto quelle per cui esiste poca documentazione.
101
6.7.2
Pdbedit
Gli account utenti possono essere registrati in file di testo, in file binari (tdb) o gestiti tramite LDAP.
Per modificare le impostazioni di un utente nei file tdb si usa il programma pdbedit.
6.7.3
Pdbedit - blocco account dopo X tentativi
La politica impostata correttamente si visualizza con il comando:
sudo pdbedit -P "bad lockout attempt"
Per impostare 3 tentativi si può impartire il comando:
sudo pdbedit -P "bad lockout attempt" -C 3
6.7.4
Pdbedit - scadenza password
La politica impostata correttamente si visualizza con il comando:
sudo pdbedit -P "maximum password age"
Per impostare l’obbligo di cambiare la password dopo 90 giorni si può impartire il comando:
sudo pdbedit -P "maximum password age" -C 7776000
6.7.5
Pdbedit - lunghezza minima password
La politica impostata correttamente si visualizza con il comando:
sudo pdbedit -P "min password length"
Per impostare la lunghezza minima della password a 8 caratteri si può impartire il comando:
sudo pdbedit -P "min password length"
6.7.6
-C 8
Pdbedit - obbligo cambio password
Per impostare per l’utente mario l’obbligo di cambiare la password al primo accesso si può impartire il comando:
sudo pdbedit -u mario --pwd-must-change-time 0
7
7.1
7.1.1
Scripting
Personalizzazione dell’ambiente di shell
Variabili e valori
Le variabili sono dei contenitori di valori.
Nella bash si possono assegnare valori alle variabili in maniera molto semplice. Bisogna però ricordarsi di non
mettere spazi prima o dopo il segno =:
$ NOME = mario
bash: NOME: command not found
$ NOME= mario
bash: mario: command not found
$ NOME=mario
Per recuperare il valore di una variabile, si deve anteporre il segno $ al nome:
$ echo $NOME
mario
102
7.1.2
Variabili
Esistono due tipi di variabili:
• variabili della shell (non ereditate dai processi figli)
• variabili d’ambiente (ereditate)
Nell’esempio che segue, viene assegnato un valore a una variabile, viene visualizzato il valore della variabile
(insieme al PID della shell), viene aperta una shell figlia e viene mostrato che il valore non è stato ereditato in
quest’ultima:
$ NOME=mario # quando si assegna un valore non bisogna mettere uno spazio prima dell’uguale!
$ echo Nella shell $$ NOME è $NOME
Nella shell 10076 NOME è mario
$ bash
$ echo Nella shell $$ NOME è $NOME
Nella shell 10234 NOME è
7.1.3
Esportazione delle variabili
Le variabili possono essere esportate per far sı̀ che il loro valore sia letto anche dai processi figli (incluse
le sottoshell). L’esportazione è unidirezionale (le sottoshell non possono esportare le variabili verso la shell
genitore).
L’esportazione si effettua con il comando export (anche direttamente in sede di assegnazione del valore).
$ export NOME=mario
$ echo Nella shell $$ NOME è $NOME
Nella shell 10076 NOME è mario
$ bash
$ echo Nella shell $$ NOME è $NOME
Nella shell 10340 NOME è mario
7.1.4
Variabili d’ambiente
Le variabili d’ambiente sono disponibili per i processi figli.
Molte variabili si trovano già preimpostate (grazie ai file di configurazione). Per vedere il valore delle variabili
correntemente impostate, si può usare il comando set (che mostra anche le variabili di shell) o il comando env
(che mostra solo le variabili d’ambiente); per vedere il valore di una singola variabile, il comando echo.
$ set| head -5
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_COMPLETION=/etc/bash_completion
BASH_COMPLETION_DIR=/etc/bash_completion.d
$ echo $BASH
/bin/bash
7.1.5
Variabili d’ambiente interessanti
Alcune variabili degne di nota:
• HOSTNAME: il nome del sistema
• PATH: il percorso di ricerca degli eseguibili
• HOME: la propria home directory
• USERNAME: il proprio nome utente
• TERM: il tipo di terminale
• LANG: la lingua scelta
• EDITOR: l’editor preferito
• IFS: internal field separator, il carattere usato come separatore
103
7.1.6
Modificatori di variabili
Può capitare di voler accedere solo a parte di variabile (una sottostringa). La cosa è fattibile tramite i modificatori
di variabile. Eccone alcuni:
• rimozione del minor suffisso ($ x=file.c; echo ${x%.c}.o
--> file.o)
• rimozione del maggior suffisso ($ x=posix/src/std; echo ${x%%/*} --> posix)
• rimozione del minor prefisso ($ x=$HOME/src/cmd; echo ${x#$HOME} --> /src/cmd)
• rimozione del maggior prefisso (x=/one/two/three; echo ${x##*/} --> three)
• estrazione di parte di stringa ($ x=abcdef; echo ${x:4} --> ef)
• estrazione di parte di stringa ($ x=abcdef; echo ${x:2:3} --> cde)
• valori di default ($ unset x; echo ${x:-altro} --> altro)
7.1.7
I prompt della shell
La Bash mette a disposizione quattro messaggi di sollecito (prompt) che possono essere personalizzati:
1. PS1 (primario)
2. PS2 (usato per il completamento delle stringhe su più righe)
3. PS3 (usato per la gestione dei menù con select)
4. PS4 (usato per la traccia di esecuzione)
7.1.8
Personalizzazione del prompt
I prompt possono essere personalizzati modificando il valore delle variabili d’ambiente corrispondenti:
PS1=’\W (\t)\$ ’ # directory di lavoro, più ora corrente
intro-linux (15:16:37)$
$ PS1=’\d \u \$ ’ # data corrente, più nome utente
ven mar 21 loris $
$ PS2=’(continua...) > ’
$ mkdir "una directory che
(continua...) > nel nome...
(continua...) > ha dei caratteri di ritorno carrello"
7.1.9
Personalizzazione della variabile PATH
La variabile PATH è usata per specificare in quale directory devono essere cercati gli eseguibili.
Ad esempio, si può impostare la variabile aggiungendo la directory corrente ai valori attuali:
$ echo $PATH
/home/loris/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
$ PATH="$PATH:."
$ echo $PATH
/home/loris/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:.
In questo modo sarà possibile eseguire gli script della directory corrente senza dover digitare ./ prima del nome
del file (non che questo sia raccomandabile, però).
104
7.1.10
Personalizzazione dei colori della lista dei file
Il comando ls mostra i nomi dei file colorati a seconda dell’estensione, basandosi sul valore della variabile
LS_COLORS. Il valore di tale variabile può essere modificato sfruttando il programma dircolors.
1. digitare dircolors -p > elencocolori per produrre un file contenente le corrispondenze attuali
2. modificare il file elencocolori con l’editor preferito
3. digitare dircolors elencocolori > comandi per far leggere il file di configurazione e produrre i comandi
necessari per l’uso da parte della Bash
4. eseguire source comandi per eseguire i comandi e impostare la variabile LS COLORS
7.1.11
Alias
È possibile definire delle scorciatoie per l’esecuzione di alcuni comandi, o di alcuni comandi con determinate
opzioni predefinite. Queste scorciatoie sono chiamate alias.
$ alias ll=’ls -l’
$ ll
total 8
-rw-r--r-- 1 loris loris 655 2008-03-21 15:48 uno
-rw-r--r-- 1 loris loris 2780 2008-03-21 15:45 due
-rw-r--r-- 1 loris loris
0 2008-03-21 15:45 tre
Note:
• con gli alias non viene attivato l’autocompletamento specifico della shell.
• gli alias non possono essere usati all’interno di script.
7.1.12
Funzioni
È possibile definire delle funzioni.
$ function saluta { ORA=$(date +’%k’); [[ $ORA < 13 ]] && echo buongiorno || echo buon pomeriggio; }
$ saluta
buon pomeriggio
Le funzioni possono essere utilizzate passando loro dei parametri (che vedranno come $1, $2 ecc.).
Le funzioni possono essere esportate con export -f.
7.1.13
Funzioni wrapper
Una funzione può costituire un wrapper per un comando builtin. All’interno della definizione della funzione, si
dovrà usare il comando builtin per richiamare il comando built-in stesso.
$ cd() { builtin cd "$1" && echo "cambiata directory in $1"; }
$ cd ..
cambiata directory in ..
7.1.14
Ordine di ricerca
Dove verrà cercato il comando da eseguire?
L’ordine di ricerca dovrebbe essere il seguente:
1. alias
2. funzione
3. comando built-in
4. hash
5. path
105
7.1.15
Qual è l’ambiente?
Un programma può sapere quali sono le variabili d’ambiente impostate. Il prototipo di un programma C potrebbe
essere questo:
#include <stdio.h>
int main(int argc, char **argv, char **envp)
int x;
for (x=0; envp[x] != 0; ++x){
printf("%d: %s\n", x, envp[x]);
}
7.1.16
Esecuzione con ambiente modificato
Un comando può essere eseguito in un ambiente modificato (eliminando alcune delle o tutte le variabili d’ambiente):
$ env -i date # esecuzione con ambiente "svuotato"
Fri Mar 21 17:57:29 CET 2008
$ env -u LANG cal # esecuzione con variabile "disimpostata"
March 2008
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
7.1.17
Shebang indipendente dalle locazioni dei file
Un motivo per usare il programma env è anche quello di poter predisporre degli script la cui prima riga (nota
come bang path o shebang) sia indipendente dalla locazione dei programmi eseguibili.
Ad esempio, spesso la prima riga di uno script python contiene nella prima riga:
#!/usr/bin/env python
Questo fa sı̀ che lo script possa essere eseguito indipentemente dalla posizione dell’interprete python (che
potrebbe essere /usr/bin/python, /usr/local/bin/python ecc.).
7.1.18
Impostazioni della shell Bash
Alcuni comportamenti della Bash possono essere impostati agendo su delle opzioni interne. Particolarmente
interessanti risultano:
• set -o allexport (set -a): esporta automaticamente le variabili create
• set -o noclobber (set -C): fa sı̀ che non vengano sovrascritti file con la ridirezione dell’output
• set -o nounset (set -u): fa sı̀ che venga considerato errore riferirsi ad una variabile non impostata
• set -o ignoreeof: fa sı̀ che venga ignorato un eventuale (accidentale) EOF (ctrl-D)
Le opzioni sono impostate con set -o e disimpostate con set +o.
$ touch uno
$ set -o noclobber
$ cal > uno
bash: uno: cannot overwrite existing file
$ set +o noclobber
$ cal > uno
$ set -o nounset
$ echo $NONESISTENTE
bash: NONESISTENTE: unbound variable
106
7.1.19
File di configurazione
I file di configurazione dove è possibile impostare variabili, alias, funzioni, ecc. sono diversi (alcuni “di sistema”,
altri gestibili dal singolo utente).
• /etc/profile (letto all’avvio di ogni shell di login)
• /etc/bashrc o /etc/bash.bashrc (letto all’avvio di ogni nuova shell bash)
• /etc/inputrc (letto all’avvio di ogni nuova shell)
• /.bash profile (opzionale)
• /.bash login (opzionale)
• /.profile (letto all’avvio di ogni shell di login)
• /.bashrc (letto all’avvio di ogni nuova shell)
• /.bash logout (letto al logout delle shell di login)
• /.inputrc (all’avvio di ogni nuova shell)
7.2
7.2.1
Introduzione allo scripting bash
Codice di uscita dei programmi
Normalmente i programmi, al termine della loro esecuzione, restituiscono un valore numerico intero, detto codice
di uscita (exit code).
Si pensi ad esempio al classico “Hello world!”:
#include <stdio.h>
int main(int argc, char **argv)
printf("Hello, world!\n");
return 0;
}
7.2.2
Utilizzo del codice di uscita
Dalla shell si può sapere qual è il codice di uscita dell’ultimo programma eseguito tramite il valore della variabile
?.
$ ./hellow
Hello, world!
$ echo $?
7.2.3
Utilizzo del codice di uscita (2)
Molti programmi usano i codici di uscita per comunicare informazioni “nascoste”.
Si provi ad esempio a usare grep:
$ grep http /etc/services
www
80/tcp
https
443/tcp
https
443/udp
$ echo $?
http
# WorldWideWeb HTTP
# http protocol over TLS/SSL
$ grep nonesistente /etc/services
$ echo $?
$ grep qualcosa /file/nonesistente
grep: /file/nonesistente: No such file or directory
$ echo $?
107
7.2.4
Il programma test
Il programma test comunica il proprio risultato solo attraverso il codice di uscita.
$ test -d /home
$ echo $?
$ test -d /casa
$ echo $?
$ test 4 = 4
$ echo $?
$ test 4 = 5
$ echo $?
7.2.5
Comparazione di valori
Quando si usa test, bisogna ricordarsi che l’espansione delle variabili viene fatta dalla shell.
$ test A = B
$ test A = B C
bash: test: too many arguments
$ test A = "B C"
$ VAR1="B C"
$ test A = $VAR1
bash: test: too many arguments
$ test A = "$VAR1"
7.2.6
Uso dei codici di uscita
I codici di uscita possono essere usati tramite la cosiddetta “valutazione di corto circuito”.
$ test A = B && echo uguali || echo diversi
diversi
$ test A = A && echo uguali || echo diversi
uguali
7.2.7
test, /usr/bin/test o [ ?
Quando si usa il comando test in realtà si usa il comando incorporato della Bash.
Inoltre, si tenga presente che esiste anche la forma abbreviata [, sia come programma esterno che come comando
interno.
$ [ A = B ] && echo uguali || echo diversi
diversi
$ [ A = A ] && echo uguali || echo diversi
uguali
La bash, inoltre, dispone di un equivalente più semplice da usare, [[.
7.2.8
Esecuzione degli script
Gli script della Bash sono semplici file ASCII.
Si possono eseguire in tre modi diversi:
• bash mioscript (invocazione esplicita di una subshell)
• source mioscript o . mioscript (esecuzione nell’ambito della shell corrente)
• ./mioscript o mioscript (esecuzione autonoma, con specificazione o meno del path: funziona a patto
che lo script sia stato reso eseguibile)
108
7.2.9
Debugging degli script
Il debug può essere effettuato mostrando passo l’istruzione che verrà eseguita (prima o dopo l’espansione).
$ ./saluta
#esecuzione semplice
ciao, loris!
$ bash -x saluta
#debugging con -x
+ echo ciao, ’loris!’
ciao, loris!
$ bash -v saluta
#debugging con -v
#!/bin/bash
echo ciao, $USER!
ciao, loris!
7.2.10
Costrutti importanti
Nell’ambito della Bash si fa uso dei classici costrutti della programmazione imperativa:
• if ...; then ...; else ...; fi (selezione)
• while ...; do ...; done (ciclo while)
• until ...; do ...; done (ciclo while con test negativo)
• for ... in ...; do ...; done (ciclo for )
Si possono inoltre definire funzioni, usare variabili (non tipizzate), ecc.
7.2.11
Parametri della riga di comando
Si possono ovviamente valutare i parametri della riga di comando.
• $0: nome del programma invocato
• $#: il numero di parametri
• da $1 a $9: gli altri parametri, in ordine
• da ${1} a ${$#}: tutti i parametri
7.2.12
Guida avanzata di scripting Bash
“. . . per imparare veramente lo scripting, l’unico modo è quello di scrivere script” (Mendel Cooper, autore della
Guida avanzata di scripting Bash49 )
7.3
7.3.1
Grep, Sed, Gawk e altri utili filtri
Filtri
I programmi che funzionano come filtro agiscono facendo delle modifiche a quello che leggono dal proprio
standard input e generando di conseguenza uno standard output.
Alcuni esempi semplici:
• cat -n
• tac
• rev
• sort, sort -n, sort -r
• head
• tail
49 http://www.pluto.it/files/ildp/guide/abs/
109
7.3.2
Cut
Il programma cut “preleva” alcuni campi delle righe di input.
$ getent passwd root | cut -d: -f7
/bin/bash
7.3.3
Expand e Unexpand
Il programma expand converte i caratteri di tabulazione in spazi. Il programma unexpand fa l’opposto.
$ cat bashscript
#!/bin/bash
for i in $@
do
echo $i
done
$ cat bashscript | expand -t4
#!/bin/bash
for i in $@
do
echo $i
done
$ cat bashscript | expand -t1
#!/bin/bash
for i in $@
do
echo $i
done
7.3.4
Fmt
Il programma fmt formatta il testo a una specifica lunghezza della riga.
$ cat testolungo.txt
Un filtro software è un programma che trasforma dati in base a criteri predeterminati.
Tra i programmi di tipo filtro, esistono dei software in grado di selezionare pagine su Internet in base ad alcuni
[snip]
(dalla Wikipedia)
$ cat testolungo.txt | fmt
Un filtro software è un programma che trasforma dati in base a
criteri predeterminati. Tra i programmi di tipo filtro, esistono dei
software in grado di selezionare pagine su Internet in base ad alcuni
[snip]
giochi, ecc.). (dalla Wikipedia)
$ cat testolungo.txt| fmt -w 40
Un filtro software è un programma
che trasforma dati in base a criteri
predeterminati. Tra i programmi di
[snip]
(dalla Wikipedia)
7.3.5
Head e Tail
I programmi head e tail mostrano, rispettivamente, le prime e le ultime righe (o i primi e gli ultimi byte, a
seconda dell’opzione) di un file.
Se si indica di leggere più di un file, viene mostrata una riga di intestazione per ciascun file.
$ head -n2 /etc/services /etc/protocols
==> /etc/services <==
# Network services, Internet style
==> /etc/protocols <==
# Internet (IP) protocols
$ tail -n2 /etc/services /etc/protocols
==> /etc/services <==
fido
60179/tcp
# Local services
==> /etc/protocols <==
sctp
132
SCTP
fc
133
FC
# fidonet EMSI over TCP
# Stream Control Transmission Protocol
# Fibre Channel
110
Notare che l’opzione abbreviata -2 funziona con head ma non con tail.
Il programma tail può funzionare anche per seguire in tempo reale la crescita di un file (utile per i log).
7.3.6
Join
Il programma join stampa una linea per ciascuna coppia di linee provenienti da due file con un campo in
comune (con lo stesso valore), un po’ come con un join tra tabelle in una base di dati.
$ cat tipi-mime
image/gif
image/jpeg
image/png
image/tiff
image/x-ms-bmp
image/x-photoshop
$ cat lista-defaults
image/bmp eog
image/gif eog
image/jpeg eog
image/jpg eog
image/png eog
image/tiff gimp-2.2
image/x-psd gimp-2.2
$ join tipi-mime lista-defaults
image/gif gif eog
image/jpeg jpeg jpg jpe eog
image/png png eog
image/tiff tiff tif gimp-2.2
gif
jpeg jpg jpe
png
tiff tif
bmp
psd
Importante: i due file devono essere ordinati rispetto ai campi di join.
7.3.7
Nl
Il programma nl numera le righe dei file di input tenendo in considerazione l’eventuale presenza di stringhe
speciali (es. \:) per la delimitazione di intestazione, corpo e piè di pagina.
$ cat testo.txt
\:\:\:
I filtri
\:\:
Un filtro software è un
programma che trasforma
dati in base a criteri
predeterminati.
\:
Filtro (wikipedia)
$ nl testo.txt
I filtri
1
2
3
4
Un filtro software è un
programma che trasforma
dati in base a criteri
predeterminati.
Filtro (wikipedia)
7.3.8
Od
Il programma od mostra il contenuto di un file in ottale, esadecimale e in vari altri formati.
$ cat testoacapo
testo
capo
$ od -t a testoacapo
0000000
t
e
s
0000015
$ od -t c testoacapo
0000000
t
e
s
0000015
t
o
nl
a
nl
c
a
p
o
nl
t
o
\n
a
\n
c
a
p
o
\n
111
$ od -t
0000000
0000015
$ od -t
0000000
0000015
x1 testoacapo
74 65 73 74 6f 0a 61 0a 63 61 70 6f 0a
7.3.9
Paste
x4 testoacapo
74736574 0a610a6f 6f706163 0000000a
Il programma paste accosta le linee corrispondenti di uno o più file.
$ cat nomi
mario
giovanni
luisa
$ cat cognomi
rossi
bianchi
neri
$ paste nomi cognomi
mario
rossi
giovanni
bianchi
luisa
neri
$ paste -d’ ’ nomi cognomi
mario rossi
giovanni bianchi
luisa neri
$ paste -s -d\; nomi cognomi
mario;giovanni;luisa
rossi;bianchi;neri
7.3.10
Pr
Il programma pr converte il file di input in una versione impaginata, con intestazioni e piè di pagina.
$ cat testolungo.txt | fmt -w 30 | pr -l 12 -W 30
7.3.11
-h "Documento sui filtri software"
Uniq e Wc
Il programma uniq elimina righe duplicate adiacenti; per questo motivo è spesso usato dopo sort.
Il programma wc conta i caratteri, le parole e le righe.
$ getent passwd | cut -d: -f7 | sort | uniq
/bin/bash
/bin/false
/bin/sh
/bin/sync
/usr/sbin/nologin
# quali sono le shell impostate
$ getent passwd | cut -d: -f7 | sort | uniq
| wc -l # quante sono le shell impostate
7.3.12
Grep
Il programma grep mantiene le righe che soddisfano (o non soddisfano) un certo criterio costituito da una
espressione regolare.
$ getent services | grep http
www
80/tcp http
https
443/tcp
https
443/udp
getent services | grep ^http
https
443/tcp
https
443/udp
$ getent services | head -5 | grep -v udp
tcpmux
1/tcp
echo
7/tcp
discard
9/tcp sink null
Con grep è anche possibile contare le righe in cui c’è la corrispondenza, mostrare le righe adiacenti, ecc.
112
7.3.13
Gawk
Il programma gawk agisce sui singoli campi, riformattandoli, usandoli per fare delle operazioni, ecc.
Per i prossimi esempi, immaginiamo di avere un file di testo chiamato datipersonali. Innanzitutto diamo
un’occhiata al suo contenuto:
$ cat datipersonali
12 alice pordenone
24 berto udine
36 camilla trieste
48 daniele gorizia
60 elisabetta treviso
7.3.14
Gawk, estrazione di campi
Con gawk possiamo estrarre i singoli campi:
$ cat datipersonali | gawk ’{ print $3 }’
pordenone
udine
trieste
gorizia
treviso
$ cat datipersonali | gawk ’{ print $2 }’
alice
berto
camilla
daniele
elisabetta
7.3.15
Gawk, estrazione di campi (2)
Con gawk possiamo estrarre i singoli campi:
$ cat datipersonali | gawk ’{print $0}’ # tutti i campi
12 alice pordenone
24 berto udine
36 camilla trieste
48 daniele gorizia
60 elisabetta treviso
$ cat datipersonali | gawk ’BEGIN {n=3} {print $n}’
pordenone
udine
trieste
gorizia
treviso
7.3.16
Gawk, test sui campi
Con gawk possiamo fare dei test sul valore dei singoli campi:
$ cat datipersonali | gawk ’{ if ($2 == "alice") print $3 }’
pordenone
$ cat datipersonali | gawk ’{ if ($1 <= 40) print $2 }’
alice
berto
camilla
7.3.17
Gawk, operazione sui valori dei campi
Con gawk possiamo fare operazioni sui valori dei singoli campi:
$ cat datipersonali | gawk ’{s += $1} END {print s}’
180
$ cat datipersonali | gawk ’BEGIN {s=10000} {s += $1} END {print s}’
10180
113
7.3.18
Gawk, separatore
Possiamo indicare ciò che consideriamo separatore dei campi:
$ getent passwd | gawk ’BEGIN {FS=":"} {print $1}’ | tail -5
andrea_p
federica_p
marco_p
monica_s
mattia_z
7.3.19
Gawk, espressioni regolari
Possiamo lavorare solo sulle righe che contengono una determinata espressione regolare:
$ cat datipersonali | gawk ’/ab/ {print $3}’
treviso
. . . oppure controllare la corrispondenza di un singolo campo:
$ cat datipersonali | gawk ’{if ($2 ~ /a/) print $3}’
pordenone
trieste
gorizia
treviso
$ cat datipersonali | gawk ’{if ($2 !~ /a/) print $3}’
udine
7.3.20
Gawk, controllo del tipo di file
Si supponga di voler trovare tutti i file di un certo tipo (restituito dal comando file) in una directory e in tutte
le sue sottodirectory. Ad esempio, tutti i file di tipo text della directory /sbin.
Una pipeline risolve il problema:
$ find /sbin -type f| xargs -i file {} | gawk \
’{ FS=":"; if ($2 ~ /text/) print $1}’
/sbin/MAKEDEV
/sbin/insmod_ksymoops_clean
/sbin/kernelversion
/sbin/shadowconfig
/sbin/fsck.nfs
/sbin/hotplug
/sbin/mdrun
/sbin/update-modules.modutils
/sbin/update-modules
...
7.3.21
Gawk, riformattazione
I campi dell’input possono essere ricalcolati/riformattati.
Ad esempio, il log di squid presenta righe in cui nel primo campo c‘è il numero di secondi dall’epoch, ma
potremmo desiderare dei valori più comprensibili:
$ cat squid_access.log
1173783723.856
337 192.168.3.2 TCP_MISS/2...
1173783723.908
561 192.168.3.2 TCP_MISS/2...
1173783724.113
1952 192.168.3.2 TCP_MISS/2...
$ cat squid_access.log | gawk ’{$1=strftime("%F_%T",$1); print $0}’
2007-03-13_12:02:03 337 192.168.3.2 TCP_MISS/2...
2007-03-13_12:02:03 561 192.168.3.2 TCP_MISS/2...
2007-03-13_12:02:04 1952 192.168.3.2 TCP_MISS/2...
114
7.3.22
Sed, lo stream editor
Sed agisce sulle righe dell’input in diversi modi.
L’uso più comune ha a che fare con la sostituzione di stringhe:
$ getent services | head -3 | sed ’s/echo/ecco/’
tcpmux
1/tcp
ecco
7/tcp
ecco
7/udp
. . . ma anche:
$ getent services | head -3 | sed ’sa/a|a’
tcpmux
1|tcp
echo
7|tcp
echo
7|udp
7.3.23
Sed, selezione di gruppi di righe
Sed può selezionare gruppi di righe.
In base al contenuto:
$ getent services| sort | sed -n ’/^fido/,/^ftp/p’
fido
60179/tcp
finger
79/tcp
font-service
7100/tcp xfs
font-service
7100/udp xfs
frox
2121/tcp
fsp
21/udp fspd
ftp
21/tcp
. . . oppure in base al numero di riga:
$ getent services| sort | cat -n | sed -n 12,18p
12 afs3-callback
7001/udp
13 afs3-errors
7006/tcp
14 afs3-errors
7006/udp
15 afs3-fileserver
7000/tcp bbs
16 afs3-fileserver
7000/udp bbs
17 afs3-kaserver
7004/tcp
18 afs3-kaserver
7004/udp
8
Applicazioni
8.1
8.1.1
Vim, l’editor di riferimento
Introduzione a VIM
VIM, o VI improved, è un editor di testo che migliora l’editor vi, a sua volta un programma che ha migliorato
l’editor a righe ed facendolo diventare un editor visuale (caratteristica da cui deriva il nome).
Vi è l’unico editor che è presente in praticamente tutte le versioni di Unix e Linux, ed è spesso impostato come
editor di default per le operazioni di amministrazione.
Caratteristica importante di Vi è che si tratta di un programma che opera in base alla modalità corrente: la
pressione dello stesso tasto ha significati diversi a seconda del contesto operativo.
8.1.2
Le basi
Si può iniziare a capire come funziona VIM con il programma vimtutor, che avvia un esercitazione a copertura
dei seguenti aspetti:
• movimenti del cursore
• editing di testi (inserimenti e cancellazione)
115
• comandi e oggetti (undo, put, replace, change)
• posizionamento e situazione file
• ricerche
• esecuzione comandi esterni
• gestione di file
• impostazione di opzioni
8.1.3
Ripetizione dell’ultimo comando
Un qualsiasi comando complesso appena impartito può essere ripetuto. Ad esempio, il comando “vai alla fine
della riga, elimina l’ultimo carattere, vai a capo, aggiungi le graffe di apertura e chiusura” può essere impartito
per la prima di queste righe e poi successivamente senza alcuna fatica digitando semplicemente il carattere
punto.
void function_one(int a, int b);
void function_two(char a, char *b);
void function_three(void);
diventa. . . (digitando la prima volta A, <backspace>, <newline>, {, }, <newline> e per le righe successive solo
.):
void function_one(int a, int b)
void function_two(char a, char *b)
}
void function_three(void)
8.1.4
Corrispondenza delle parentesi
Il comando % sposta il cursore alla prima parentesi chiusa rilevante (e alla successiva pressione alla corrispondente
aperta).
Ad esempio, digitando % con il cursore sopra la A, il cursore si sposta sopra la B:
function_one(function_two());
A
B
Si può utilizzare questo fatto per “tagliare” il testo selezionato automaticamente selezionato con c%.
8.1.5
Modalità visuale
Le operazioni di selezione possono essere fatte in maniera agevole e chiara nella modalità visuale (a carattere
con v, a linea con V, a blocco con <control>-V.
8.1.6
Macro e registri
Si può registrare una macro premendo q seguito da una lettera (al termine della registrazione, si preme di nuovo
q). Per eseguire la macro, si preme @ e la lettera corrispondente.
Quando si taglia un testo, questo viene posto in un registro senza nome. Se lo si desidera, si possono usare i
registri con nome da a a z mediante, ad esempio, "cdd (taglia la riga corrente e mettila nel registro c). Se si
vuole accodare il testo al registro, si usa la lettera maiuscola per indicare il registro stesso. Per incollare, si può
usare il corrispondente "cp.
116
8.1.7
Selezione primaria e clipboard di sistema
La selezione primaria e la clipboard di sistema sono dei registri speciali, accessibili con il nome * e +, rispettivamente.
Ad esempio, per copiare due righe come selezione primaria si può digitare "*2yy (il contenuto della selezione
primaria è reso disponibile nelle altre applicazioni Xwindow premendo il pulsante centrale del mouse).
8.1.8
Modalità last-line
La modalità last-line è quella in cui si impartiscono comandi complessi che necessitano di parametri da specificare
(es. ricerche di testo, sostituzioni, impostazione opzioni).
In modalità last-line vale una history locale.
8.1.9
Ricerche
Le ricerche (basate sulle espressioni regolari) possono avvenire:
• in modalità last-line (in avanti, es. /void, oppure in indietro, es. ?void)
• in modalità comando (n per l’occorrenza successiva, N per la precedente, * per la prossima occorrenza
della parola sulla quale si trova il cursore)
Con il comando :set hlsearch si fa in modo che tutte le occorrenze vengano evidenziate, con il comando
:set incsearch si vedono le occorrenze “al volo”.
8.1.10
Sostituzioni
La sostituzione di un testo (trova e sostituisci ) avviene:
• sulla riga corrente (es. :s/anna/ANNA/ per la prima occorrenza, oppure :s/anna/ANNA/g per tutte le
occorrenze)
• sull’intero testo (es. :%s/anna/ANNA/ per la prima occorrenza, oppure :%s/anna/ANNA/g per tutte le
occorrenze)
8.1.11
Impostazione di opzioni
Le opzioni si possono impostare:
• a tempo di esecuzione, in modalità last-line (es. :set number)
• nei file di configurazione (di sistema, come /etc/vim/vimrc o personali, come /.vimrc)
• al momento dell’esecuzione (es. vi +"set number" documento.txt)
8.1.12
Divisione della finestra
Una finestra si può dividere orizzontalmente (:split) o verticalmente (:vsplit). Per passare da una sottofinestra all’altra si deve premere due volte <ctrl>-W. Utili sono poi i comandi :close e :only.
8.1.13
Alcune opzioni interessanti
Alcune opzioni di VIM che potrebbe valere la pena di impostare:
• :set cursorline (evidenzia la riga in cui si trova il cursore)
• :set cursorcolumn (evidenzia la colonna in cui si trova il cursore)
• :highlight CursorLine ctermbg=lightgray (es. di impostazione del colore)
• :syntax on (abilita l’evidenziazione sintattica)
• :set mouse=a (abilita l’uso del mouse in tutte le modalità di lavoro)
117
8.1.14
Altre cose utili (1)
Varie cose che possono tornare utili:
• :cmap <F2> :w<cr> (mappatura di comandi)
• :iab perche’ perché (sostituzione di caratteri)
• <ctrl>-A (incrementa numero)
• <ctrl>-X (decrementa numero)
• ~ (maiuscolo/minuscolo)
8.1.15
Altre cose utili (2)
Alcune cose che si possono fare:
• aprire un file binario con vim -b (utile con file zip/tar)
• aprire più file contemporaneamente (si passa da uno all’altro con :1b, :2b ecc.)
• aprire un file con una ricerca impostata (vim +/_stringa nomefile_)
• aprire un file posizionando il cursore su una riga (vim +_num nomefile_)
• passare da less a VIM (premendo v)
• usare un’interfaccia grafica (gvim)
8.1.16
Per maggior aiuto
Nel caso in cui si vogliano sfruttare al meglio le possibilità di VIM, si può consultare la guida in linea:
• :help
• :help <argomento> (aiuto su argomento)
• :help! (aiuto in casi disperati)
9
9.1
9.1.1
Sicurezza
Codice in materia di protezione dei dati personali
La cosiddetta “Legge sulla privacy”
Il Codice in materia di protezione dei dati personali50 (D. Lgs. 196/2003), noto anche come “Legge sulla privacy”,
prevede l’obbligatorietà di alcune misure di sicurezza per tutte le organizzazioni (e, in alcuni casi, anche per i
privati cittadini) che trattano dati personali.
Quelli che seguono sono solo degli appunti veloci e non pretendono di essere corretti, completi, esaustivi ed
aggiornati.
9.1.2
Principio di necessità
È necessario ridurre al minimo i dati personali e identificativi. (vedi art. 3)
9.1.3
Dati personali
I dati personali sono tutti quelli che riguardano le persone (fisiche e giuridiche) e/o che ne consentono l’identificazione. Particolare importanza e necessità di tutela hanno i dati sensibili e quelli giudiziari. (vedi art.
4)
50 http://tinyurl.com/leggeprivacy
118
9.1.4
Sanzioni
Un’organizzazione che non rispetta la normativa è soggetta a due tipi di conseguenze giuridiche:
• richiesta di risarcimento danni, con inversione dell’onere della prova (art. 15)
• sanzioni penali per omissione delle misure minime di sicurezza (art. 169)
9.1.5
Soggetti coinvolti
In un’organizzazione, i soggetti coinvolti sono:
• il titolare (l’organizzazione stessa, nella persona del suo legale rappresentante)
• i responsabili (persone preposte al trattamento dei dati)
a) interne
b) esterne
• gli incaricati (persone fisiche autorizzate materialmente a gestire i dati, svolgendo compiti definiti)
• gli amministratori di sistema (coloro che gestiscono i sistemi informativi, sia dal punto di vista dell’hardware sia da quello del software)
I responsabili vengono nominati, gli incaricati e gli amministratori vengono designati (ma per questi ultimi la
designazione deve essere individuale).
9.1.6
Istruzioni operative
Le istruzioni operative date agli incaricati comprendono informazioni su:
• tipo di dati da trattare
• operazioni da eseguire
• software e funzionalità da utilizzare
• buone pratiche da seguire
Possono essere generiche, per aree omogenee di trattamento (es. per tutti gli incaricati di un determinato
settore/ufficio).
9.1.7
Misure minime di sicurezza
Le misure minime di sicurezza sono stabilite:
• nel Codice
a) per il trattamento con strumenti elettronici (art. 34)
b) per il trattamento senza strumenti elettronici (art. 35)
• nell’allegato B al Codice
• in diversi Provvedimenti del Garante
a) attribuzione di funzioni di amministratore di sistema
b) internet e posta elettronica
c) videosorveglianza
d) dati genetici
119
9.1.8
Obblighi di sicurezza
È necessario ridurre al minimo (art. 31) i rischi di:
• distruzione dei dati (incendi, allagamenti, alluvioni, terremoti)
• perdita dei dati (cancellazione accidentale, guasti, perdita fisica dei supporti)
• accesso non autorizzato ai dati (attacchi esterni e interni, accessi fisici in locali riservati)
• trattamento non consentito dei dati
La diligenza richiesta dipende da:
• progresso tecnico
• natura dei dati
• caratteristiche specifiche del trattamento
9.1.9
Misure minime
Le misure minime di sicurezza (art. 4, comma 3, lettera A) sono di tipo:
• tecnico (serrature, accesso con badge, ecc.)
• informatico
• organizzativo (personale suddiviso in categorie omogenee)
• logistico (posizione fisica dei dati)
• procedurali
9.2
9.2.1
Sicurezza informatica
Sicurezza informatica
Cosa si intende per sicurezza informatica?
In genere, si fa riferimento a questi aspetti:
• confidenzialità o riservatezza (accesso in maniera esclusiva alle informazioni)
• integrità (garanzia che i dati non siano stati alterati da chi non doveva)
• disponibilità (possibilità effettiva di accesso ai dati nel momento in cui servono)
9.2.2
Sicurezza informatica / 2
Altre cose possono essere tenute in considerazione, come ad esempio:
• non ripudiabilità (impossibilità di sottrarsi alla responsabilità)
• interoperabilità (semplicità nella comunicazione tra applicazioni)
• coerenza delle informazioni (detta a volte, erroneamente, consistenza)
• manutenibilità del software (possibilità di apportare modifiche)
• accessibilità ai dati a lungo termine (supporti, formati)
120
9.2.3
Strategie per la protezione dei dati
Una efficace protezione dei dati ha a che fare con:
• sicurezza fisica (disastri, attacchi, manomissioni)
• backup (locale, geografico, incrociato)
• disaster recovery
• business continuity
9.2.4
Norme, obblighi di legge, buone pratiche
In Italia, aziende ed enti che trattano dati personali sono obbligate a misure minime di sicurezza dal Codice in
materia di protezione dei dati personali51 .
Il codice prevedeva, tra l’altro, che venisse predisposto annualmente un Documento programmatico sulla sicurezza52 , ma il D.L. 5/2012, convertito con modificazioni dalla Legge 35/2012, ha abolito l’obbligo.
Le organizzazioni che vogliono certificare il loro sistema informatico come “sicuro” possono farlo seguendo le
indicazioni dello standard ISO 27001:200553 .
Ovviamente, tutte le organizzazioni possono seguire le buone pratiche definite nelle checklist anche senza puntare
alla certificazione.
9.2.5
Gestione del rischio
Assodato che la sicurezza assoluta non esiste, ciò a cui si punta è un sistema ragionevolmente sicuro.
Per ogni problema individuato, è possibile:
• risolverlo
• ridurre il rischio
• trasferire il rischio
9.2.6
Sicurezza fisica
Per sicurezza fisica si intende la protezione materiale dei dati.
I possibili problemi fisici includono:
• guasti hardware
• incidenti
• mancanza di elettricità
• allagamenti
• incendi
• furti
9.2.7
Sicurezza logica
Per sicurezza logica si intende la protezione dei dati dall’accesso abusivo da parte di persone non autorizzate.
• login non autorizzato
• furto di credenziali
• virus e, in generale, malware (cavalli di Troia, spyware, keyloggers, ecc.)
51 http://tinyurl.com/leggeprivacy
52 http://it.wikipedia.org/wiki/Documento
53 http://it.wikipedia.org/wiki/ISO
27001
programmatico sulla sicurezza
121
9.2.8
Sicurezza fisica - Integrazione di sistemi
Per la sicurezza fisica, le buone pratiche consigliano sistemi integrati che consentono di tenere sotto controllo:
• violazione dello spazio fisico (es. sistemi antifurto)
• problemi ambientali (es. impianto climatizzazione, sistemi per la domotica)
• problemi hardware (surriscaldamenti, problemi ai dischi)
• eventuali fallimenti nei backup
9.2.9
Sicurezza fisica - Gestione dei server
I calcolatori adibiti a server devono avere caratteristiche hardware adeguate e ridondate, in modo che sia possibile
sopperire a problemi che si presentano senza che il servizio venga interrotto.
Vanno ridondati:
• dischi
• memoria
• alimentatori (hot swap)
• schede di rete
Vanno tenuti sotto controllo:
• gruppi di continuità (integrati con il software per garantire l’eventuale spegnimento automatico)
• generatori diesel
9.2.10
Sicurezza fisica - Gestione dei dati
La gestione dei dati del server è particolarmente critica.
Le tecnologie da considerare sono:
• RAID (Redundant Array of Independent Disks)
• DAS (Direct Attached Storage)
• NAS (Network Attached Storage)
• SAN (Storage Area Network )
• cloud computing (IaaS, PaaS, SaaS, per l’accesso a servizi di infrastruttura, di piattaforma o software su
calcolatori esterni)
Inoltre, andranno previste adeguate politiche di backup, possibilmente incrociato e/o geografico.
9.2.11
Sicurezza fisica - Backup
Nelle politiche di backup, va definito cosa va protetto e dov’è ciò che va protetto.
Le informazioni possono essere:
• strategiche
• importanti
• utili
• rinunciabili
Il luogo (quale calcolatore? quale file e/o quale base di dati?) in cui si trovano le informazioni spesso non è cosı̀
ovvio / noto.
122
9.2.12
Sicurezza logica - Credenziali di autenticazione
Le credenziali di autenticazione si possono basare su:
• qualcosa che sai (password, passphrase)
• qualcosa che hai (O-key, file su chiavetta USB)
• qualcosa che sei (biometria)
In Italia, le credenziali di tipo biometrico sono implementabili solo in casi particolari, per questioni legate alla
privacy54 .
Può essere utile usare un password manager.
9.2.13
Sicurezza logica - Dominio di autenticazione
In linea di massima, le buone pratiche suggeriscono che esista, nella rete aziendale, un dominio di autenticazione
con una gestione centralizzata degli account.
In ambiente Linux, normalmente si usa un server LDAP.
9.2.14
Sicurezza logica - Autorizzazioni
Oltre ad essere autenticati (per l’accesso al calcolatore e/o alla rete), gli utenti devono essere autorizzati a
compiere determinate operazioni.
Le autorizzazioni possono avere a che fare con l’accesso:
• ai documenti (permessi sul file system)
• ai dati (privilegi nei database)
• ai singoli moduli delle applicazioni software (quando previsti)
9.2.15
Sicurezza logica - Cifratura dati
Al fine di garantire riservatezza e integrità dei dati si può ricorrere alla crittografia, che può essere simmetrica
o asimmetrica.
Possono essere cifrati:
• singoli file (es. gpg)
• interi dischi / partizioni (es. truecrypt)
• messaggi di posta elettronica
• documenti allegati ai messaggi di posta elettronica
• dati in transito (es. ipsec, ssl, https)
9.2.16
Sicurezza logica - Protezione della postazione di lavoro
Le singole postazioni di lavoro andranno opportunamente configurate.
Vanno tenute in considerazione:
• le politiche di aggiornamento del sistema operativo
• le politiche di aggiornamento dei programmi applicativi
• la configurazione corretta di:
a) software antivirus
b) personal firewall
c) antimalware
In ambiente Linux queste problematiche sono più facilmente gestibili che con altri sistemi operativi.
54 http://it.wikipedia.org/wiki/Biometria
123
9.2.17
Sicurezza logica - Sicurezza di rete
La sicurezza di rete può essere implementata con:
• firewall aziendali
• politiche di controllo degli apparati di rete (switch, router, ecc.)
• IDS (Intrusion Detection System)
• IPS (Intrusion Prevention System)
• NIPS (Network Intrusion Prevention System)
9.2.18
Sicurezza logica - Social Engineering
Il fattore umano rischia di essere comunque quello più vulnerabile, soprattutto perché non si possono mettere
in atto sistemi automatici di verifica.
Le tecniche che sfruttano la fiducia umana per trarne un vantaggio indebito vanno sotto il nome di Social
engineering (l’esempio più comune è il phishing).
9.3
9.3.1
Sicurezza e GPG
GPG
Il programma standard usato per la crittografia privata è GPG (GNU Privacy Guard), implementazione libera
di PGP.
GPG offre funzionalità di cifratura a chiave simmetrica e a chiave pubblica.
9.3.2
Cifratura simmetrica
Per cifrare un documento si può utilizzare l’opzione -c (--symmetric):
$ ls
miodocumento.txt
$ gpg --symmetric --force-mdc miodocumento.txt
Enter passphrase:
Repeat passphrase:
$ ls
miodocumento.txt
miodocumento.txt.gpg
(MDC sta per modification detection code: usando l’opzione --force-mdc vengono introdotti dei controlli
aggiuntivi relativi all’assenza di modifiche al documento)
9.3.3
Decifrazione simmetrica
Per decifrare il documento si utilizza gpg senza opzioni:
$ ls
miodocumento.txt.gpg
$ gpg miodocumento.txt.gpg
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
Enter passphrase:
$ ls
miodocumento.txt
miodocumento.txt.gpg
124
9.3.4
Generazione della chiave con GPG
Per la generazione di una coppia di chiavi si usa il programma gpg con l’opzione --gen-key
(Quando molti utenti generano le coppie di chiavi su un calcolatore raggiunto via ssh può essere utile avviare
rngd -r /dev/urandom al fine di non incappare nel problema della mancanza di un numero sufficiente di
valori casuali. Questo però solo a scopo di test/esercitazione, visto che /dev/random non è valida fonte di
entropia55 .)
9.3.5
Tipo, lunghezza, durata della chiave
Innanzitutto, viene chiesto di scegliere il tipo di chiave, la lunghezza, la durata.
$ gpg --gen-key
Please select what kind of key you want:
(1) DSA and Elgamal (default)
(2) DSA (sign only)
(5) RSA (sign only)
Your selection? 1
...
What keysize do you want? (2048) 1024
Requested keysize is 1024 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
9.3.6
Dati personali
Successivamente, vengono richiesti i dati personali (nome, indirizzo e-mail, commento) e la passphrase:
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <[email protected]>"
Real name: Bob
Email address: [email protected]
Comment:
You selected this USER-ID:
"Bob <[email protected]>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.
9.3.7
Generazione effettiva
Infine, le chiavi vengono effettivamente generate. Per aumentare la casualità dei valori, viene raccomandato di
muovere il mouse e/o premere dei tasti durante la fase di generazione:
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
+++++++++++++++++++++++++.++++++++++++++++++++++++++++++.+++
+++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++
+++..++++++++++>++++++++++>...+++++.........................
9.3.8
Rapporto di generazione
Infine, viene mostrato il rapporto di su cosa è stato creato:
55 https://bugs.launchpad.net/ubuntu/+source/gnupg/+bug/706011
125
gpg: /home/bob/.gnupg/trustdb.gpg: trustdb created
gpg: key 0488EA60 marked as ultimately trusted
public and secret key created and signed.
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid:
1 signed:
0 trust: 0-, 0q, 0n, 0m, 0f, 1u
pub
1024D/0488EA60 2009-05-16
Key fingerprint = 5ACD FD1E A2F9 BE7E 9A4A B2A4 DD20 6BA2 0488 EA60
uid
Bob <[email protected]>
sub
1024g/42257BFD 2009-05-16
9.3.9
Firma digitale di un documento
Per firmare digitalmente un documento si usa l’opzione -s (o --sign):
$ ls
miodocumento.txt
$ gpg --sign miodocumento.txt
You need a passphrase to unlock the secret key for
user: "Bob <[email protected]>"
1024-bit DSA key, ID 0488EA60, created 2009-05-16
$ ls
miodocumento.txt
9.3.10
miodocumento.txt.gpg
Firma in file separato
Se lo si desidera, la firma può consistere in un file separato:
$ gpg --sign --detach-sign miodocumento.txt
$ ls
miodocumento.txt miodocumento.txt.sig
9.3.11
Verifica della firma digitale
Una firma digitale può essere verificata con l’opzione --verify:
$ gpg --verify miodocumento.txt.sig
gpg: Signature made sab 16 mag 2009 15:18:57 CEST using DSA key ID 0488EA60
gpg: Good signature from "Bob <[email protected]>"
Nel caso di un file che incorpora documento e firma, il documento può essere estratto direttamente:
$ ls
miodocumento.txt.gpg
$ gpg miodocumento.txt.gpg
gpg: Signature made sab 16 mag 2009 15:22:16 CEST using DSA key ID 0488EA60
gpg: Good signature from "Bob <[email protected]>"
$ ls
miodocumento.txt miodocumento.txt.gpg
9.3.12
Fallimento della verifica
Se il file originale viene modificato, la verifica ovviamente fallisce:
$ # dopo aver modificato il file miodocumento.txt...
$ gpg miodocumento.txt.sig
gpg: Signature made sab 16 mag 2009 15:55:26 CEST using DSA key ID 0488EA60
gpg: BAD signature from "Bob <[email protected]>"
126
9.3.13
Cifratura per un particolare destinatario
Per cifrare un documento in modo che possa essere letto solo da un particolare destinatario, è necessario
specificare il suo ID e usare l’opzione -e (--encrypt):
$ ls
miodocumento.txt
$ gpg --encrypt --recipient "Bob" miodocumento.txt
$ ls
miodocumento.txt miodocumento.txt.gpg
L’ID è la combinazione del nome e del commento (quest’ultimo tra parentesi).
9.3.14
Decifrazione del contenuto da parte del destinatario
Il legittimo destinatario può usare gpg per decifrare il contenuto del file, usando la passphrase per sbloccare la
chiave privata:
$ gpg miodocumento.txt.gpg
You need a passphrase to unlock the secret key for
user: "Bob <[email protected]>"
1024-bit ELG-E key, ID 42257BFD, created 2009-05-16 (main key ID 0488EA60)
gpg: encrypted with 1024-bit ELG-E key, ID 42257BFD, created 2009-05-16
"Bob <[email protected]>"
9.3.15
Trasformazione dei file binari in file di testo (e viceversa)
I file binari prodotti da gpg possono essere trasformati in file di testo mediante la loro codifica in base 64:
$ gpg --enarmor miodocumento.txt.sig
$ ls
miodocumento.txt
miodocumento.txt.sig
miodocumento.txt.sig.asc
$ cat miodocumento.txt.sig.asc
-----BEGIN PGP ARMORED FILE----Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Use "gpg --dearmor" for unpacking
iEYEABECAAYFAkoOu5UACgkQ3SBrogSI6mCZGwCfWKTU4b659p8QVBhOWcHJ6P7l
Mt4AmgMAsQUr7RuxB50ZDB0RBOIVauj2
=V1yF
-----END PGP ARMORED FILE-----
9.3.16
Esportazione della propria chiave pubblica
Se vogliamo esportare la nostra chiave pubblica (per consegnarla ad un nostro corrispondente) possiamo usare
l’opzione --export di gpg. Ad esempio, Alice potrebbe esportare la propria chiave cosı̀:
alice@biegacz:~$ gpg --output alice_pubkey.txt --armor --export
9.3.17
Importazione della chiave pubblica altrui nel proprio portachiavi
Avendo a disposizione una chiave pubblica altrui possiamo importarla semplicemente con l’opzione --import
di gpg:
$ gpg --import alice_pubkey.txt
gpg: key 65BC13ED: public key "Alice (Ufficio Acquisti) <[email protected]>" imported
gpg: Total number processed: 1
gpg:
imported: 1
127
9.3.18
Elenco delle chiavi del proprio portachiavi
L’elenco delle chiavi a disposizione può essere ottenuto con l’opzione --list-keys:
$ gpg --list-keys
/home/bob/.gnupg/pubring.gpg
------------------------------pub
1024D/0488EA60 2009-05-16
uid
Bob <[email protected]>
sub
1024g/42257BFD 2009-05-16
pub
uid
sub
9.4
9.4.1
1024D/65BC13ED 2009-05-16
Alice (Ufficio Acquisti) <[email protected]>
1024g/D67E74AF 2009-05-16
Sicurezza e SSH
SSH
SSH è un protocollo per la comunicazione cifrata e autenticata tra due host, che sfrutta la riga di comando.
9.4.2
Server SSH
L’host con cui si vuole comunicare deve avere in funzione il server SSH (con Ubuntu è sufficiente installare il
pacchetto openssh-server )
9.4.3
Client SSH
Per avviare la sessione di lavoro, da un terminale si digita
ssh utente@hostname
dove utente e hostname sono rispettivamente il nome dell’utente e il nome (o l’indirizzo IP) dell’host.
Alla prima connessione, viene richiesto di confermare l’autenticità della controparte:
The authenticity of host ’****.local (192.168.0.110)’ can’t be established.
RSA key fingerprint is 09:61:6d:8e:6f:79:a7:a5:6d:f7:91:1c:a2:cc:8c:35.
Are you sure you want to continue connecting (yes/no)?
L’impronta digitale RSA viene memorizzata nel file locale ~/.ssh/known_hosts.
9.4.4
Esecuzione di comandi su calcolatore remoto
È possibile specificare un comando da eseguire sul calcolatore remoto:
ssh utente@hostname ls
9.4.5
Autenticazione senza password
Un utente può generare una coppia di chiavi RSA su un host e sfruttare un meccanismo di sfida per ottenere
l’autenticazione su un altro host senza bisogno di password.
Supponendo di voler amministrare (con privilegi di root) un altro host, dovremo seguire i seguenti passi.
Sul nostro calcolatore generare una coppia di chiavi RSA:
ssh-keygen -t rsa
Copiare il file ~/.ssh/id_rsa.pub nella directory .ssh dell’utente con il quale ci vogliamo autenticare sull’host
remoto (nel nostro caso, l’utente root).
Sul calcolatore da gestire, accodare il file copiato al file ~/.ssh/authorized_keys dell’utente con il quale ci
vogliamo autenticare (il file deve risultare di sua proprietà).
128
9.4.6
Autenticazione senza verifica chiave host
In alcune situazioni, può essere necessario evitare che venga chiesta la conferma dell’autenticità della controparte
(ad esempio, nel caso di host il cui indirizzo IP è ottenuto via DHCP).
Si può disabilitare la richiesta con i seguenti parametri sulla riga di comando:
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected]
Oppure, su base permanente, si può modificare il proprio file ~/.ssh/config con il seguente contenuto:
Host *.local
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
Ovviamente, il rischio è di essere soggetti ad attacchi di tipo Man in the middle.
10
10.1
10.1.1
Basi di dati
MySQL
Introduzione
Quelle che seguono sono solo brevi note su cose che si possono fare e potrebbero non essere del tutto ovvie.
10.1.2
Ripristino password di root
Per ripristinare la password di root è necessario fermare il demone, riavviarlo con l’opzione --skip-grant-tables,
effettuare la query di update della password, fermarlo e riavviarlo.
sudo service mysql stop
sudo mysqld --skip-grant-tables &
sleep 5
echo "UPDATE mysql.user SET Password=PASSWORD(’SeKRetPwd’) WHERE User=’root’;" | mysql -u root
echo "FLUSH PRIVILEGES;" | mysql -u root
sudo killall mysqld
sudo service mysql start
10.1.3
Visualizzazione riferimenti esterni con phpMyAdmin
Se si usa phpMyAdmin, può essere utile definire per le tabelle un “campo da mostrare” (in Struttura / Vedi
relazioni ), in modo da facilitare l’inserimento dei dati.
Figura 8: Riferimenti con phpMyAdmin
Questa informazione è interna a phpMyAdmin e viene memorizzata nella tabella pma_table_info.
129
10.1.4
Stored procedures - Funzioni (creazione)
È possibile creare una funzione con un codice simile al seguente:
delimiter $$
create function quality(n INT)
returns varchar(30)
begin
if isnull(n) then
return "not set";
elseif n<6 then
return "bad quality";
elseif n<8 then
return "good quality";
else
return "best quality";
end if;
end$$
delimiter ;
10.1.5
Stored procedures - Funzioni (uso)
L’uso di una funzione personalizzata è equivalente a quello che si farebbe di una funzione predefinita:
select quality(mark) as markdescription from marks where ... ;
10.1.6
Stored procedures - Parametri in ingresso (creazione)
Si possono naturalmente definire dei parametri, come nell’esempio che segue — per il quale si assume che
esistano una tabella friends (id, name, city_id) e una tabella cities (id, name):
DELIMITER $$
CREATE PROCEDURE FriendsByCity(IN city_id INTEGER)
BEGIN
SELECT friends.name, cities.name FROM friends
LEFT JOIN cities on friends.city_id = cities.id
WHERE cities.id = city_id;
END$$
DELIMITER ;
10.1.7
Stored procedures - Parametri in ingresso (uso)
Una stored procedure si richiama con CALL:
CALL FriendsByCity(1);
10.1.8
Stored procedures - Parametri in uscita (creazione)
Se la stored procedure deve restituire dei valori, è necessario dichiarare gli appositi parametri, preceduti dall’indicazione OUT:
DELIMITER $$
CREATE PROCEDURE CountFriendsByCity(IN city_id INTEGER, OUT number INT)
BEGIN
SELECT COUNT(*) INTO number FROM friends
LEFT JOIN cities on friends.city_id = cities.id
WHERE cities.id = city_id;
END$$
DELIMITER ;
130
10.1.9
Stored procedures - Parametri in uscita (uso)
Quando una stored procedure calcola qualche valore, è necessario richiamare prima la procedura per l’esecuzione,
e poi fare una selezione per ottenere i valori calcolati:
CALL CountFriendsByCity(1, @number);
SELECT @number AS friends_count;
10.1.10
Stored procedures - Creazione di API per l’accesso al DB (1/2)
Un buon uso delle stored procedures è quello di consentire la costruzione di interfacce per l’accesso al database
che mascherino la struttura interna dello stesso.
Un esempio potrebbe essere quello di far sı̀ che si possa inserire nel database degli amici, con la loro città di
residenza, tramite chiamate simili a questa:
CALL AddFriendWithCity(’Giulio’, ’Udine’);
CALL AddFriendWithCity(’Alice’, ’Treviso’);
Deve essere la procedura a verificare se la città è già presente o meno, recuperandone l’id oppure procedendo a
un nuovo inserimento, prima di inserire l’amico.
10.1.11
Stored procedures - Creazione di API per l’accesso al DB (2/2)
Per ottenere quanto descritto, si può scrivere una stored procedure di questo tipo:
DELIMITER $$
CREATE PROCEDURE AddFriendWithCity(IN friend_name VARCHAR(50), IN city_name VARCHAR(50))
BEGIN
DECLARE city_id INT;
SELECT id INTO city_id FROM cities WHERE name = city_name;
IF city_id IS NULL THEN
INSERT INTO cities(name) VALUES (city_name);
SELECT LAST_INSERT_ID() INTO city_id;
END IF;
INSERT INTO friends(name, city_id) VALUES(friend_name, city_id);
END$$
DELIMITER ;
10.1.12
Stored procedures - Cicli e cursori
Può essere necessario prevedere che la procedura effettui dei cicli sulle tuple estratte con una selezione.
Il seguente esempio mostra come questo possa essere ottenuto (il fine della procedura è di inserire in una nuova
tabella l’id, il nome e la città degli amici — si potrebbe ottenere la stessa cosa con puro SQL, ma qui si vuole
illustrare il funzionamento dei cicli).
DELIMITER $$
CREATE PROCEDURE TakeSnapshotForFriends()
BEGIN
DECLARE city_name VARCHAR(100);
DECLARE friend_name VARCHAR(100);
DECLARE friend_id INT;
DECLARE city_id INT;
DECLARE job_done INT DEFAULT 0;
DECLARE cur_friends CURSOR FOR
SELECT friends.id AS id, friends.name AS friend_name, cities.name AS city_name FROM friends INNER JOIN cities on friends.cit
DECLARE CONTINUE HANDLER FOR NOT FOUND SET job_done = 1;
OPEN cur_friends;
131
WHILE job_done = 0 DO
FETCH cur_friends INTO friend_id, friend_name, city_name;
INSERT INTO friends_snapshot(friend_id, friend_name, city_name) VALUES (friend_id, friend_name, city_name);
END WHILE;
CLOSE cur_friends;
END$$
DELIMITER ;
10.2
PostgreSQL
10.2.1
Introduzione
Quelle che seguono sono solo brevi note su cose che si possono fare e potrebbero non essere del tutto ovvie.
10.2.2
Impostazione della password
$ sudo -u postgres psql template1
Welcome to psql 8.3.8, the PostgreSQL interactive terminal.
Type:
\copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
template1=# ALTER USER postgres WITH PASSWORD ’myseKret’;
ALTER ROLE
template1=# \q
e poi
$ sudo passwd postgres
New UNIX password:
Retype new UNIX password:
passwd: password aggiornata correttamente
10.2.3
Avvio del server
$ sudo service postgresql-8.3 start
* Starting PostgreSQL 8.3 database server
10.2.4
[ OK ]
Creazione di un utente e di un database
sudo -u postgres createuser -D -A -P mynewuser
# (-A non è documentato, ma evita che venga chiesto
# "Shall the new role be a superuser? (y/n) n"
sudo -u postgres createdb -O mynewuser mydatabase
11
11.1
11.1.1
X Window e GNOME
Il sistema grafico XWindow
Componenti del sistema X Window
Quando si parla di X Window bisogna distinguere le seguenti componenti:
• il protocollo definito per la comunicazione e l’interazione (X display protocol )
• le applicazioni serventi (diverse implementazioni: XFree86, Xorg)
• i gestori di finestre (es. Afterstep, Blackbox, Enlightment, Twm, Icewm, Kwin, Compiz )
• gli ambienti desktop (es. GNOME, KDE, XFCE )
132
• i gestori del login, detti display manager (GDM, XDM, KDM )
Gli ambienti desktop si appoggiano ai gestori di finestre (es. GNOME a Metacity, KDE a Kwin, XFCE a
Xfwm4).
11.1.2
File di configurazione
Il file di configurazione principale del servente X è, a seconda del sistema usato, /etc/X11/XF86Config oppure
/etc/X11/xorg.conf.
Ad esempio, le sezioni sul mio calcolatore sono:
$ cat /etc/X11/xorg.conf | grep Section | grep -v End | uniq
Section "Files"
Section "Module"
Section "InputDevice"
Section "Device"
Section "Monitor"
Section "Screen"
SubSection "Display"
Section "ServerLayout"
Section "DRI"
11.1.3
Configurazione di X Window
Solitamente non si modifica il file di configurazione a mano, visto che esistono ottimi strumenti per farlo in
maniera interattiva.
11.1.4
Avvio di X Window
X Window si può avviare:
• da terminale, con il comando startx (script che invoca il programma xinit)
• da init (con l’avvio del gestore di login)
11.1.5
Accesso da sistemi remoti
L’accesso ad applicazioni grafiche su di un sistema può avvenire:
• dopo aver avviato una sessione telnet da altro host, a patto di digitare il comando xhost +remote_host_name
• dopo aver avviato una sessione ssh da altro host, a patto di abilitare l’X forwarding con ssh -X
• tramite XDMCP (login remoto)
• da macchine Windows, con puTTY affiancato dal servente XMing
11.1.6
La variabile DISPLAY
La variabile d’ambiente DISPLAY indica su quale host/monitor deve essere eseguito l’output grafico.
Ad ogni modo, si può fare in modo che un’applicazione grafica mostri l’output su un determinato display anche
indicandolo espicitamente:
$ xmessage "testo del messaggio" -display :0.0
$ gedit --display :0.0 #
133
11.1.7
Programmi utili
Alcuni programmi si possono rivelare particolarmente utili per una configurazione personalizzata di X Window.
• xmodmap (carica un layout di tastiera personalizzato)
• xkeycaps (permette di generare graficamente un file di layout di tastiera da far leggere a xmodmap)
• xeyes (utile quanto meno per testare il funzionamento del mouse)
• xnest (un gestore annidato di server X Window)
• xsel (permette di leggere e scrivere sulla selezione primaria e secondaria)
11.1.8
Alcune cose da sapere
Piccole cose da sapere quando si usa X Window:
• per ottenere le lettere maiuscole accentate, è sufficiente usare il fissamaiuscolo e il tasto con la lettera
accentata minuscola (in questo modo è facile ottenere caratteri come ÈÉÀÒÌ)
• oltre alla clipboard (luogo dove vanno a finire le cose copiate e/o tagliate), esiste la selezione primaria (se
in un’applicazione si seleziona un testo, lo si può “incollare” in un’altra applicazione senza averla prima
copiata: è sufficiente premere il pulsante centrale del mouse, o la rotellina)
• in alcune vecchie applicazioni X Window, la barra di scorrimento laterale si muove premendo il pulsante
sinistro del mouse per scendere e quello destro per salire
• se un’applicazione grafica si “pianta” la si può far terminare graficamente con il comando xkill
• uno script bash può utilizzare un’interfaccia X Window grazie al programma xdialog (o altri equivalenti)
11.1.9
Xnest
Xnest permette di fare degli esperimenti con le applicazioni X Window (e diversi window manager).
$
$
$
$
$
Xnest :1 -ac &amp;
#-ac disabilita i controlli di accesso
xclock -display :1
xclock -foreground "Red" -geometry +450+250 -display :1
twm -display :1 &amp;
xterm -display :1
Da un altro host, si può provare xeyes -display hostname:1.0
(Esempi tratti da un articolo sul LinuxJournal56 ).
11.1.10
Xnest - GIMP in una sola finestra
Se si vuole fare in modo che le finestre di GIMP siano raggruppate in un’unica finestra, si può ricorrere a questo
piccolo script:
#!/bin/sh
Xnest :3 -ac -kb -name GIMP -geometry 1200x740 &amp;
metacity --display :3 &amp; wmpid=$!
gimp --display :3 &amp;
wait $wmpid
(Esempio tratto da un post su teleperion57 ).
11.1.11
tdfsb
Se si vuole provare l’ebbrezza di volare sul proprio file system, si può installare e usare il programma tdfsb.
56 http://www.linuxjournal.com/article/7298
57 http://telperion.wordpress.com/2007/05/06/gimp-in-una-sola-finestra/
134
Figura 9: Navigazione 3d con tdfsb
11.1.12
Cattura di una schermata
Il programma import permette di catturare una schermata di XWindow:
import -window root ~/Immagini/screenshot.png
11.1.13
Cattura video desktop
Il programma ffmpeg può essere usato per catturare le operazioni effettuate sul desktop in un file video:
ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq ~/Video/sequence.mpg
11.2
11.2.1
GNOME, l’interfaccia standard di Ubuntu
GNOME
GNOME (GNU Network Object Model Environment) è il Desktop Environment ufficiale del progetto GNU.
11.2.2
Personalizzazione di GNOME
Sul web si trovano molti documenti sul tema della personalizzazione di GNOME.
Si può partire, ad esempio, da Customize your Ubuntu GNOME theme58 .
11.2.3
Aree di lavoro e finestre
Il Desktop di GNOME è diviso in aree di lavoro, all’interno delle quali sono presenti le finestre delle applicazioni.
Agendo sulla barra del titolo (con il pulsante destro del mouse), le finestre possono essere spostate da un’area
di lavoro all’altra.
Se la barra del titolo non dovesse essere visibile, si può spostare una finestra tenendo premuto il tasto alt.
11.2.4
Tastiera e caratteri speciali
Se si ha la necessità di inserire in un testo caratteri speciali (ad esempio, una ı̈, oppure una ł ) GNOME ci mette
a disposizione diverse possibilità:
• usare la Tabella caratteri (menù Accessori )
• aggiungere al pannello, ed eventualmente personalizzare, la Tavolozza caratteri
• usare particolari combinazioni di tasti (es. con Alt Gr )
• usare il tasto definito come Compose Key e delle particolari sequenze di tasti
• usare i codici Unicode
• definire una propria tastiera personalizzata
58 http://www.ghacks.net/2009/04/30/customize-your-ubuntu-gnome-theme/
135
11.2.5
Combinazione di tasti
Per verificare che caratteri si possono ottenere con la disposizione dei tasti in uso, procedere come segue:
1. Sistema/Preferenze/Tastiera
2. Disposizione/Italy/Stampa diagramma disposizione
3. Anteprima di stampa
Tenere presente che le lettere accentate maiuscole possono essere ottenute usando il fissa-maiuscole.
11.2.6
Compose key
Le tastiere di molti sistemi Unix mettono a disposizione un tasto, detto Compose key, che permette di comporre
dei caratteri con delle sequenze particolari.
Su PC si può sfruttare un tasto inutilizzato (ad esempio quello con la bandierina di Windows). Per farlo:
1. Sistema/Preferenze/Tastiera
2. Disposizioni /Altre opzioni. . .
3. Compose key position/Left Win Key is Compose
Dopo aver attivato il tasto compose, si possono ottenere alcuni caratteri tramite la sequenza compose/tasto1/tasto2
(si deve premere il tasto compose, rilasciarlo e poi premere gli altri tasti della sequenza).
Ad esempio, per una i con dieresi, si può premere compose e poi e i.
11.2.7
Esempi di composizione
La tabella completa delle composizioni disponibili è disponibile in:
• GtkComposeTable59
• Linux Compose Key Sequences60 .
Particolarmente comodo è:
• usare le sequenze --- e --. per, rispettivamente, il trattino lungo — da usare per incisi come questo —
e quello medio, da usare per gli intervalli (es. pagg. 12–14 ).
• usare le sequenze 1 e 2 per ottenere 12 , 3 e 4 per 43 , x e x per il segno di moltiplicazione (×), ecc.
11.2.8
Usare i codici UNICODE
Per esigenze particolari si possono usare direttamente i codici UNICODE. Ad esempio, dovendo inserire il
simbolo dello Yen (codice esadecimale 00A5, o 0x00A5), si può procedere come segue:
1. premere ctrl-shift-U (compare una lettera u sottolineata)
2. digitare il codice esadecimale
3. premere la barra spaziatrice
11.2.9
Definizione di una tastiera personalizzata
Il programma xkeycaps permette di definire una propria disposizione di tasti personalizzata, da sfruttare con il
programma xmodmap.
59 https://help.ubuntu.com/community/GtkComposeTable
60 http://www.hermit.org/Linux/ComposeKeys.html
136
11.2.10
Nautilus
Nautilus è la componente di GNOME che si occupa della gestione di file e directory.
Le operazioni fatte sui file tramite Nautilus sono generalmente intuitive.
Vale la pena di sottolineare alcune particolarità:
• i link (collegamenti) possono essere creati facendo clic con il pulsante centrale del mouse (la rotellina)
sull’icona di un file, trascinandola sulla destinazionee scegliendo la voce “Collega qui” dal menù contestuale,
oltre che facendo clic con il pulsante destro e scegliendo la voce “Crea collegamento”
• la cartella Modelli può contenere dei modelli di documento che vengono proposti quando si fa clic con il
pulsante destro del mouse in una cartella e si sceglie la voce “Crea documento”
• se per una cartella si dispone dei permessi di lettura ma non di esecuzione, Nautilus la mostra vuota
11.2.11
Informazioni aggiuntive su file e directory
Tramite Nautilus si possono impostare informazioni aggiuntive su file e directory, quali simboli speciali, annotazioni, ecc.
Tali informazioni vengono memorizzate in appositi metafile, in formato XML, nella directory .nautilus dell’utente, non nella directory stessa.
11.2.12
Editor di configurazione
Il comando gconf-editor lancia l’editor di configurazione di GNOME, con il quale è possibile accedere a vari
parametri di configurazione dell’ambiente di lavoro.
Ad esempio:
• impostando il valore /apps/nautilus/preferences/desktop is home dir a true, si indica a Nautilus di usare
la propria cartella home come scrivania.
• impostando il valore /apps/metacity/general/button layout a menu:minimize,maximize,close si cambia
l’ordine in cui compaiono il menù e i pulsantini di minimizzazione, massimizzazione e chiusura delle
finestre.
11.2.13
gconftool–2
I parametri di configurazione possono essere visualizzati e/o modificati anche direttamente da riga di comando,
grazie al programma gconftool–2.
La visualizzazione di tutte le impostazioni si ottiene in forma di file XML con
gconftool-2 --dump /
Mentre un’impostazione puù essere cambiata con, ad esempio, un comando come il seguente:
gconftool-2 --type bool --set /apps/nautilus/preferences/desktop_is_home_dir True
11.2.14
Impostazione della modalità di visualizzazione dei permessi
I permessi su file e directory vengono normalmente visualizzati in modalità sintetica. Questa impostazione si
può cambiare con il comando
gconftool-2 --type bool --set /apps/nautilus/preferences/show_advanced_permissions True
La modalità predefinita può essere ripristinata con
gconftool-2 --type bool --set /apps/nautilus/preferences/show_advanced_permissions False
137
Figura 10: Permessi con GNOME
11.2.15
Compiz
Compiz è un programma che permette di ottenere accattivanti effetti grafici sul proprio desktop.
Per usarlo è necessario impostare (menù Sistema/Preferenze/Aspetto/Effetti visivi ) la modalità “Aggiuntivi”,
altrimenti alcuni efetti non funzionerebbero.
Gli effetti specifici da attivare devono essere impostati tramite la voce di menù Sistema/Preferenze/Gestore
configurazione CompizConfig (tenere presente che il tasto super è quello, a fianco del tasto ALT, con l’icona di
Windows, mentre button1, button2 e button3 sono rispettivamente i tasti sinistro, centrale e destro del mouse).
11.2.16
Compiz - effetto desktop cubico
Figura 11: Desktop cubico
Uso combinato di Desktop cubico, Ruota cubo e Finestre 3D. Per ruotare il cubo, premere Ctrl-Alt e trascinare
il mouse.
Premendo il tasto Super e il tabulatore si può passare da un’applicazione all’altra.
11.2.17
Compiz - finestre tremolanti
Uso di Finestre tremolanti.
11.2.18
Beagle
Beagle è uno strumento per effettuare ricerche “full text” nei propri documenti.
È utilizzabile anche dalla riga di comando:
138
Figura 12: Desktop cubico
Figura 13: Ricerca con Beagle
$ beagle-query ’potenza sonora’
file:///home/loris/Scaricati/all1t.pdf
file:///home/loris/Scaricati/all1-2x1.pdf
file:///home/loris/Scaricati/all1.pdf
11.2.19
Accessibilità
Il progetto GNOME dedica grande attenzione al tema dell’accessibilità.
È possibile selezionare:
• temi ad alto contrasto
• ingranditori
Riferimenti:
• Ubuntu e l’accessibilità61
• Guida all’accessibilità di Fedora62
Anche in Compiz è presente una sezione dedicata all’accessibilità.
11.2.20
Tecnologie assistive
Utilizzando GNOME, si può far uso delle tecnologie assistive, che consentono di:
• avere un contrasto elevato
• ingrandire i testi
• utilizzare la sintesi vocale
61 http://www.ubuntu-it.org/ubuntu/accessibilita.shtml
62 http://docs.fedoraproject.org/it-IT/Fedora/14/pdf/Accessibility
139
Guide/Fedora–14-Accessibility Guide-it-IT.pdf
• usare un terminale Braille
• impostare modificatori di tastiera
• gestire il mouse (o altro puntatore) in maniera personalizzata
È sufficiente selezionare le voci appropriate nelle Preferenze.
Figura 14: Accessibilità
11.2.21
Configurazione di sistema
Alcune impostazioni di sistema, ad esempio relative alla schermata di login (gestita da gdm) possono essere
modificate via riga di comando agendo come utente gdm.
Ad esempio, per abilitare o disabilitare l’ingrandimento in fase di login, si può ricorrere al seguente comando
(impostando true o false):
sudo -u gdm gconftool-2 /desktop/gnome/applications/at/screen_magnifier_enabled --type bool --set false
140