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 <[email protected]>" 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 & #-ac disabilita i controlli di accesso xclock -display :1 xclock -foreground "Red" -geometry +450+250 -display :1 twm -display :1 & 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 & metacity --display :3 & wmpid=$! gimp --display :3 & 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