/loris/tissino /la/mia/cassetta/degli/attrezzi/linux

www.tissino.it/docs/linux Indice

1 Introduzione 17 1.1 Questa cassetta ...... 17 1.1.1 A chi `erivolta ...... 17 1.1.2 Formati e diffusione ...... 17 1.1.3 Errori ...... 17 1.1.4 Licenza ...... 17 1.2 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`adi 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`anell’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 24 2.1 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 2.2 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 26 3.1 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`uprogrammi ...... 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 ...... 29 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 3.2.10 Operazioni su molti file/directory contemporaneamente ...... 31 3.2.11 I nodi indice e altre amenit`a ...... 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) ...... 33 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`adelle appartenenze ...... 34 3.3.9 Bit SUID, SGID e Sticky ...... 34 3.3.10 Chmod con modalit`asimbolica 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 ...... 40 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 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 ...... 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 `espento? ...... 45

4 Installazione e configurazione 45 4.1 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 ...... 49 4.2.8 Cosa ’`ein un pacchetto ...... 49 4.2.9 Sistemi di gestione dei pacchetti ...... 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 ...... 52

5 Amministrazione 53 5.1 Gestione dei processi ...... 53 5.1.1 Gestione dei processi ...... 53 5.1.2 Definizione di processo ...... 53 5.1.3 PID ( 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 ...... 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: ...... 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`a ...... 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`acopy-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`adelle 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 ...... 75 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 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 Inetd e Xinetd ...... 78 5.7.1 Servizi, d´emonie processi serventi ...... 78 5.7.2 Il superdemone ...... 79 5.7.3 Configurazione di un servizio gestito dal super-d´emone...... 79 5.7.4 TCP wrappers ...... 79 5.8 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 ...... 80 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 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 84 6.1 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`a...... 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.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 ...... 89 6.2.7 NetCat ...... 89 6.3 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) ...... 94 6.4.8 Servizi importanti: Network File System (lato client) ...... 94 6.4.9 Servizi importanti: Samba ...... 95 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`adelle registrazioni di log ...... 96 6.5.6 Configurazione delle attivit`adi 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 `el’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 [ ?...... 108 7.2.8 Esecuzione degli script ...... 108 7.2.9 Debugging degli script ...... 109 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 115 8.1 Vim, l’editor di riferimento ...... 115 8.1.1 Introduzione a VIM ...... 115 8.1.2 Le basi ...... 115 8.1.3 Ripetizione dell’ultimo comando ...... 116 8.1.4 Corrispondenza delle parentesi ...... 116 8.1.5 Modalit`avisuale ...... 116 8.1.6 Macro e registri ...... 116 8.1.7 Selezione primaria e clipboard di sistema ...... 117 8.1.8 Modalit`a last-line ...... 117 8.1.9 Ricerche ...... 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 118 9.1 Codice in materia di protezione dei dati personali ...... 118 9.1.1 La cosiddetta “Legge sulla privacy” ...... 118 9.1.2 Principio di necessit`a...... 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 9.2 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 ...... 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`adi 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`a...... 139 11.2.20 Tecnologie assistive ...... 139 11.2.21 Configurazione di sistema ...... 140

16 1 Introduzione

1.1 Questa cassetta

1.1.1 A chi `erivolta

Questa raccolta di appunti, che ho chiamato “cassetta degli attrezzi” per sottolinearne l‘aspetto pragmatico/o- perativo, serve a dare un po’ di organicit`aa 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’`edietro le cose, ma solo un riferimento agile e snello da consultare “alla bisogna”. L`adove `estato 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`odocumentare 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 `eesente 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`aessere 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 `erilasciata ai sensi della licenza Creative Commons Attribuzione-Non commerciale-Condividi allo stesso modo 2.51.

1.2 Bibliografia e documentazione

1.2.1 PDF

Alcuni libri completi disponibili in PDF:

• Daniele Giacomini, Appunti di informatica libera2

1http://creativecommons.org/licenses/by-nc-sa/2.5/it/ 2http://informaticalibera.net/ 17 • Simone Piccardi, Amministrare GNU/Linux3

• Keir Thomas, Ubuntu Pocket Guide and Reference4 • Daniele Medri, Linux facile5 • Javier Fern´andez-SanguinoPe˜na,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`oessere 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`oinstallare 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) - file perusal filter for crt viewing $ whatis less less (1) - opposite of more $ whatis man man (1) - an interface to the on-line reference manuals man (7) - macros to format man pages

3http://www.lulu.com/content/752924 4http://www.ubuntupocketguide.com/index main.html 5http://linuxfacile.medri.org/download/linuxfacile 5.0–1.pdf 6http://www.debian.org/doc/manuals/securing-debian-howto/securing-debian-howto.en.pdf 7http://www.stampalternativa.it/liberacultura/?p=187 8http://tldp.org/ 9http://www.linuxjournal.com

18 1.2.6 Apropos

Il programma apropos fa una ricerca nelle descrizioni delle pagine man in base alla parola chiave specificata. E` l’equivalente di man -k.

$ apropos sudoers sudoers (5) - list of which users may execute what visudo (8) - edit the sudoers file $ man -k sudoers sudoers (5) - list of which users may execute what visudo (8) - edit the sudoers file

1.2.7 Info

Una parte della documentazion del software della Free Software Foundation `emantenuta 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 `edisponibile, spesso in formato ipertestuale o di testo puro, nella directory /usr/sha- re/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, `edisponibile 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, `emeglio che questo messaggio non sia localizzato (tradotto). Si pu`oinvocare il programma premettendo la stringa LANG=C.

10http://www.tlpd.org

19 1.3 Il concetto di software libero

1.3.1 Il software

Classificazioni del software:

• per tipologia • per licenza • per metodologia di sviluppo • per . . .

1.3.2 Programma

Un programma `eun insieme di istruzioni che devono essere eseguite da un calcolatore. Esistono programmi di diversa natura e di diversa complessit`a. Un programma pu`o:

• 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 `eun 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`adell’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 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 `eun’organizzazione senza scopo di lucro che ha come obiettivo la promozione dello sviluppo di software libero, definito tramite le seguenti caratteristiche:

• libert`adi eseguire il programma per qualsiasi scopo • libert`adi studiare il programma e modificarlo • libert`adi copiare il programma in modo da aiutare il prossimo • libert`adi migliorare il programma e di distribuirne pubblicamente i miglioramenti, in modo tale che tutta la comunit`ane 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 ).

1.3.7 Copyright e Copyleft

Il software, come qualsiasi opera d’ingegno, `etutelato 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´elimitarli. 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`odistribuire 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`adel codice sorgente • permesso di ottenere prodotti derivati • eventuale possibilit`adi garantire l’integrit`adel codice sorgente originale • non discriminazione contro persone o gruppi • non discriminazione per campo d’applicazione • distribuzione della licenza con il programma • specificit`aad un prodotto • divieto di vincoli su altro software • neutralit`arispetto alle tecnologie 21 1.3.10 Altri tipi di licenza

Molto software viene distribuito con licenze diverse, che solitamente vengono raggruppate nelle seguenti cate- gorie:

• shareware – pizzaware – postcardware – ... • freeware • public domain

1.4 Differenze tra Windows e GNU/Linux

1.4.1 Differenze tra Microsoft Windows e GNU/Linux

Tra i sistemi operativi Windows e GNU/Linux esistono differenze notevoli in termini di:

• licenze e modalit`adi distribuzione • costi • sicurezza • flessibilit`a • disponibilit`adi aggiornamenti • disponibilit`adi software • i18n e l10n • filosofia implementativa • organizzazione del filesystem

1.4.2 Sicurezza

Virus e malware. Con Windows ci sono pi`urischi a causa di:

• maggior diffusione • minore sicurezza intrinseca (es. frequente necessit`adi lavorare come amministratore)

Al riguardo, pu`oessere utile la lettura di Linux, Unix e i virus11.

1.4.3 Disponibilit`adi software

A seconda del tipo di software, pu`oesserci una disponibilit`amaggiore per Windows o per Linux. Ad esempio, `elecito aspettarsi un maggior numero di programmi di contabilit`aper 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). E` possibile usare uno stesso programma in diverse lingue, e l’intera interfaccia utente pu`oseguire le preferenze dell’utente. 11http://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`oaggiornare il sistema operativo e anche tutto il software applicativo. In Windows invece ogni applicazione ha storia a s´e. In Windows il programma X viene installato in una directory con tutto ci`oche gli compete (es. documentazione, file di esempio, ecc.). In Linux il software `einstallato 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 `eil 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 `eorganizzato 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`adi defram- mentazione del disco.

1.4.7 Nomi di file e directory

Linux, per quanto riguarda i nomi dei file e delle directory, `e case-sensitive (sensibile alla differenza tra maiuscole e minuscole). In una stessa directory posso avere i file lettera, Lettera e LETTERA. Windows invece `e 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 `ela barra ordinaria (/ ), mentre per Windows `equella rovescia (\).

1.4.8 Estensioni

In Windows il concetto di estensione per i nomi dei file `eparte 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`ugranulari 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`aparagonabili 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´enon servono (si possono utilizzare le date o le posizioni per ottenere le informazioni necessarie).

1.4.11 File binari

In Windows vi `euna differenza nel modo in cui vengono considerati file binari e file di testo. In Linux non c’`e questa distinzione (in un certo senso, tutti i file sono considerati binari). 23 1.4.12 Flessibilit`anell’uso dell’interfaccia grafica

Windows impone l’uso di un’interfaccia grafica, che `eintegrata con il sistema operativo. Il crash dell’interfaccia, o di una qualsiasi applicazione, compromette la stabilit`adell’intero sistema. In Linux l’ambiente grafico `eapplicazione separata e pu`oessere attivata o meno, a scelta. Inoltre:

• il server grafico pu`oessere attivato su un calcolatore remoto • esistono diversi tipi di Desktop Manager tra cui l’utente pu`oscegliere • un utente ha a disposizione pi`u desktop

1.4.13 Interfaccia a riga di comando

Linux mette a disposizione un’ampia gamma di interfacce di amministrazione (shell). La shell pi`ucomunemente usata si chiama bash (Bourne Again Shell) ed `eflessibile 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 `eintrinsecamente multiutente: sullo stesso calcolatore possono lavorare, contemporaneamente, pi`uutenti, sia con interfaccia grafica sia in emulazione di terminale. In Windows la multiutenza `etale 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`a(file semplici, LDAP, dominio Windows, ecc.). Windows `emolto pi`ulimitato in proposito.

1.4.17 Lettere accentate

Con Linux `efacile scrivere una E` ! (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 Software libero e scuola

2.1.1 Software libero e scuola

Esistono molti validi motivi per usare software libero nella scuola:

• educazione alla legalit`a

12http://www.whylinuxisbetter.net/index it.php 24 • educazione alla libert`a • educazione alla collaborazione • educazione alla curiosit`aintellettuale • economicit`a

2.1.2 Il sito web linuxdidattica.org

Il sito web linuxdidattica.org13 contiene informazioni e risorse legate alle attivit`anelle scuole basata sul software libero. E` raccomandabile iscriversi alla mailing list [email protected], collegata al sito web.

2.1.3 Dossier Scuola

Il Dossier Scuola15 `eun’opera collettiva che mira a documentare motivazioni, software, esperienze, progetti nell’ambito della scuola e della didattica.

2.1.4 WiildSs

WiildOs `euna distribuzione Linux pensata per l’uso delle lavagne multimediali interattive nella scuola. E` supportata da una comunit`amolto attiva.

2.1.5 Software utile

• iTalc16 pu`oessere utilizzato per monitorare i calcolatori di un laboratorio didattico ed effettuare presen- tazioni • SchoolTool17 `euna suite di programmi liberi per l’amministrazione delle scuole

2.2 iTALC

2.2.1 iTALC iTALC `euno 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 addgroup italc $ sudo adduser italc $ sudo chown root:italc -R /etc/italc/keys/public $ sudo chown root:italc -R /etc/italc/keys/private $ sudo chmod -R 750 /etc/italc/keys/private $ sudo chmod -R 755 /etc/italc/keys/public

13http://linuxdidattica.org 14http://lists.linux.it/listinfo/scuola/ 15http://www.dossierscuola.it/ 16http://italc.sourceforge.net/ 17http://schooltool.org/ 18http://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 calcola- tore del docente.

2.2.4 Gestione

La gestione `esufficientemente intuitiva.

Figura 2: iTALC

3 Interfaccia a linea di comando e comandi basilari

3.1 Introduzione alla Bash

3.1.1 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`u”

• history

26 3.1.2 Struttura dei comandi

La struttura base dei comandi `ela 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 # possibile chmod unarchivio +x # errato

3.1.3 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 | 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`ousare 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 `enecessario 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`uprogrammi

A volte pu`oessere 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`oessere 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 Gestione di file e directory

3.2.1 Il filesystem

Il filesystem dei sistemi Un*x:

• `ebasato su un unico albero, con un’unica radice

• `eindipendente 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 programmi eseguibili principali |-- boot file per l’avvio del calcolatore |-- dev dispositivi |-- etc file di configurazione di sistema |-- home directory personali degli utenti |-- lib librerie |-- media dispositivi esterni |-- mnt file system subordinati secondari |-- opt eseguibili da pacchetti non standard |-- proc directory virtuale per i processi |-- root directory dell’utente root |-- sbin eseguibili per l’amministrazione |-- sys directory virtuale per i dispositivi |-- tmp directory per file temporanei |-- usr documentazione, librerie, programmi |-- var 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`oavvenire 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 # elenco dei file ls -l # elenco con dettagli ls -a # mostra anche i file nascosti ls -F # mostra il tipo

Altri comandi utili: tree # visualizzazione ad albero find # ricerca

3.2.6 Creazione e rimozione di una directory

Una directory `e,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`uparametri in modo sintetico, la bash offre il meccanismo dell’espansione:

• con parentesi graffa:

– a{d,c,b}e `eespanso in ade ace abe – a{1..5}e `eespanso in a1e a2e a3e a4e a5e

• della tilde: ~ `ela propria home directory, ~mario `equella 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, . `eun riferimento alla directory corrente, .. `eun riferimento alla directory di livello superiore.

3.2.9 Comandi come parametri

A volte `eutile 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 `epossibile 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`outilizzare 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 `ea carico della shell, non del singolo programma.

31 3.2.11 I nodi indice e altre amenit`a

(rinvio)

• All’interno di una directory viene creato un collegamento al nodo indice di un file • Un file pu`oavere pi`unomi • 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`urighe (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 Permessi su file e directory

3.3.1 Tipi di file

In un sistema Un*x ogni dispositivo `evisto 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 `edi propriet`adi un determinato utente e di un determinato gruppo. I permessi sul file sono relativi all’utente proprietario e al gruppo proprietario. Root pu`ocambiare il proprietario di un file con chown. Un utente pu`ocambiare 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” `eleggibile, 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`adelle appartenenze

I permessi vengono valutati a partire dal proprietario. Se si `eproprietari di un file e quel file non `eleggibile dal proprietario ed `eleggibile 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´econ quelli dell’utente • SGID (Set Group ID): permette l’esecuzione di programmi con i permessi del gruppo proprietario del file eseguibile, anzich´econ quelli dell’utente; inoltre, permette la gestione di directory di lavoro comune tra pi`uutenti (ereditariet`adei 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`asimbolica o numerica

Il comando chmod pu`oessere usato in modalit`asimbolica (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’impo- stazione 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`aintrodotto il meccanismo delle deleghe, che pu`oessere 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 Ricerche

3.4.1 Find

Find `eil pi`upotente fra i programmi di ricerca. Importante la possibilit`adi 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 -iname ’*.c’ -exec chmod 700 {} \; # imposta permessi 700 a tutti i file con estensione .c $ find -iname ’*.c’ -execdir chmod 700 {} \; # come sopra, ma con maggior sicurezza $ find -iname ’*.c’ -okdir chmod 700 {} \; # come sopra, ma chiede conferma ogni volta $ find -iname ’*.c’ -exec chmod 700 {} + # unica invocazione del comando, con la lista dei parametri

3.4.2 Find - permessi sui file

Il criterio di ricerca basato sui permessi pu`oessere impostato sulla ricerca dei file che hanno esattamente determinati permessi, oppure che hanno (almeno) uno di o tutti i permessi specificati.

$ find -type f -perm 0500 -exec ls -l {} \; # trova solo i file con i permessi u=rx -r-x------1 loris loris 0 2008-04-19 17:17 ./0500_file $ find -type f -perm -0500 -exec ls -l {} \; # trova i file con entrambi i permessi u=rx -rwx------1 loris loris 0 2008-04-19 17:17 ./0700_file -r-x------1 loris loris 0 2008-04-19 17:17 ./0500_file

$ find -type f -perm /0500 -exec ls -l {} \; # trova i file con almeno uno dei permessi u=rx --wx------1 loris loris 0 2008-04-19 17:17 ./0300_file -r------1 loris loris 0 2008-04-19 17:17 ./0400_file -rwx------1 loris loris 0 2008-04-19 17:17 ./0700_file -r-x------1 loris loris 0 2008-04-19 17:17 ./0500_file ---x------1 loris loris 0 2008-04-19 17:17 ./0100_file -rw------1 loris loris 0 2008-04-19 17:17 ./0600_file

3.4.3 Find - ricerche per intervalli temporali

Quando si devono elencare tutti i file da un determinato momento ad un altro, pu`oessere 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`ousare l’opzione -prune. Ad esempio, per cercare i file con il bit SUID impostato in tutte le directory ad esclusione di /proc, si pu`oimpartire il comando:

$ find / -path ’/proc’ -prune -o -perm -u+s 2> /dev/null /usr/bin/sudoedit /usr/bin/sudo [...] /sbin/mount.nfs

Si noti l’operatore logico -o (se il percorso `e /proc non elencare il file; oppure — in caso contrario — elencalo se il file ha il bit SUID impostato).

19http://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`oattivare 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`ousare 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 realta` e` un built-in echo is a shell builtin

3.4.10 Type

Il comando type serve a indicare di che tipo `eil 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`aimpartiti nella shell corrente vengono organizzati in un hash, in modo che sia pi`uveloce 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 mem-R REG 8,3 2424832 3370940 /usr/lib/openoffice/program/services.rdb soffice.b 7373 loris 51rR REG 8,3 2424832 3370940 /usr/lib/openoffice/program/services.rdb

3.4.12 Df

DiskFree. Quanto spazio su disco rimane nelle diverse partizioni?

$ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 58317904 52921668 2433852 96% / varrun 972276 236 972040 1% /var/run varlock 972276 0 972276 0% /var/lock udev 972276 88 972188 1% /dev devshm 972276 0 972276 0% /dev/shm lrm 972276 34696 937580 4% /lib/modules/2.6.22-14-generic/volatile /dev/sdb1 1949824 1920384 29440 99% /media/disk

3.4.13 Du

DiskUsage. Quanto spazio su disco `eeffettivamente 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. E` 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

20http://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´elogica), si pu`ousare 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´eusare una serie di mv, si pu`oricorrere al programma rename (che funziona in maniera leggermente diversa nei sistemi RedHat/Fedora e in quelli Debian/Ubuntu).

$ rename .jpg .jpeg *jpg # RedHat/Fedora $ rename s/.jpg/.jpeg/ *jpg # Debian/Ubuntu

Se si hanno dei file numerati in maniera “naturale” si possono sistemare con un paio di comandi:

$ ls foto100.jpeg foto104.jpeg foto12.jpeg foto1.jpeg foto5.jpeg foto9.jpeg foto101.jpeg foto105.jpeg foto13.jpeg foto2.jpeg foto6.jpeg foto102.jpeg foto10.jpeg foto14.jpeg foto3.jpeg foto7.jpeg foto103.jpeg foto11.jpeg foto15.jpeg foto4.jpeg foto8.jpeg

$ rename s/foto/foto0/ foto?.jpeg $ rename s/foto/foto0/ foto??.jpeg $ ls foto001.jpeg foto006.jpeg foto011.jpeg foto100.jpeg foto105.jpeg foto002.jpeg foto007.jpeg foto012.jpeg foto101.jpeg foto003.jpeg foto008.jpeg foto013.jpeg foto102.jpeg foto004.jpeg foto009.jpeg foto014.jpeg foto103.jpeg foto005.jpeg foto010.jpeg foto015.jpeg foto104.jpeg

3.4.18 Pgrep e Pkill

Pu`ocapitare di dover cercare un processo in base al nome dell’utente, al nome dell’eseguibile, al terminale. Lo si pu`ofare 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 Operazioni programmate e periodiche

3.5.1 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

E` importante che nella rapppresentazione di date e ore non vi siano ambiguit`a.Ci`o`evalido soprattutto nei casi in cui `eprevista una qualche forma di elaborazione automatica. I problemi pi`ucomuni 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 # numero di secondi dall’Epoch 1203677970

Nota: i secondi possono andare da 0 a 60 per tener conto del secondo intercalare21 (supportato solo in rappre- sentazione).

3.5.4 Fuso orario

Informazioni sui fusi orari “attivabili” si possono trovare nel file /usr/share/zoneinfo/zone.tab. Il file /etc/lo- caltime `euna 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`oessere 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`ovedere o impostare l’ora dell’orologio hardware con il comando hwclock.

$ hwclock -r ven 22 feb 2008 11:54:06 CET -0.283391 seconds

$ sudo hwclock --systohc # imposta l’ora dell’hc basandosi su quella di sistema $ sudo hwclock --hctosys # imposta l’ora di sistema basandosi su quella dell’hc

21http://it.wikipedia.org/wiki/Secondo intercalare 40 3.5.7 L’ora esatta

Pu`oessere utile recuperare l’ora esatta da un server apposito, rintracciabile consultando la lista di server pubblici disponibili22. Per visualizzare l’ora pu`oessere dato il comando rdate -p . Per impostarla si dovr`adare il co- mando sudo rdate (o l’analogo sudo ntpdate . Ovvie norme di buona condotta prevedono che si evitino richieste troppo frequenti. Per sistemi comuni pu`oessere utile impostare l’ora all’avvio (eventualmente gestendo ritardi sistematici con adjtimex). Per sistemi server, che rimangono sempre accesi ed hanno necessit`adi precisione maggiore (e di modifiche meno drastiche all’ora di sistema), `econsigliabile 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

E` 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

E` possibile creare un file indicando la data di modifica (o di accesso/modifica). Ci`osi pu`orivelare 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

22http://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). Attual- mente vengono supportate date comprese nell’intervallo dal 13 dicembre 1901 al 19 gennaio 2038 (il numero di secondi `ememorizzato 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`osapere da quanto tempo il sistema `ein uso, nonch´eil carico di lavoro nell’ultimo minuto, negli ultimi cinque minuti, nell’ultimo quarto d’ora.

$ uptime 17:02:36 up 3:08, 3 users, load average: 1.19, 1.09, 1.14

3.5.13 Calendario

Se si desidera ottenere un calendario si pu`ousare 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 `estato 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 e` 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`omisurare 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`ousare il comando at.

$ at 17:30 warning: commands will be executed using /bin/sh at> echo questo e` un test at> echo dovrebbe essere eseguito alle 17.30 at> 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 Output from your job & 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) questo e` 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 Fri Feb 22 17:43:00 2008 a loris 5 Sat Feb 23 16:00:00 2008 a loris 4 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`orimuovere un lavoro dalla coda. I file /etc/at.allow e /etc/at.deny permettono di indicare, rispettivamente, quali siano gli utenti a cui `epermesso 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`eil carico di lavoro del calcolatore scende sotto un certo livello).

$ batch warning: commands will be executed using /bin/sh at> ./bigcompile at> 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`oessere 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 `eil 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 # per modificare la propria programmazione $ sudo crontab -e john # per modificare la programmazione dell’utente john $ crontab -l # per visualizzare la propria programmazione $ sudo crontab -u john -l # per visualizzare la programmazione dell’utente john

3.5.24 Configurazione di cron

Ogni riga del file di conigurazione della programmazione di cron `ecomposta 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 `espento?

. . . viene in soccorso anacron.

4 Installazione e configurazione

4.1 Installazione di Linux

4.1.1 Verifica della configurazione hardware

A volte capita, per la risoluzione di problemi hardware, di dover verificare la configurazione, magari confron- tandola 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 /proc/interrupts $ cat /proc/ioports $ cat /proc/dma $ cat /proc/usb $ cat /proc/pci

4.1.3 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`oesercitare 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`oessere 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`ousare 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`adi blocchi riservati a root • decidere chi (gruppo) pu`ousare i blocchi riservati, oltre a root

4.1.8 Debug

Un filesystem ext2 o ext3 pu`oessere 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`oessere innestato (mounted) nel filesystem principale tramite il comando mount e disinnestato tramite umount (operazioni privilegiate). Il file /etc/fstab pu`oprevedere la possibilit`adi 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 mec- canismi di caching. Se si desidera forzare le operazioni di scrittura, si pu`oimpartire 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 `edi supportare l’interoperabilit`atra applicazioni, strumenti di sviluppo e script, nonch´edi garantire una maggior uniformit`asulla documentazione per questi sistemi.

23http://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 Shareable Unshareable static /usr, /opt /etc, /boot variable /var/mail, /var/run, /var/spool/news /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`aesistono delle eccezioni per questioni di compatibilit`astorica.

4.1.18 Le directory principali

Per avere informazioni specifiche sulle linee guida, `econsigliabile leggere il documento nella sua interezza (esistono anche delle sintesi in italiano). E` 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 Gestione pacchetti software

4.2.1 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, `epossibile creare velocemente un pacchetto a partire dai sorgenti con checkinstall. tar xvzf nomepacchetto.tgz cd nomepacchetto ./configure # crea il Makefile make # compila i sorgenti sudo checkinstall # crea il pacchetto deb e lo installa make clean # rimuove i file temporanei

4.2.3 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`api`ucomuni 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). E` 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!

24https://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`oessere 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 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`uagevole 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’`ein 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 `ela possibilit`adi recuperare i file sorgente e di compilarli, in modo da ottimizzarne o personalizzarne le prestazioni (cosa che si pu`ofare con i pacchetti sorgente rpm e deb, ma `ela norma con il sistema 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 `esuddivisa in directory corrispondenti alle sezioni:

• main (software open source supportato da Canonical)

• universe (software open source mantenuto dalla comunit`a) • 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, `eposto 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`oottenere con apt-key list

Per importare una chiave dal keyserver di Ubuntu si pu`odare il comando sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key [keyid]

4.2.21 Altre cose utili

Con Debian/Ubuntu, si pu`o:

• 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`oessere 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`ousare 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`apoi avere righe come la seguente (ovviamente l’indirizzo IP sar`adiverso): deb http://192.168.1.3/ubuntu/ jaunty main restricted universe multiverse 52 5 Amministrazione

5.1 Gestione dei processi

5.1.1 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`a • gestione interattiva dei processi • programmi utili

5.1.2 Definizione di processo

Un processo `e,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 `eassociato un identificativo numerico, chiamato PID. Per visualizzare il PID della propria shell Bash, si pu`oimpartire il comando ps:

$ ps PID TTY TIME CMD 18945 pts/3 00:00:00 bash 19019 pts/3 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, `enoto qual `eil processo padre (detto PPID, Parent PID). Il rapporto gerarchico pu`oessere 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 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 e` %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`aallora una chiamata di sistema dela famiglia exec, con la quale il sistema sostituir`al’intera immagine di memoria con il file nominato nel suo primo parametro. Un semplice esempio:

#include int main(int argc, char **argv, char **envp) int child_pid = fork(); if (child_pid) { printf("Sono il padre, il PID di mio figlio e` %d.\n", child_pid); } else { printf("Dovrei eseguire cal\n"); static char *arguments[]={"cal"}; execve("/usr/bin/cal", arguments, envp); printf("Questa istruzione non verra` 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 `eil 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 `eil 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`ucorrettamente, 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`oessere 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`ovisualizzare 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 `elo 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 STAT TIME COMMAND 4449 tty4 Ss+ 0:00 /sbin/getty 38400 tty4 ... 5570 tty7 SL+ 0:00 /usr/bin/X :0 -br -audit 0 -auth /var/lib/gdm/:0.Xaut 5825 pts/0 Ss+ 0:00 bash 6611 pts/1 Ss 0:00 bash 7328 pts/1 R+ 0:00 ps a $ ps -a PID TTY TIME CMD 5570 tty7 00:00:00 Xorg 7329 pts/1 00:00:00 ps

5.1.13 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`oessere eseguita in background posponendo un ampersand alla fine del comando. Un lavoro (job) in background pu`oessere riportato in foreground con il comando fg. Il lavoro in foreground pu`oessere sospeso premendo ctrl-Z (^Z).

$ yes > /dev/null & [1] 7489 $ fg %1 yes > /dev/null

(ctrl-Z)

[1]+ Stopped yes > /dev/null $ bg %1 [1]+ yes > /dev/null &

5.1.15 Gli stati di un processo

Un processo pu`otrovarsi in uno dei seguenti stati:

D Uninterruptible sleep (usually IO) R Running or runnable (on run queue) S Interruptible sleep (waiting for an event to complete) T Stopped, either by a job control or because it is being traced. W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z 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 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`odigitare: kill -SIGHUP 9876 kill -HUP 9876 kill -1 9876

5.1.17 Segnali comuni

L’elenco completo dei segnali inviabili pu`oessere visualizzato con il comando kill -l. I segnali pi`uimportanti 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 `estato lanciato • lsof -p, per avere un elenco dei file utilizzati da un determinato processo

5.1.19 Gestione delle priorit`a

Ad ogni processo `eassociato un livello di priorit`a.

-20 (alta) 0 (normale) 19 (bassa) +------+------+

I programmi possono essere avviati con bassa priorit`a(da tutti) o con alta priorit`a(da root) tramite il comando nice Ai processi pu`oessere cambiata la priorit`acon il comando renice.

5.1.20 Gestione interattiva dei processi

Per una gestione interattiva dei processi, pu`oessere 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`adi 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 apposita- mente 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`a

5.2 Backup e compressione dati

5.2.1 Tipi di backup

Le strategie di backup possono essere diverse a seconda delle necessit`ae delle quantit`adi dati da gestire. Si suole distinguere tra le seguenti modalit`a:

• 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`udirectory.

$ 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 archivio.tar drwxr-xr-x loris/jasiu 0 2007-03-22 15:52 documenti/ -rw-r--r-- loris/jasiu 2297 2007-03-21 15:27 documenti/elencoutenti.txt -rw-r--r-- julie/jasiu 15853 2007-03-21 15:27 documenti/elencoservizi.txt lrwxrwxrwx loris/jasiu 0 2007-03-22 15:52 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`ainterattiva (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`oessere usato direttamente con i rispettivi filtri:

$ tar -cvzf archivio.tar.gz documenti # gzip $ tar -cvjf archivio.tar.bz2 documenti # bzip2 $ tar -cvZf archivio.tar.Z documenti # compress

$ file archivio* archivio.tar: POSIX tar archive archivio.tar.bz2: bzip2 compressed data, block size = 900k archivio.tar.gz: gzip compressed data, from Unix, last modified: Thu Mar 22 18:24:43 2007 archivio.tar.Z: compress’d data 16 bits

E` 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 `epossibile 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 `eutilizzabile con Linux attraverso i programmi zip e unzip, che permettono di avere una certa compatibilit`acon il mondo “windoze”. Da tenere presenti alcune differenze fondamentali nelle modalit`apredefinite:

• zip dereferenzia i link simbolici • zip non opera ricorsivamente

E` possibile per`oovviare con le opportune opzioni:

$ zip documenti.zip documenti # senza ricorsione adding: documenti/ (stored 0%)

$ zip -r documenti.zip documenti # i link simbolici vengono dereferenziati updating: documenti/ (stored 0%) adding: documenti/elencoutenti.txt (deflated 61%) adding: documenti/elencoservizi.txt (deflated 77%) adding: documenti/protocolli.txt (deflated 66%)

$ zip -ry documenti.zip documenti # i link simbolici non vengono dereferenziati updating: documenti/ (stored 0%) updating: documenti/elencoutenti.txt (deflated 61%) updating: documenti/elencoservizi.txt (deflated 77%) updating: documenti/protocolli.txt (stored 0%)

5.2.10 Cpio

Il programma cpio `ea 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`adi 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 # archiviazione 71 blocks

$ zcat struttura.cpio.gz | cpio -i # estrazione 71 blocks

5.2.11 Cpio (modalit`acopy-pass)

La modalit`acopy-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`adi un file, soprattutto dopo che esso `estato trasferito via rete o su un supporto rimovibile, pu`oessere importante. Per esso `econveniente 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`oessere utilizzato per diversi scopi. E` 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`oessere 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`oessere fatto con il programma dump, che permette backup interi e incrementali. loris@jasiu:~/Desktop/esperimenti/struttura$ dump -0uf boot.dump /boot DUMP: Date of this level 0 dump: Thu Mar 22 21:51:42 2007 ...... DUMP: Date of this level 0 dump: Thu Mar 22 21:51:42 2007 DUMP: Date this dump completed: Thu Mar 22 21:51:53 2007 DUMP: Average transfer rate: 4302 kB/s DUMP: DUMP IS DONE

Il ripristino va fatto con il comando restore.

5.2.16 Partimage

Partimage `eun programma interattivo che pu`ofare 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.

25http://www.faqs.org/rfcs/rfc1321.html

61 5.2.17 Backup su CD/DVD

A volte pu`oessere 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`ualto livello, si pu`opensare 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 `eil suo contenuto e procedere in una sorta di caccia al tesoro

5.3 Gestione degli utenti e dei gruppi

5.3.1 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:

26http://dvdisaster.net/en/ 27http://www.bacula.org 28http://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`ache 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`ufrequentemente 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 ) • 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`ufrequentemente le password, se utilizzate, vengono memoriz- zate 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. E` 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

E` in genere poco raccomandabile modificare manualmente i file contenenti i dati relativi agli utenti e ai gruppi. In genere `epreferibile:

• 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 `ebasato sul pattern cognome-nome. Se un utente si chiama Aldo Bianchi andranno evitati bianchia, bianchi.a, bianchialdo, bianchi.aldo, bianchi aldo, ecc. Andr`ainvece 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-e- cognome29.

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.

29http://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, `esufficiente effettuare il lock della password (usermod -L ); l’unlock viene effettuato con usermod -U .

5.4 Gestione delle quote disco

5.4.1 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 `enecessario agire sul file /etc/fstab. Ad esempio, potrebbe essere presente una voce come

/dev/hdc0 /home/users ext3 defaults,usrquota,grpquota 0 0

Pi`uavanti vedremo un esempio su un disco fittizio che possiamo usare per delle prove.

5.4.2 Concetti importanti relativi alle quote disco

E` 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`overificare qual `ela situazione del singolo utente o gruppo.

$ quota Disk quotas for user loris (uid 1000): Filesystem blocks quota limit grace files quota limit grace /dev/loop1 3516* 3000 4000 6days 2 0 0

$ sudo quota -u jackie Disk quotas for user jackie (uid 2000): Filesystem blocks quota limit grace files quota limit grace /dev/loop1 1005* 1000 1500 7days 1 0 0

(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`oabilitare 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 `eattivato 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... [ OK ] * Turning on quotas... [ OK ] $ sudo /etc/init.d/quota stop * Turning off quotas... [ 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. E` 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 soft hard inodes soft hard /dev/loop1 3516 3000 4000 2 0 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`aattualmente impegnate.

5.4.7 Il comando Setquota

Il comando setquota permette di impostare gli stessi limiti di edquota, ma senza interattivit`a:

$ 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`oessere 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`oavere 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, `epossibile creare un file su disco che verr`aconsiderato 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 `e 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`oessere innestato in una directory vuota con il comando mount.

$ sudo mount -o loop /home/discoq # l’opzione -o loop e` necessaria perche´ in questo caso si tratta di un file

Se per il file system `eabilitato 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´ei file sono vuoti. Dopo l’inizializzazione, non lo sono pi`u:

$ 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`oottenere 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 Autorizzazioni e deleghe

5.5.1 Permessi sui file

Un primo importante livello di autorizzazioni `equello 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 `eimpostabile 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 `epossibile 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`adell’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`aa nastro • cdrom: Usare le unit`aCD-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`oimpersonare 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 #

$ su -l Password: # pwd /root

70 5.5.5 Su -c

Tramite il programma su `epossibile 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`edi eseguire un programma che non potrebbe altrimenti eseguire) predisposta per lui da root. I vantaggi:

• `epossibile delegare un utente a fare alcune operazioni e non altre

• non `enecessario 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” `e /etc/sudoers. E` 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`osapere 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`oessere 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: john : TTY=ttyp5 ; PWD=/tmp ; USER=root ; COMMAND=/bin/cat /tmp/rootfile.txt

5.5.11 Sudo e ridirezione dell’output

Se si vuole scrivere in una directory in cui non si hanno permessi di scrittura si pu`osfruttare 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`a append):

$ date | sudo dd of=/root/operazioni.txt conv=notrunc oflag=append 2>/dev/null

5.5.12 Fakeroot

Pu`ocapitare che alcuni programmi richiedano permessi di root per svolgere alcune operazioni legate alla mani- polazione dei file. L’esempio tipico `equello 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 `edi 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 proprieta` -rw-r--r-- 1 charlie studenti 93 2009-07-21 07:22 bashrc charlie$ fakeroot # divento root (ma e` 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`a append • i: il file `eimmodificabile e non pu`oessere 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 `einnestata (mounted) con l’opzione acl, su di essa `epossibile operare usando delle access control list per consentire di specificare in maniera pi`ugranulare 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 e` un documento di Alice. Ma anche Bob deve poterlo leggere.

Alice pu`oaggiungere 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`aquindi leggere il documento: bob$ cat documento.txt Questo e` 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::rw- user:bob:r-- group::--- mask::r-- other::--- 73 Pu`oessere comoda anche una visione tabulare: alice$ getfacl --tabular documento.txt # file: documento.txt USER alice rw- user 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 `e: charlie$ id uid=1007(charlie) gid=1014(studenti) groups=1014(studenti) charlie$ cat documento.txt cat: documento.txt: Permission denied

Perch´equesto avviene? I bit standard riservati al gruppo vengono usati per indicare i permessi massimi consentiti dalle ACL agli utenti (mask).

5.5.17 Ereditariet`adelle ACL

E` 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 `enecessario 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`oovviare 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 # backup delle ACL (con ricorsione) $ sudo setfacl --restore=ACLs.txt # ripristino delle ACL

5.5.19 PolicyKit

(rinvio) Un sistema pi`ugranulare di autorizzazioni, soprattutto legate all’uso in ambiente desktop, `equello previsto dal progetto PolicyKit30.

30http://hal.freedesktop.org/docs/PolicyKit/

74 5.6 Init e il processo di avvio

5.6.1 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), atti- vazione 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/Fedo- ra/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 `edifferente (sotto RedHat `epi`udettagliata)

• Ubuntu, a partire dalla versione 7.04 Feisty, ha adottato un modello alternativo, basato su eventi, deno- minato , compatibile ma di impostazione diversa

5.6.4 I bootloader

I due bootloader (caricatori del sistema operativo) pi`ucomunemente usati con Linux sono LILO (Linux Loader) e GNU GRUB (GRand Unified Bootloader):

• il file di configurazione di LILO `e /etc/lilo.conf ; perch´ele modifiche abbiano effetto, bisogna impartire il comando lilo • il file di configurazione di GRUB `e /boot/grub/menu.lst; le voci di men`upossono essere modificate all’avvio (ad esempio con l’aggiunta di parametri) ed `ea disposizione una piccola shell.

75 5.6.5 Configurazione di init

Il file di configurazione di init `e /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`amanutenzione 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 `eil runlevel corrente si pu`oimpartire il comando runlevel (che mostra anche il runlevel precedente, oppure N se questo `eassente).

$ runlevel N 2

Per passare da un runlevel ad un altro si pu`ousare 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 [ OK ] $ sudo /etc/init.d/apache2 reload * Reloading web server config apache2 [ OK ] $ sudo /etc/init.d/apache2 restart * Restarting web server apache2 [ OK ] $ sudo /etc/init.d/apache2 stop * Stopping web server apache2 [ 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 `edeterminato 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`uun numero che indica la priorit`a(utile se si vuole garantire che un determinato servizio parta solo dopo un altro).

$ ls /etc/rc2.d/ K74bluetooth S11klogd S20hotkey-setup S20samba S89anacron S99rc.local README S12dbus S20incron S22consolekit S89atd S99rmnologin S05vbesave S12hal S20makedev S23ntp S89cron S99stop-readahead S10acpid S16ssh S20nvidia-kernel S24avahi-daemon S91apache2 S10powernowd.early S19cupsys S20postfix S24dhcdbd S98usplash S10sysklogd S20apmd S20powernowd S30gdm S99acpi-support S10xserver-xorg-input-wacom S20apport S20rsync S65firestarter S99laptop-mode 76 5.6.9 Configurazione dei runlevel

La configurazione dei runlevel pu`oessere 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`oessere 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`ovedere 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`adi 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: 2 3 4 5 # Default-Stop: 0 1 6 ### END INIT INFO

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`adi 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 # spegne il sistema immediatamente $ sudo shutdown -r now # riavvia il sistema dopo averlo spento $ sudo shutdown -t 10 # 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 Inetd e Xinetd

5.7.1 Servizi, d´emonie 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´emone (daemon) si intende un programma che `ein esecuzione continua in background, in attesa di richieste di attivazione da parte di qualche cliente. I servizi possono essere implementati:

• come d´emoni(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. 31http://www.initng.org 32http://developer.apple.com/MacOsX/launchd.html 33http://www.sun.com/bigadmin/content/selfheal/smf-quickstart.jsp 34http://upstart.ubuntu.com 35http://kyuba.org/kyuba 78 5.7.2 Il superdemone

Ad occuparsi dell’invocazione dei processi serventi, quando necessario, `eun super-d´emone, che rimane in ascolto “per conto terzi”. Questo super-d´emone`e,a seconda della distribuzione/configurazione, inetd oppure xinetd. Concettualmente, i due superdemoni sono simili. La differenza sta in una configurazione pi`uprecisa che si pu`o avere con il secondo (non a caso: la x sta per extended). La configurazione `e:

• 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´emone

La configurazione di un servizio stand-alone (nell’esempio, swat) pu`oessere 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 = no only_from = 127.0.0.1 user = root server = /usr/sbin/swat log_on_failure += USERID }

5.7.4 TCP wrappers

E` possibile configurare da quali host `epossibile la connessione a servizi gestiti dal super-d´emone(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 Kernel, gestione, configurazione e compilazione

5.8.1 Kernel monolitici vs. kernel modulari

Un kernel (nucleo del sistema operativo) pu`oessere 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´eci`ogarantisce una maggior flessibilit`a. 79 5.8.2 Che kernel sto usando?

Per sapere qual `eil kernel in uso si pu`ousare 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 modules.pcimap net/ extra/ modules.alias modules.inputmap modules.seriomap ubuntu/ initrd/ modules.ccwmap modules.isapnpmap modules.symbols volatile/ kernel/ modules.dep modules.ofmap modules.usbmap

Nella maggior parte dei casi, i moduli vengono caricati automaticamente quando necessario. In casi di particolari necessit`a,pu`oessere 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 Size Used by vesafb 8964 0 wlan_tkip 13568 0 aes_i586 33536 0 geode_aes 7176 0 blkcipher 8324 1 geode_aes aes_generic 27712 0 wlan_ccmp 9600 0 af_packet 23812 0 binfmt_misc 12808 1

80 5.8.6 Caricamento di un modulo

I moduli possono essere caricati direttamente con insmod, che per`onon 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`ofallisce 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: /lib/modules/2.6.24-16-generic/kernel/fs/msdos/msdos.ko description: MS-DOS filesystem support author: Werner Almesberger license: GPL srcversion: 4BF2299125E22266BA734C0 depends: fat vermagic: 2.6.24-16-generic SMP mod_unload 586

5.8.9 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 `eun 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 `enecessario 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 `edisponibile nei Linux Kernel Archives36. Sono molte le patch rese disponibili da programmatori e aziende di tutto il mondo. Il kernel ufficiale, senza queste patch, `edetto 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’`eancora 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, `econsigliabile 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)

36http://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`oessere utile:

• copiare il catalogo della localizzazione in italiano37 • dare un’occhiata ad una guida che spiega nel dettaglio le voci pi`uinteressanti, come quella di sevencapi- talsins38

• 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 `eandato 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`a

5.8.17 Compilazione Debian-way e Fedora-way

Compilazione ed installazione sono resi pi`usemplici 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`aun nuovo kernel installato e selezionabile dal men`udi grub, e che potr`aessere disinstallato come qualsiasi altro pacchetto.

$ dpkg --list | grep ’linux.*versione0’ ii linux-headers-2.6.24.3-versione0 ~0.00 Header files related to Linux kernel, specifically, ii linux-image-2.6.24.3-versione0 ~0.00 Linux kernel binary image for version 2.6.24.3-versione0

Qualcosa di analogo si pu`ofare con Fedora40.

37http://massimo.solira.org/pcikl/download.html 38http://sevencapitalsins.wordpress.com/kernel 39http://en.wikiversity.org/wiki/Reading the Linux Kernel Sources 40http://www.howtoforge.com/kernel 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`ocos`ı 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 Configurazione di rete

6.1.1 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`oessere 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`oaiutare nei calcoli necessari alla gestione degli indirizzi IP:

$ ipcalc 192.168.1.12/19 Address: 192.168.1.12 11000000.10101000.000 00001.00001100 Netmask: 255.255.224.0 = 19 11111111.11111111.111 00000.00000000 Wildcard: 0.0.31.255 00000000.00000000.000 11111.11111111 => Network: 192.168.0.0/19 11000000.10101000.000 00000.00000000 HostMin: 192.168.0.1 11000000.10101000.000 00000.00000001 HostMax: 192.168.31.254 11000000.10101000.000 11111.11111110 Broadcast: 192.168.31.255 11000000.10101000.000 11111.11111111 Hosts/Net: 8190 Class C, Private Internet

6.1.3 Interfacce di rete

Le interfacce di rete ethernet sono di norma indicate come eth0, eth1, ecc. L’interfaccia wireless `eindicata 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.

41http://it.wikipedia.org/wiki/IPv4 84 6.1.4 Gestione interfacce

E` 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 `ememorizzata nei file della directory /etc/sysconfig/network- scripts (sistemi RedHat/Fedora) o nel file /etc/network/interfaces (sistemi Debian/Ubuntu).

6.1.5 Gestione indirizzo gateway

E` possibile visualizzare (e modificare) l’indirizzo del gateway di default tramite il programma route.

$ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 * 255.255.255.0 U 0 0 0 ath0 link-local * 255.255.0.0 U 1000 0 0 ath0 default . 0.0.0.0 UG 100 0 0 ath0

La modifica pu`oavvenire 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`oconsultare la tabella ARP:

$ arp -n Address HWtype HWaddress Flags Mask Iface 192.168.0.5 ether 00:15:f2:70:0f:4a C wlan0 192.168.0.1 ether 00:0c:f6:39:8e:da C wlan0

6.1.7 Ip

Il modo pi`umoderno per operare sull’infrastruttura IP della propria macchina `etramite il programma ip, che consente di gestire interfacce di rete, rotte, ecc.

$ ip addr show [...] 4: wlan0: 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`acon cui ad un nome di dominio pienamente qualificato viene fatto corrispondere un determinato indirizzo IP `edetta risoluzione del nome. Essa avviene basandosi su un file di testo (/etc/hosts) presente sulla macchina, oppure interrogando un name- server (server DNS), indicato nel file /etc/resolv.conf. L’ordine di ricerca `especificato nel file /etc/nsswitch.conf.

85 $ cat /etc/nsswitch.conf

[...] hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 networks: 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`a

Esistono innumerevoli programmi di utilit`ache 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`a:apparentemente, nmap43 `eil programma pi`uusato per la rappresentazione delle attivit`adi 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 Foreign Address State tcp 0 0 192.168.0.100:39261 209.85.135.18:443 TIME_WAIT tcp 0 0 192.168.0.100:37817 210.84.125.17:443 ESTABLISHED

E` 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 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 :::80 :::* LISTEN

42http://avahi.org 43http://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`usemplice di un modem seriale pu`oessere fatta con il programma wvdialconf e le connessioni possono essere avviate con il programma wvdial. Altrimenti, si pu`ousare 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, `esufficiente 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, `epossibile la configurazione di molti aspetti relativi all’ambiente di rete tramite interfaccia grafica. E` 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`o 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 Clienti di rete

6.2.1 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`oinoltre 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`ufamoso `e 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`oavvenire con i classici browswer grafici. Vale la pena di segnalare per`oanche:

• 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`otornare utile per automatizzare operazioni su web (con degli script).

6.2.5 Clienti Telnet, SSH ecc.

E` possibile naturalmente accedere a sistemi remoti con il classico programma telnet o con il pi`usicuro ssh.

6.2.6 Accesso da sistemi Windows

Se si `ecostretti ad usare un sistema Windows, `epossibile 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 data- grammi UDP ed `ealtamente configurabile. Ad esempio, per avere informazioni sulla data di ultima modifica di un certo documento su web, si pu`oimpartire 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 Posta elettronica

6.3.1 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 `egenerata 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 `epresente la casella di posta del destinatario)

• MUA (Mail User Agent), il programma usato effettivamente dall’utente per gestire la propria corrispon- denza 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 44http://www.chiark.greenend.org.uk/ sgtatham/putty/ 45http://www.winscp.net 46sourceforge.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`oessere 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`oessere configurato per rifiutare/respingere messaggi con determinati contenuti, riscrivere intestazioni, ecc.

6.3.4 Mail User Agent

E` 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`ocapitare 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, `enecessario recuperare la posta esternamente, direttamente con un MUA (se supporta questa funzionalit`a)o con un programma specifico, che pu`oanche gestire caselle multidrop (l’idea `eche 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`ascaricata” al MUA). Pu`oessere 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`oessere gestita in maniera pi`uo 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 `e 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 `ecomunque possibile, per l’utente, leggerli lasciandoli l`ı)

• /mbox: `eil file in cui i messaggi letti vengono spostati dopo essere stati letti tramite il comando mail • /mail: `ela directory che contiene i messaggi di posta gestiti da programmi come pine o kmail • /Mail: `ela directory che contiene i messaggi di posta gestiti da mutt (ma l’impostazione pu`oessere 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 -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, `esimile a MH, ma gestisce tre ulteriori sottodirectory (cur, tmp, new) e nomi di file per i singoli messaggi si cui `egarantita l’unicit`a(utile in ambienti condivisi)

I MUA inoltre introducono spesso, per ottimizzare le prestazioni, dei file indice nascosti (.inbox.index, .in- box.index.ids, .inbox.index.sorted). Inoltre, si deve tenere presente che con il formato maildir una cartella ne pu`ocontenere un’altra (e si avr`aquindi anche .nomecartella.directory).

6.3.9 Procmail

Procmail pu`oessere 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`a(le virgolette sono comprese):

"| exec /usr/bin/procmail"

Nella home directory dell’utente sar`apoi presente il file di configurazione .procmailrc, che conterr`ale regole da applicare ai messaggi in ingresso.

91 6.3.10 Esempio di .procmailrc (1)

Il file `eunico: qui viene mostrato in pi`uparti 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´estante, 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 `einformato 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`oessere analizzato con il programma mailstat:

$ mailstat log

Total Number Folder ------396 1 /dev/null 43453 2 gzip >> $IMPURI/impuri.gz 696 1 /home/loris/mail/delivery/ 381 1 /home/loris/mail/julie 2638 2 /var/mail/loris ------47564 7

6.3.15 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 Servizi di rete

6.4.1 Nota preliminare

Questa sezione `ein via di sviluppo. Se e quando sar`anecessario, la aggiorner`ocon 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`ufamosi MTA nel mondo Un*x sono:

• sendmail • postfix • exim

Alcune cose importanti da sapere:

• cosa sono gli alias • cos’`euno smart host • cosa sono i file .forward 93 6.4.3 Configurazione di Postfix

Per una configurazione basilare di Postfix, pu`oessere 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`ousare 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`oessere poi necessario impostare un nome del dominio gestito nel file /etc/mailname.

6.4.6 Servizi importanti: Apache web server

Il server web pi`udiffuso in assoluto `e Apache.

6.4.7 Servizi importanti: Network File System (lato server)

La condivisione in rete di directory pu`oessere 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 *.local(rw,sync,no_subtree_check) /home/exported/readable *.local(ro,sync,no_subtree_check)

6.4.8 Servizi importanti: Network File System (lato client)

Sul client, l’accesso alla directory condivisa avviene con un’operazione di innesto (mount). Tipicamente, si aggiunger`auna riga simile alla seguente al file /etc/fstab: nfsserver.local:/home/exported/writable /home/remote/writable nfs rw,lock,cto,actimeo=3600 0 0 nfsserver.local:/home/exported/readable /home/remote/readable nfs ro,lock,cto,actimeo=3600 0 0 94 6.4.9 Servizi importanti: Samba

Il “colloquio” con sistemi Windows pu`oavvenire 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 Log e gestione degli eventi

6.5.1 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 `e /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`adelle registrazioni di log

Le registrazioni effettuate nei file di log sono associate ad uno dei seguenti livelli di priorit`a:

• emerg (sistema inutilizzabile)

• alert (si deve intervenire al pi`upresto) • 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`adi log

Il file /etc/syslog.conf contiene l’indicazione di dove registrare i messaggi di una determinata facility con una particolare priorit`a. Ad esempio, righe di questo genere daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log indicano che i messaggi relativi alle facility daemon e kernel, di qualsiasi priorit`a(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`a. 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, `epossibile monitorare le registrazioni di log tramite xconsole, tramite il comando xconsole -file /dev/xconsole &. Si pu`odeterminare quali registrazioni far comparire sull’xconsole impostando il file /etc/syslog.conf con |/dev/xconsole per le facility/priorit`adesiderate.

96 6.5.9 Lastlog

Pu`oessere utile sapere quando `estato fatto l’ultimo login da un determinato utente. Quest’informazione si pu`o ottenere con il comando lastlog.

$ lastlog --user loris Nome utente Porta Da Ultimo accesso loris tty1 dom mar 30 22:39:19 +0200 2008 $ lastlog --user dino Nome utente Porta Da Ultimo accesso alice pts/4 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 `eaffidata 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 `equella 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 Netfilter e Iptables

6.6.1 Tra noi e il mondo

Figura 7: Schema di rete

Un calcolatore con il sistema operativo Linux pu`ooperare 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`oagire da router facendo transitare i pacchetti dall’una all’altra. Allo scopo, `enecessario 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`o:

• 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`asono 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`a),il source NAT viene chiamato masquerading. Quando ce n’`ebisogno, nei pacchetti viene alterato anche il numero della porta (PAT, Port Address Translation).

6.6.4 Source NAT / PAT connessioni TCP viste connessioni TCP viste all’esterno 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 connessione TCP vista all’esterno 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 | ‘------’ 47http://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`obasare:

• 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 `ela componente del kernel che si occupa del transito dei pacchetti IP. Iptables `eil 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)

48http://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 `epossibile iniziare ad esercitarsi. Una lettura di iptables(8) `equanto 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`oessere “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 `ebloccata 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 Samba

6.7.1 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`osoprattutto 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`oimpartire 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`oimpartire 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`oimpartire il comando: sudo pdbedit -P "min password length" -C 8

6.7.6 Pdbedit - obbligo cambio password

Per impostare per l’utente mario l’obbligo di cambiare la password al primo accesso si pu`oimpartire il comando: sudo pdbedit -u mario --pwd-must-change-time 0

7 Scripting

7.1 Personalizzazione dell’ambiente di shell

7.1.1 Variabili e valori

Le variabili sono dei contenitori di valori. Nella bash si possono assegnare valori alle variabili in maniera molto semplice. Bisogna per`oricordarsi 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 `estato ereditato in quest’ultima:

$ NOME=mario # quando si assegna un valore non bisogna mettere uno spazio prima dell’uguale! $ echo Nella shell $$ NOME e` $NOME Nella shell 10076 NOME e` mario $ bash $ echo Nella shell $$ NOME e` $NOME Nella shell 10234 NOME e`

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 `eunidirezionale (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 e` $NOME Nella shell 10076 NOME e` mario $ bash $ echo Nella shell $$ NOME e` $NOME Nella shell 10340 NOME e` mario

7.1.4 Variabili d’ambiente

Le variabili d’ambiente sono disponibili per i processi figli. Molte variabili si trovano gi`apreimpostate (grazie ai file di configurazione). Per vedere il valore delle variabili correntemente impostate, si pu`ousare 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`ocapitare di voler accedere solo a parte di variabile (una sottostringa). La cosa `efattibile 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`urighe) 3. PS3 (usato per la gestione dei men`ucon 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, piu` ora corrente intro-linux (15:16:37)$

$ PS1=’\d \u \$ ’ # data corrente, piu` 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 `eusata per specificare in quale directory devono essere cercati gli eseguibili. Ad esempio, si pu`oimpostare 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`apossibile eseguire gli script della directory corrente senza dover digitare ./ prima del nome del file (non che questo sia raccomandabile, per`o).

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`oessere 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

E` 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

E` 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`ocostituire un wrapper per un comando builtin. All’interno della definizione della funzione, si dovr`ausare 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`acercato 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 `el’ambiente?

Un programma pu`osapere quali sono le variabili d’ambiente impostate. Il prototipo di un programma C potrebbe essere questo:

#include 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`oessere eseguito in un ambiente modificato (eliminando alcune delle o tutte le variabili d’am- biente):

$ 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 `eanche 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 `epossibile 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 Introduzione allo scripting bash

7.2.1 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 int main(int argc, char **argv)

printf("Hello, world!\n"); return 0; }

7.2.2 Utilizzo del codice di uscita

Dalla shell si pu`osapere qual `eil 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 http # WorldWideWeb HTTP https 443/tcp # http protocol over TLS/SSL https 443/udp $ echo $?

$ 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`asi 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`usemplice 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`oessere effettuato mostrando passo l’istruzione che verr`aeseguita (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 `equello di scrivere script” (Mendel Cooper, autore della Guida avanzata di scripting Bash49)

7.3 Grep, Sed, Gawk e altri utili filtri

7.3.1 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 49http://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 e` 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 e` 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 e` 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`udi 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 # fidonet EMSI over TCP # Local services

==> /etc/protocols <== sctp 132 SCTP # Stream Control Transmission Protocol fc 133 FC # Fibre Channel 110 Notare che l’opzione abbreviata -2 funziona con head ma non con tail. Il programma tail pu`ofunzionare 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 gif image/jpeg jpeg jpg jpe image/png png image/tiff tiff tif image/x-ms-bmp bmp image/x-photoshop psd $ 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

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`edi pagina.

$ cat testo.txt \:\:\: I filtri \:\: Un filtro software e` un programma che trasforma dati in base a criteri predeterminati. \: Filtro (wikipedia) $ nl testo.txt

I filtri

1 Un filtro software e` un 2 programma che trasforma 3 dati in base a criteri 4 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 t o nl a nl c a p o nl 0000015 $ od -t c testoacapo 0000000 t e s t o \n a \n c a p o \n 0000015 111 $ od -t x1 testoacapo 0000000 74 65 73 74 6f 0a 61 0a 63 61 70 6f 0a 0000015 $ od -t x4 testoacapo 0000000 74736574 0a610a6f 6f706163 0000000a 0000015

7.3.9 Paste

Il programma paste accosta le linee corrispondenti di uno o pi`ufile.

$ 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`edi pagina.

$ cat testolungo.txt | fmt -w 30 | pr -l 12 -W 30 -h "Documento sui filtri software"

7.3.11 Uniq e Wc

Il programma uniq elimina righe duplicate adiacenti; per questo motivo `espesso usato dopo sort. Il programma wc conta i caratteri, le parole e le righe.

$ getent passwd | cut -d: -f7 | sort | uniq # quali sono le shell impostate /bin/bash /bin/false /bin/sh /bin/sync /usr/sbin/nologin

$ 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 `eanche possibile contare le righe in cui c’`ela 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`oche 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‘`eil numero di secondi dall’epoch, ma potremmo desiderare dei valori pi`ucomprensibili:

$ 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`ucomune 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`oselezionare 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 Vim, l’editor di riferimento

8.1.1 Introduzione a VIM

VIM, o VI improved, `eun 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 `el’unico editor che `epresente in praticamente tutte le versioni di Unix e Linux, ed `espesso impostato come editor di default per le operazioni di amministrazione. Caratteristica importante di Vi `eche si tratta di un programma che opera in base alla modalit`acorrente: la pressione dello stesso tasto ha significati diversi a seconda del contesto operativo.

8.1.2 Le basi

Si pu`oiniziare 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`oessere 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`oessere 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, , , {, }, 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()); AB

Si pu`outilizzare questo fatto per “tagliare” il testo selezionato automaticamente selezionato con c%.

8.1.5 Modalit`avisuale

Le operazioni di selezione possono essere fatte in maniera agevole e chiara nella modalit`avisuale (a carattere con v, a linea con V, a blocco con -V.

8.1.6 Macro e registri

Si pu`oregistrare 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`o 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 +, rispetti- vamente. Ad esempio, per copiare due righe come selezione primaria si pu`odigitare "*2yy (il contenuto della selezione primaria `ereso disponibile nelle altre applicazioni Xwindow premendo il pulsante centrale del mouse).

8.1.8 Modalit`a last-line

La modalit`a last-line `equella in cui si impartiscono comandi complessi che necessitano di parametri da specificare (es. ricerche di testo, sostituzioni, impostazione opzioni). In modalit`a last-line vale una history locale.

8.1.9 Ricerche

Le ricerche (basate sulle espressioni regolari) possono avvenire:

• in modalit`a last-line (in avanti, es. /void, oppure in indietro, es. ?void) • in modalit`acomando (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`a 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`odividere orizzontalmente (:split) o verticalmente (:vsplit). Per passare da una sottofine- stra all’altra si deve premere due volte -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`adi lavoro) 117 8.1.14 Altre cose utili (1)

Varie cose che possono tornare utili:

• :cmap :w (mappatura di comandi) • :iab perche’ perche´ (sostituzione di caratteri) • -A (incrementa numero) • -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`ufile 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`adi VIM, si pu`oconsultare la guida in linea:

• :help • :help (aiuto su argomento) • :help! (aiuto in casi disperati)

9 Sicurezza

9.1 Codice in materia di protezione dei dati personali

9.1.1 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`adi 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`a

E` 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’i- dentificazione. Particolare importanza e necessit`adi tutela hanno i dati sensibili e quelli giudiziari. (vedi art. 4)

50http://tinyurl.com/leggeprivacy 118 9.1.4 Sanzioni

Un’organizzazione che non rispetta la normativa `esoggetta 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’hard- ware 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`ada 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

E` 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 Sicurezza informatica

9.2.1 Sicurezza informatica

Cosa si intende per sicurezza informatica? In genere, si fa riferimento a questi aspetti:

• confidenzialit`a o riservatezza (accesso in maniera esclusiva alle informazioni) • integrit`a (garanzia che i dati non siano stati alterati da chi non doveva) • disponibilit`a (possibilit`aeffettiva 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`a (impossibilit`adi sottrarsi alla responsabilit`a) • interoperabilit`a (semplicit`anella comunicazione tra applicazioni)

• coerenza delle informazioni (detta a volte, erroneamente, consistenza) • manutenibilit`a del software (possibilit`adi apportare modifiche) • accessibilit`aai 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 sicu- rezza52, 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`oa cui si punta `eun sistema ragionevolmente sicuro. Per ogni problema individuato, `epossibile:

• 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`a • 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.)

51http://tinyurl.com/leggeprivacy 52http://it.wikipedia.org/wiki/Documento programmatico sulla sicurezza 53http://it.wikipedia.org/wiki/ISO 27001 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`a(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 `eparticolarmente 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’`e ci`oche 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 `ecos`ı 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`oessere 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`adei dati si pu`oricorrere alla crittografia, che pu`oessere 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`ufacilmente gestibili che con altri sistemi operativi. 54http://it.wikipedia.org/wiki/Biometria 123 9.2.17 Sicurezza logica - Sicurezza di rete

La sicurezza di rete pu`oessere 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`uvulnerabile, soprattutto perch´enon 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`ucomune `eil phishing).

9.3 Sicurezza e GPG

9.3.1 GPG

Il programma standard usato per la crittografia privata `e GPG (GNU Privacy Guard), implementazione libera di PGP. GPG offre funzionalit`adi cifratura a chiave simmetrica e a chiave pubblica.

9.3.2 Cifratura simmetrica

Per cifrare un documento si pu`outilizzare 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`oessere utile avviare rngd -r /dev/urandom al fine di non incappare nel problema della mancanza di un numero sufficiente di valori casuali. Questo per`o solo a scopo di test/esercitazione, visto che /dev/random non `evalida 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 = key expires in n days w = key expires in n weeks m = key expires in n months 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) "

Real name: Bob Email address: [email protected] Comment: You selected this USER-ID: "Bob "

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`adei 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 `estato creato:

55https://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 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 " 1024-bit DSA key, ID 0488EA60, created 2009-05-16

$ ls miodocumento.txt miodocumento.txt.gpg

9.3.10 Firma in file separato

Se lo si desidera, la firma pu`oconsistere 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`oessere 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 "

Nel caso di un file che incorpora documento e firma, il documento pu`oessere 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 " $ 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 "

126 9.3.13 Cifratura per un particolare destinatario

Per cifrare un documento in modo che possa essere letto solo da un particolare destinatario, `enecessario 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 `ela combinazione del nome e del commento (quest’ultimo tra parentesi).

9.3.14 Decifrazione del contenuto da parte del destinatario

Il legittimo destinatario pu`ousare 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 " 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 "

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) " 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`oessere ottenuto con l’opzione --list-keys:

$ gpg --list-keys /home/bob/.gnupg/pubring.gpg ------pub 1024D/0488EA60 2009-05-16 uid Bob sub 1024g/42257BFD 2009-05-16 pub 1024D/65BC13ED 2009-05-16 uid Alice (Ufficio Acquisti) sub 1024g/D67E74AF 2009-05-16

9.4 Sicurezza e SSH

9.4.1 SSH

SSH `eun 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 `esufficiente 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`adella 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

E` possibile specificare un comando da eseguire sul calcolatore remoto: ssh utente@hostname ls

9.4.5 Autenticazione senza password

Un utente pu`ogenerare 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`a). 128 9.4.6 Autenticazione senza verifica chiave host

In alcune situazioni, pu`oessere necessario evitare che venga chiesta la conferma dell’autenticit`adella controparte (ad esempio, nel caso di host il cui indirizzo IP `eottenuto via DHCP). Si pu`odisabilitare 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`omodificare il proprio file ~/.ssh/config con il seguente contenuto:

Host *.local StrictHostKeyChecking no UserKnownHostsFile=/dev/null

Ovviamente, il rischio `edi essere soggetti ad attacchi di tipo Man in the middle.

10 Basi di dati

10.1 MySQL

10.1.1 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 `enecessario 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`oessere 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 `einterna a phpMyAdmin e viene memorizzata nella tabella pma_table_info. 129 10.1.4 Stored procedures - Funzioni (creazione)

E` 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 `eequivalente 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, `enecessario dichiarare gli appositi parametri, preceduti dall’in- dicazione 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, `enecessario 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 `equello 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`adi residenza, tramite chiamate simili a questa:

CALL AddFriendWithCity(’Giulio’, ’Udine’); CALL AddFriendWithCity(’Alice’, ’Treviso’);

Deve essere la procedura a verificare se la citt`a`egi`apresente 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`oscrivere 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`oessere 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 `edi inserire in una nuova tabella l’id, il nome e la citt`adegli 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.city_id = cities.id;

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 [ OK ]

10.2.4 Creazione di un utente e di un database

sudo -u postgres createuser -D -A -P mynewuser # (-A non e` documentato, ma evita che venga chiesto # "Shall the new role be a superuser? (y/n) n"

sudo -u postgres createdb -O mynewuser mydatabase

11 X Window e GNOME

11.1 Il sistema grafico XWindow

11.1.1 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 `e,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`oavviare:

• 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`oavvenire:

• 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`ofare 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, `esufficiente usare il fissamaiuscolo e il tasto con la lettera accentata minuscola (in questo modo `efacile ottenere caratteri come E`E´A`O`I`) • 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`o“incollare” in un’altra applicazione senza averla prima copiata: `esufficiente 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`ofar terminare graficamente con il comando xkill • uno script bash pu`outilizzare 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`oprovare 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`oricorrere 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`oinstallare e usare il programma tdfsb.

56http://www.linuxjournal.com/article/7298 57http://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`oessere 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 GNOME, l’interfaccia standard di Ubuntu

11.2.1 GNOME

GNOME (GNU Network Object Model Environment) `eil 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`opartire, ad esempio, da Customize your Ubuntu GNOME theme58.

11.2.3 Aree di lavoro e finestre

Il Desktop di GNOME `ediviso 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`ospostare una finestra tenendo premuto il tasto alt.

11.2.4 Tastiera e caratteri speciali

Se si ha la necessit`adi inserire in un testo caratteri speciali (ad esempio, una ¨ı, oppure una ł) GNOME ci mette a disposizione diverse possibilit`a:

• usare la Tabella caratteri (men`u 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 58http://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`osfruttare 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`opremere compose e poi e i.

11.2.7 Esempi di composizione

La tabella completa delle composizioni disponibili `edisponibile in:

• GtkComposeTable59 • Linux Compose Key Sequences60.

Particolarmente comodo `e:

• 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 ).

1 3 • usare le sequenze 1 e 2 per ottenere 2 , 3 e 4 per 4 , 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`oprocedere 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.

59https://help.ubuntu.com/community/GtkComposeTable 60http://www.hermit.org/Linux/ComposeKeys.html 136 11.2.10 Nautilus

Nautilus `ela 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`a:

• 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`ucontestuale, oltre che facendo clic con il pulsante destro e scegliendo la voce “Crea collegamento”

• la cartella Modelli pu`ocontenere 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, anno- tazioni, ecc. Tali informazioni vengono memorizzate in appositi metafile, in formato XML, nella directory .nautilus dell’u- tente, non nella directory stessa.

11.2.12 Editor di configurazione

Il comando gconf-editor lancia l’editor di configurazione di GNOME, con il quale `epossibile 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`ue 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`uessere 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`adi visualizzazione dei permessi

I permessi su file e directory vengono normalmente visualizzati in modalit`asintetica. Questa impostazione si pu`ocambiare con il comando gconftool-2 --type bool --set /apps/nautilus/preferences/show_advanced_permissions True

La modalit`apredefinita pu`oessere 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 `eun programma che permette di ottenere accattivanti effetti grafici sul proprio desktop. Per usarlo `enecessario impostare (men`u Sistema/Preferenze/Aspetto/Effetti visivi) la modalit`a“Aggiuntivi”, altrimenti alcuni efetti non funzionerebbero. Gli effetti specifici da attivare devono essere impostati tramite la voce di men`u Sistema/Preferenze/Gestore configurazione CompizConfig (tenere presente che il tasto super `equello, 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`opassare da un’applicazione all’altra.

11.2.17 Compiz - finestre tremolanti

Uso di Finestre tremolanti.

11.2.18 Beagle

Beagle `euno strumento per effettuare ricerche “full text” nei propri documenti. E` 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`a

Il progetto GNOME dedica grande attenzione al tema dell’accessibilit`a. E` possibile selezionare:

• temi ad alto contrasto • ingranditori

Riferimenti:

• Ubuntu e l’accessibilit`a61 • Guida all’accessibilit`adi Fedora62

Anche in Compiz `epresente una sezione dedicata all’accessibilit`a.

11.2.20 Tecnologie assistive

Utilizzando GNOME, si pu`ofar uso delle tecnologie assistive, che consentono di:

• avere un contrasto elevato • ingrandire i testi • utilizzare la sintesi vocale 61http://www.ubuntu-it.org/ubuntu/accessibilita.shtml 62http://docs.fedoraproject.org/it-IT/Fedora/14/pdf/Accessibility Guide/Fedora–14-Accessibility Guide-it-IT.pdf 139 • usare un terminale Braille

• impostare modificatori di tastiera • gestire il mouse (o altro puntatore) in maniera personalizzata

E` sufficiente selezionare le voci appropriate nelle Preferenze.

Figura 14: Accessibilit`a

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`oricorrere al seguente comando (impostando true o false): sudo -u gdm gconftool-2 /desktop/gnome/applications/at/screen_magnifier_enabled --type bool --set false

140