Quick&Easy Configuration HOWTO Antonio Fragola Copyright © 2000 - 2001 Antonio Fragola Configurazione rapida e facile di una LinuxBox domestica. _________________________________________________________________________________________________________ Sommario Prefazione 1. Informazioni base 2. Altre informazioni 1. Partizioni 1.1. Introduzione 1.2. Nozioni Generali 1.3. Filesystem 1.4. Prerequisiti generali 1.5. FIPS 1.6. FSRESIZE 2. Loadlin 3. Kernel 3.1. Prerequisiti 3.2. Parametri 3.3. Compilazione e installazione 4. Internet 5. Postfix 5.1. Configurazione di Postfix 5.2. Disattivazione e disinstallazione di Sendmail 6. Fetchmail 7. Procmail 7.1. Introduzione 7.2. File di configurazione 7.3. File di regole (esempi) 7.4. Usi avanzati e trucchetti 7.5. Combattere lo SPAM 7.6. Sintassi delle espressioni regolari 8. Leafnode 8.1. Configurazione 8.2. Scorefile 8.3. Leafnode+ 9. Firewall 10. DNS 10.1. Configurazione di Bind 10.2. Chrooting Bind 11. Wwwoffle 12. Junkbuster 13. Xinetd 13.1. Informazioni di base 13.2. Configurazione di base 13.3. Configurazione avanzata 14. Mutt 14.1. File di configurazione .muttrc 14.2. Mutt e gli Hooks 14.3. Tasti principali 14.4. Grepmail e Mutt 15. Slrn 15.1. Introduzione 15.2. File di configurazione .slrnrc 15.3. Tasti principali 15.4. Varie macro per SLRN 16. Masterizzazione 16.1. Introduzione 16.2. Compilazione del kernel per il riconoscimento del masterizzatore 16.3. Procedura di masterizzazione CDR 16.4. Procedura di masterizzazione CDRW 16.5. Procedura di masterizzazione On The Fly 17. Servizi 18. Wheel Mouse 19. Varie 19.1. TrueType 19.2. Bash 20. Links 20.1. Documenti vari 20.2. Partizioni 20.3. Loadlin 20.4. Kernel 20.5. Internet 20.6. Postfix 20.7. Fetchmail 20.8. Procmail 20.9. Leafnode 20.10. Firewall 20.11. DNS 20.12. Wwwoffle 20.13. Junkbuster 20.14. Mutt 20.15. Slrn 20.16. Wheel Mouse 20.17. Varie A. GNU Free Documentation License A.1. Versione originale in Inglese A.2. Versione tradotta in Italiano Lista delle Tabelle 1-1. Elenco dei tipi di file (in base al primo carattere) 13-1. Attributi 13-2. Argomenti obbligatori _________________________________________________________________________________________________________ Prefazione 1. Informazioni base 1.1. Copyright English - Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License. Italiano - È garantito il permesso di copiare, distribuire e/o modificare questo documento seguendo i termini della GNU Free Documentation License, Versione 1.1 o ogni versione successiva pubblicata dalla Free Software Foundation; senza Sezioni non Modificabili, con nessun Testo Copertina, e con nessun Testo Retro di Copertina. Una copia della licenza è acclusa nella sezione intitolata GNU Free Documentation License. _________________________________________________________________________________________________________ 1.2. Liberatoria Il Quick&Easy Configuration HOWTO è una documentazione gratuita, fornita così com'è, senza alcuna garanzia, né implicita, né esplicita di adeguatezza ad un uso particolare o di commerciabilità. Non mi assumo alcuna responsabilità per eventuali danni provocati da quanto segue: leggete, confrontate, scopiazzate, ma nun me citate in tribunale, che vi do una lisciata alla coda con lo schioppo caricato a sale grosso! ;-) _________________________________________________________________________________________________________ 1.3. Informazioni Salve a tutti i pinguini! Chi l'avrebbe detto che anch'io avrei fatto un Howto? Io per primo no, e invece... ;-) Il Quick&Easy Configuration HOWTO nasce per aiutare i giovani pinguini con ancora le piumine pre-muta, e vuole essere una raccolta di consigli su come configurare in un battibaleno una workstation Linux per uso personale. Verrà spiegato come configurare posta elettronica, dns, firewall, newsgroup, true-type fonts, fax, proxy+spamkiller, connessione internet, una rete base e quant'altro mi verrà in mente di aggiungere man mano. Il tutto sarà improntato alla massima praticità, quindi niente configurazioni meticolose e approfondite, verrà fornito quanto basta per essere attivi e produttivi SUBITO, mentre per le cose più avanzate si rimanderà a pagine man, siti e documenti vari. Il tutto è corredato da una serie di script funzionanti (salvo piccole modifiche), ampiamente commentati, che potranno anche essere taglincollati direttamente nel vostro sistema per avere una base immediata di applicazione. Un avvertimento: in genere i file che iniziano con un punto "." e finiscono con "rc" sono file di configurazione degli utenti e vanno quindi nelle loro home-directory. Ogni utente deve avere i propri file personali (es.: un file .fetchmailrc per ognuno, cambiando i rispettivi parametri) e saranno i demoni di sistema ad occuparsi di fare tutto il lavoro leggendo i vari file e assecondando le preferenze di ognuno. Per i programmi, in genere presuppongo che in una maniera o l'altra li abbiate installati (compilandoli dai sorgenti o installando un package precompilato), e quindi NON do informazioni su come compilarli o installarli. Al massimo mi limito a dire cosa serve in determinati casi. Tutte le prove sono state fatte con la distribuzione Mandrake 7.0, quindi si adattano anche a Redhat. Dal 2001 su PINGU sono passato a Debian, e quindi ora molte cose sono anche specificate per questa distribuzione. Invece sul portatile ora uso Mandrake 8.0. Un ultimo avvertimento, prima di interpellarmi eventualmente per email: Attenzione NON fate taglia e incolla dai documenti, perché la conversione da sgml potrebbe introdurre caratteri non desiderati o errati. TUTTI i file indicati si possono trovare belli e pronti in area Download del mio sito, in un pacchetto apposito. In particolare, se mi scrivete perché trovate dei file con le righe che terminano con ^M, v'accoppo! Idem se il vostro Netschiappa vi fa vedere caratteri strani invece di scaricare i file: usate un download manager con le palle, ed evitate di scaricare da win i file testuali, è isso che introduce i ^M! _________________________________________________________________________________________________________ 2. Altre informazioni 2.1. Reperibilità Il Quick&Easy Configuration HOWTO, in formato SGML, TXT, HTML mono e multipagina, PS e PDF singola e doppia pagina in A4, RTF, TEX, e gli script in esso riportati, possono essere scaricati da: http://mrshark.sourceforge.net, o dal mirror su http://mrshark.cjb.net, o ancora da http://www.mrshark.it. _________________________________________________________________________________________________________ 2.2. Da fare Nelle prossime versioni e revisioni del Quick&Easy Configuration HOWTO saranno incluse le seguenti nuove configurazioni: * Aggiungere l'uso di cdrdao e cdda2wav/cdparanoia alla sezione Masterizzazione * Configurazione di una piccola rete Lan * Gestione Fax * Configurazione dei font TrueType anche con Xfstt e con Staroffice * Sicurezza di base * Altro (boh...) più alcune revisioni e aggiunte a sezioni già presenti. _________________________________________________________________________________________________________ 2.3. Commenti Fatemi sapere se qualcosa non va o se avete altri suggerimenti. Mandate un'email a: mrshark@libero.it. _________________________________________________________________________________________________________ 2.4. Ringraziamenti Molto di quello che so, e che c'è qui, lo devo a quello splendido gruppo di pinguini che frequenta i newsgroup della gerarchia it.comp.os.linux.*, della quale mi onoro di far parte. In puro spirito GNU, quello che ho imparato ora lo metto a vostra disposizione, sperando che serva a qualcuno. Ringraziamenti per contributi vari, sono sparsi nelle varie sezioni. Ringrazio anche tutti quelli che mi hanno scritto per lodare questo lavoro o per segnalare errori, spingendomi a migliorarlo e a continuare a svilupparlo. Ciauz ;-) _________________________________________________________________________________________________________ 2.5. CS-LUG A dicembre 2000 è nato il CS-LUG (Cosenza Linux User Group), di cui sono membro, insieme al flagello degli spammer usenet, l'asciatore Thorin (Pierluigi De Rosa), e altri (promemoria: inserire i nomi degli altri membri). Se siete pinguini della zona (o volete diventarlo), potete iscrivervi alla mailing-list cslug@lists.linux.it, oppure frequentare il canale IRC #cslug, sui server della rete irc.openprojects.net (NON su ircnet!). Per altre informazioni, fate riferimento al sito: http://cslug.linux.it. _________________________________________________________________________________________________________ Capitolo 1. Partizioni 1.1. Introduzione Oggi gli hard-disk sono sempre più grandi. Partizionare un hard-disk, ossia suddividerlo in più parti, consente in genere di renderne più pratica ed efficiente la gestione, e permette di avere più sistemi operativi installati sullo stesso pc. In questa parte viene spiegato perché e come partizionare, con le istruzioni d'uso del principale programma DOS, e i trucchi per evitare di fare danno ;-). In particolare vedremo come creare spazio per installare Linux. Si raccomanda di leggere l'intero documento, senza saltare direttamente all'uso dei programmi. Nota: Originariamente questa parte era stata scritta per essere pubblicata su un sito italiano di cui non faccio nome per evitare problemi, il quale fornisce informazioni su Linux, ma che alla fine ha carattere commerciale, e doveva spiegare l'uso di vari programmi DOS e Linux per la completa gestione delle partizioni. Per svariate ragioni, legate ad alcuni disservizi del sito e per una mia decisione di rendere tutto libero e non sottostare ad alcuni vincoli imposti, questo progetto è stato abbandonato, e ora una versione ridotta al solo uso di Fips e Fsresize fa parte del Quick&Easy Configuration HOWTO. _________________________________________________________________________________________________________ 1.2. Nozioni Generali 1.2.1. Cosa sono le partizioni Le partizioni, come dice la parola stessa, sono una suddivisione dello spazio disponibile su un hard-disk (in effetti si hanno dei metodi per avere una partizione suddivisa su più hard-disk, tramite i sistemi RAID, ma questo esula dallo scopo di questo documento). Esistono 2 tipi principali di partizioni, quelle primarie e quelle estese. Le partizioni primarie sono quelle da cui i sistemi operativi possono effettuare il boot e contengono un file-system. Le informazioni sul numero e tipo di partizioni sono contenute nella parte finale dell'MBR (Master Boot Record, cilindro 0, lato 0, settore 1 dell'hard-disk), e dato lo spazio ridotto, non è possibile avere più di 4 partizioni primarie. Questo limite impone di usare le partizioni estese per suddividere ulteriormente l'hard-disk. Può esistere una sola partizione estesa su un hard-disk, e se presente il numero di partizioni primarie possibili si riduce a 3 (la somma tra primarie ed estesa non può superare 4). Le partizioni estese non possono contenere file-system, ma servono solo per contenere ulteriori suddivisioni in drive (volumi) logici. Tutte queste suddivisioni devono poi essere identificate: il DOS utilizza l'identificazione tramite lettere dell'alfabeto seguite da ":" (a:, c:, x:, ecc.). Le limitazioni di questo approccio sono evidenti, le lettere sono solo 26... (di cui le prime 2, a: e b: sono riservate ai dispositivi floppy). Oltretutto, l'assegnazione delle lettere è dettata da un astruso algoritmo, per cui basta non caricare, ad esempio, il driver del cd per avere le lettere seguenti scalate di una, o partizionare un secondo hard-disk per vedere completamente scombussolate le lettere delle partizioni del primo. Linux e tutti gli Unix in generale usano invece un metodo più avanzato per indicare le partizioni, tramite 4 caratteri: i primi due indicano il tipo di unità (hd: ide/eide, sd: scsi, fd: floppy), il 3° indica il canale cui è collegato il dispositivo fisico (a per il primary ide, b il secondary, ecc., e in modo equivalente per gli scsi, mentre per i floppy si usano 0 e 1, senza il quarto carattere), e l'ultimo carattere è un numero, che indica il numero della partizione (da 1 a 4 le primarie e le estese, da 5 in poi i volumi logici). Quindi anche se staccate il cd o un hard-disk, perdete solo l'accesso a dette unità, ma non vi cambia l'assegnazione per i drive rimasti. Nota: Questo schema cambierà con i kernel della serie 2.4, appena ne so di più aggiornerò questa sezione. L'MBR contiene un puntatore ad una delle partizioni primarie, detta avviabile. Il firmware del BIOS del pc, dopo il POST (il controllo di sistema fatto all'accensione del pc), passa il controllo all'MBR che lo passa al settore di boot della partizione avviabile o al kernel del sistema operativo. A causa di un difetto nei BIOS, questi non riescono ad accedere a partizioni poste oltre il 1024° cilindro, e ciò può creare problemi a Linux, in particolare a LILO, il boot-loader usato di solito (quindi se partite da un floppy di avvio o usate LOADLIN per partire da DOS, non avete questo problema, come anche se usate GRUB). Altri problemi con Lilo sono che DEVE essere sul primo canale IDE (quindi su hda o hdb) o se SCSI su ID 0 o 1. Al problema del 1024° cilindro si può ovviare modificando i parametri dell'hard-disk nel BIOS, ad esempio dimezzando i cilindri e raddoppiando le testine o i settori, o creando una partizione più piccola (di solito compresa tra i 16 e i 32 Mbyte), più prossima all'inizio dell'hard-disk, da usare per effettuare il mount della directory /boot, che contiene il kernel e i moduli. Dopo che il kernel ha preso il controllo del pc, il 1024° cilindro non rappresenta più un problema. In genere, se si crea un'unica partizione di grosse dimensioni, più grande di 1024 cilindri, NON è detto che /boot sia all'inizio, quindi conviene comunque creargli una partizione apposta. In Linux non esistono lettere di unità, come abbiamo detto, ed esiste un unico filesystem, in cui sono presenti anche le altre periferiche hardware del sistema, in genere sotto /dev. Se vogliamo accedere a un'altra unità (cd, hard-disk, file-system condiviso via NFS), dobbiamo effettuarne l'innesto (mount), in un punto del file-system principale (mount point). Questo permette anche di suddividere il file-system principale in più parti (e partizioni), che verranno montate durante la procedura di avvio o secondo necessità. Nota: dalla versione 0.21.4.2 Lilo non avrà più il problema del 1024° cilindro, grazie ad un'apposita patch. _________________________________________________________________________________________________________ 1.2.2. Perché (ri)partizionare: partizioni e buonsenso Tre sono i motivi principali per cui è bene partizionare un hard-disk: 1. Organizzazione: permette di suddividere il sistema dalle applicazioni e dai dati; si possono installare diversi sistemi operativi in differenti partizioni; avere i dati in una partizione a sè stante facilità le operazioni di backup e rende più facile la (re)installazione di un sistema operativo; è possibile condividere in rete una partizione contenente dati, senza dare accesso anche al sistema. 2. Ottimizzazione: si recupera fino al 30/40% di spazio grazie a cluster di dimensioni minori; si può mettere il file di swap di Windows in una partizione dedicata, riducendo la frammentazione (Linux usa addirittura una partizione di swap, più efficiente del semplice file, che comunque è possibile usare); se i dati sono separati, la deframmentazione delle applicazioni è più rapida; si può mantenere una partizione FAT16 per i dati, compatibile con molti sistemi operativi (OS/2, Linux, Windows NT). 3. Sicurezza: si separano i dati da applicazioni e sistema operativo; una singola partizione può contenere dati riservati, nascondendola con utility apposite o non montandola nel file-system principale; diversi sistemi operativi operano in diverse partizioni, riducendo i danni derivanti da aree comuni; si può testare software instabile con tranquillità; si può mantenere il vecchio sistema operativo fino a quando non ci si sente a proprio agio in quello nuovo (questo è l'uso preferito dai pinguini ;-) ); è possibile mantenere copia dei file di sistema importanti o di un immagine dell'hard-disk per un rapido ripristino. Quando si vuole installare Linux, nasce la necessità di creargli spazio: i credenti piallano senza ritegno le eventuali partizioni esistenti di altri SO, mentre i nuovi adepti di solito fannno convivere Linux con Windows finchè non se ne ha più bisogno. Se la quantità di dati presenti nella partizione Windows non è elevata (diciamo che con un gigabyte libero si può avere tutto, anche l'ambiente grafico e di sviluppo, mentre se ci si limita alla sola console a caratteri anche mezzo giga basta, avendo comunque molto più di quello che si ha col semplice DOS, ad esempio server web, DB, email, news e altro), si può cercare di ridurre lo spazio occupato, liberandolo alla fine dell'hard-disk, per poi usare lo spazio vuoto per le partizioni EXT2 (Linux native, type 0x83), e in genere 64 Mbyte per la partizione di swap (Linux swap, type 0x82, si va da un minimo utile di 16 a un massimo consentito di 128 per i kernel 2.0.xx, mentre i kernel 2.2.xx consentono un massimo di 2 Gbyte). Un esempio tipico di partizioni per Linux è il seguente: * 16 Mb per la partizione /boot, tenendosi mooolto larghi (anche 5 vanno bene, ma le potenze di 2 fanno più fico ;-) ). Deve essere possibilmente la prima ad essere creata, in modo che sia al di sotto del 1024° cilindro, per evitare problemi con Lilo (per altre informazioni, guardate la sezione di Loadlin). * Tra i 50 e i 100 Mb per la partizione root ("/", da NON confondere con /root, che è la directory home dell'utente amministratore del sistema). * Per la partizione /usr , tra i 300 e i 700 Mb se create partizioni autonome per /usr/src e /usr/local, altrimenti tra 500 Mb e 1 Gb , a seconda di ciò che si vuole installare, visto che la maggior parte dei programmi finisce qui; in un sistema ormai stabilizzato, potrebbe essere anche montata a sola lettura. * 50 Mb minimo per ogni utente che si vuole avere, da montare sotto /home. Altre partizioni che potrebbero essere utili sono: * /usr/local, in cui installare il software locale alla macchina e che in genere non fa parte direttamente della distribuzione, assegnandogli spazio secondo necessità (diciamo tra i 100 e i 200 Mb, a tenersi larghi); conviene crearla se /usr è a sola lettura. * /usr/src, in cui installare i sorgenti, utile in caso si ricompili spesso, ad esempio il kernel (anche qui tra i 100 e i 200 Mb). * /tmp, per i file temporanei, in un sistema multiutente con traffico intenso sarebbe meglio averla in un'altra partizione, se non addirittura hard-disk, mentre in una macchina con pochi utenti non serve spostarla (potete anche creare un symlink da /tmp --> /var/tmp). * /opt, usata da alcuni programmi, potrebbe anche essere un semplice link simbolico a /usr o /usr/local. * /var, che contiene gli spool di stampa e di email, e i log di sistema. Conviene crearla solo su sistemi multiutente o comunque server, assegnandole 500 Mb circa. Il crearla comunque velocizza molto l'uso intensivo di mail e news, specie se la si crea su un hard-disk separato. Gli utenti Debian tengano presente che questa distribuzione, tramite il suo tool apt-get, tiene in /var/cache/apt tutti i file .deb che vengono scaricati durante l'aggiornamento del sistema o l'aggiunta di altre applicazioni, e che quindi /var può crescere a dismisura! Sarebbe consigliabile quindi fare un'altra partizione separata per /var/cache. _________________________________________________________________________________________________________ 1.3. Filesystem Il disco durante la formattazione viene suddiviso in settori e tracce: possiamo immaginare le tracce come delle corone circolari concentriche di disco, mentre i settori sono degli spicchi di disco. Usando settore e traccia come coordinate è possibile individuare un blocco, l'unità più piccola indirizzabile su un disco. A questo tipo di suddivizione fanno eccezione i cdrom e i nastri: entrambi usano un tipo di organizzazione sequenziale, i nastri per ovvie ragioni, mentre i cdrom perché sono organizzati in una lunghissima spirale (veramente lo sono solo i cd-r e cd-rw, per facilitare il percorso del laser, per i cdrom normali è leggermente diverso). Nel caso dei cdrom però, la presenza di un filesystem (di solito iso9660, magari arricchito con estensioni joliet nei sistemi microsoft o rock-ridge nei sistemi linux, per gestire nomi e path lunghi, o i permessi) permette di accedervi in lettura in maniera diretta e casuale, come sui normali dischi magnetici. Un filesystem è un sistema per organizzare i file nei dispositivi in modo da avere un accesso diretto, senza il vincolo della sequenzialità. Un filesystem quindi contiene file, mantenendo un elenco di essi e della loro posizione sul disco, eventualmente (quasi sempre...) suddivisi in più settori del dispositivo. L'organizzazione è gerarchica, specie in Unix, l'insieme di sistemi operativi di cui Linux fa parte: esiste un punto d'innesto principale ("/", root), a cui sono collegati altri punti di innesto secondari e così via. Questi punti di innesto si chiamano directory, e non necessariamente devono risiedere sullo stesso disco o addirittura sullo stesso computer. Infatti Unix permette di montare (agganciare o innestare) al filesystem principale altri filesystem, locali o remoti, che al termine devono essere smontati per poter essere eventualmente rimossi, ad esempio per floppy e cdrom. L'operazione di unmount (smontaggio) di un dispositivo effettua inoltre il sync (sincronizzazione) del suo contenuto, garantendo l'integrità dei dati. Infatti Unix non scrive immediatamente le modifiche effettuate, ma aspetta che altri processi più importanti rilascino risorse (tempo e % di occupazione della cpu) per effettuare il sync. Le directory possono contenere altre directory o file. Esiste quindi un'organizzazione ad albero, e per indicare un file se ne specifica il suo path (percorso) all'interno del filesystem principale, partendo da "/" e separando ogni nodo (directory) con il simbolo "/", ad esempio: /home/utente/testi/tesi.txt . Il filesystem Unix permette inoltre di avere informazioni aggiuntive sulla natura del file, tipo permessi di lettura, scrittura ed esecuzione, utente e gruppo proprietario, e genere del file in questione. Per sapere il tipo di file, basta dare ls -la e guardare il primo carattere della riga del file in questione, ad esempio: .......... drwxr-xr-x 2 utente gruppo 1024 Mar 23 1999 docs -rw------- 2 utente gruppo 1024 Apr 12 2000 testo .......... Tabella 1-1. Elenco dei tipi di file (in base al primo carattere) - file regolare d directory l link (collegamento) b periferica a blocchi con buffer c periferica a caratteri con buffer u periferica a caratteri senza buffer p pipe FIFO s socket Le periferiche o dispositivi a caratteri permettono di accedervi solo un carattere alla volta (es: console, porta seriale, ecc.), mentre quelle a blocchi permettono di accedervi solo a blocchi di dimensioni stabilite (es: dischi). Solo quest'ultimo tipo di periferiche o dispositivi possono contenere un filesystem. Nota: I CD audio puri (o la sola parte audio di quelli Mixed-mode) NON contengono filesystem, quindi non si possono montare: per ascoltarli basta usare un lettore CD, sempre ammesso di avere i permessi di accesso in lettura al dispositivo! Da notare che non necessariamente, per il solo fatto di essere un dispositivo a blocchi, un disco deve contenere un filesystem. Un disco può comunque essere usato alla vecchia maniera sequenziale: infatti un disco senza filesystem è solo una serie di settori a partire dalla prima testina del primo cilindro. In questo senso, a volte si utilizzano i dischi come se fossero nastri, registrando e rileggendo i dati nella stessa sequenza naturale di settori, testine e cilindri. Tipici esempi sono i dischetti di avvio con l'immagine del kernel o i dischi di archivio multivolume creati da tar. Ricordate che i dischi senza filesystem non possono essere montati normalmente, ma necessitano del cosiddetto loopback device, compilato insieme al kernel. Le partizioni di swap sono gestite a blocchi, senza filesystem. La maggior parte delle distribuzioni Unix e Linux seguono il Filesystem Structure Standard (FSSTND, ora evolutosi in FHS, Filesystem Hierarchy Standard), in modo da garantire una certa uniformità o comparibilità. Il FSSTND parte dall'idea di separare i file locali alla macchina da quelli condivisi (in rete locale o altro), e quelli a sola lettura da quelli accessibili anche in scrittura. Vediamo alcuni punti del FSSTND: * / - è la directory principale che contiene tutte le altre. * /boot - contiene i file statici usati durante l'avvio, compreso il kernel e i file di Lilo. * /home - è la directory che contiene quelle personali degli utenti. * /mnt - di solito contiene i punti di innesto dei dispositivi rimovibili (/mnt/floppy, /mnt/cdrom, /mnt/zip, ecc.). * /dev - contiene i file speciali dei dispositivi di sistema, a blocchi o a caratteri (ebbene sì, anche i dispositivi fisici sono visti come file: mai sentito il detto "In Unix tutto è un file"?). * /etc - contiene i file di configurazione generali del sistema. Eventuali sottodirectory raggruppano file di configurazione specifici di qualche programma o servizio, ad esempio /etc/X11 per il sistema grafico, /etc/ppp per il demone ppp, /etc/httpd per apache, ecc. (anzi, /etc /etc ;-) ). * /lib - contiene le librerie condivise, usate in link dinamico dai programmi contenuti in /bin e /usr/bin. /lib/modules contiene i moduli caricati dinamicamente dal kernel. * /proc - è il punto d'innesto del filesystem virtuale proc, che contiene informazioni varie sul sistema in attività (viene infatti generato a runtime dal kernel), oltre a possibili impostazioni da applicare ogni volta che si avvia il sistema. * /sbin - contiene i file principali per l'avvio del sistema e per l'amministrazione da parte dell'utente root. I programmi sono linkati staticamente, quindi non hanno bisogno di accedere a /lib. * /bin - contiene i file eseguibili che in genere possono essere usati localmente anche dai comuni utenti. * /usr - contiene i file condivisibili in rete tra più macchine, e dovrebbe essere possibile montarla in sola lettura, a sistema ormai stabilizzato, sempre nel caso che disponga di una partizione separata. Contiene un sotto-filesystem: /usr/bin per i file eseguibili anche dagli utenti comuni, /usr/sbin per quelli dell'utente root, /usr/doc e /usr/info per la documentazione, /usr/man per le pagine di manuale, /usr/X11R6 per il sistema grafico X11, /usr/include per gli header necessari per la compilazione di programmi C, /usr/lib per le librerie, /usr/src per i sorgenti (in particolare /usr/src/linux per i sorgenti del kernel), e /usr/local per programmi locali alla macchina, ma aggiunti in seguito alla stabilizzazione del sistema. * /var - contiene i file variabili del sistema (a differenza di /usr, che dovrebbe poter essere montata a sola lettura). Contiene le directory di spool del sistema (come /var/spool/lpd per la stampa, /var/spool/fax per i fax, /var/spool/mail per la posta, /var/spool/news per i newsgroup, ecc.), la directory dei log (registrazioni delle attività) del sistema (/var/log/...), la directory contenente i PID dei processi in esecuzione (/var/run/...), la directory delle cache (/var/cache), e altro. * /tmp - contiene i file temporanei generati dagli utenti e dai programmi in esecuzione, ed è accessibile in genere in lettura/scrittura/esecuzione a tutti gli utenti (può anche essere un link simbolico a /var/tmp). _________________________________________________________________________________________________________ 1.4. Prerequisiti generali Prima di tutto createvi un dischetto di boot con un minimo di utility d'emergenza. Inserite un floppy da 1.44" vuoto e dal prompt date il comando: format a:/u/s. Alla fine copiateci dentro dalla directory c:\windows\command oppure c:\dos i file: fdisk.exe, format.com e sys.com Prima di iniziare (escludiamo naturalmente il ripartizionamento distruttivo e il caso di hard-disk nuovo o comunque vuoto, nel cui caso si può procedere come esposto nella prima parte), l'hard-disk va preparato. Prima di tutto è bene controllare che non ci siano errori sul disco, con (in ordine dal programma peggiore al migliore) Chkdsk, Scandisk, Ndd (Norton Disk Doctor). I primi due fanno parte del DOS (scandisk dalla versione 6, mi sembra), il terzo fa parte delle Norton Utilities. DOVETE fare il test della superficie, è per essere sicuri che non ci siano settori danneggiati, o almeno che essi vengano individuati e annotati nella FAT. Poi un bel backup, che male non fa mai, quindi cogliete l'attimo e salvatevi le cose importanti (anche nel caso di più partizioni di cui una dedicata apposta ai dati, conviene sempre fare un backup su floppy, zip o meglio CD-R o CD-RW). Ancora, opzionalmente, una bella passata di antivirus non farebbe male, l'importante è che lo lanciate da floppy DOPO AVER SPENTO il pc (non semplicemente ctrl-alt-canc). Naturalmente l'antivirus DEVE essere aggiornato frequentemente e serve a poco installarlo su un pc già infetto, per questo lo si deve installare su un pc SICURAMENTE sano e crearsi i dischetti di emergenza al più presto (chiaramente se aggiornate l'antivirus sul pc dovete ricreare i dischetti). Se non vengono segnalati errori, si procede alla deframmentazione. ALT! Credevate di cavarvela così facilmente? Allora non conoscete il DOS (e il suo figlio illeggittimo Windows ;-) )! Se avete solo il DOS potrebbe (POTREBBE) andarvi anche bene, ma con Windows è tutto un altro paio di maniche. Vediamo i possibili problemi: * DOVETE disattivare la memoria virtuale, per poi riattivarla dopo che la procedura è conclusa. In Windows 9x ciò si fa così: click destro su Risorse del Computer / Proprietà / click sulla linguetta Prestazioni / click su Memoria Virtuale / click su Impostazione manuale della memoria virtuale / selezione di Disattiva memoria virtuale / poi premere Inviofino al riavvio. In Win 3.x la voce dovrebbe essere nella sezione 386 Enhanched del Pannello di Controllo (non uso Win 3.1 da 4 anni, potrei toppare ;-) ). * Naturalmente uscite da qualsiasi ambiente multitasking, DOVETE essere in puro e semplice DOS, possibilmente senza Smartdrive o altre cache software del disco (date dal prompt un bel smartdrv /c o equivalente per eseguire il flush della cache). * Potrebbero essere stati creati dei file nascosti e di sistema nell'ultimo settore dell'hard-disk, in particolare Mirror (DOS) e Image (Norton) lo usano per metterci un puntatore ai file che fanno da immagine del vostro hard-disk. DOVETE cancellarli, tanto verranno ricreati la prossima volta che lancerete i rispettivi comandi. Per poterli cancellare date dal prompt: attrib -r -s -h image.idx oppure attrib -r -s -h mirorsav.fil e poi cancellateli normalmente. * Potrebbero esserci altri file nascosti/di sistema: bisogna permettere che essi possano essere spostati (ATTENZIONE a quello che fate in questa sezione). Chiudete le finestre (ehm, uscite da Windows ;-) ) e dal prompt date i seguenti comandi: cd \ dir /s /b /a:h >>t.bat dir /s /b /a:s >>t.bat edit t.bat Attenzione IMPORTANTE: prima di procedere, eliminate dal file t.bat TUTTE le righe che riportano c:\io.sys e c:\msdos.sys oppure c:\ibmbio.com e c:\ibmdos.com (dovrebbero esserci 2 righe per ognuno dei file elencati). Se saltate questo punto e deframmentate, è probabile che al riavvio il sistema non parta più (se comunque dovesse succedere, se avete creato il disco di avvio come vi ho detto in precedenza basta che partiate con quello e diate a:sys c: dal prompt). Sostituite nel file t.bat tutte le occorrenze di c:\ con attrib -r -s -h c:\, uscite da Edit salvando e lanciate dal prompt il file t.bat. Questo elimina gli attributi che potrebbere creare problemi a Defrag. * Disattivate TUTTE le opzioni di ottimizzazione del programma di deframmentazione (in particolare disattivate da Windows 98 l'opzione "Riorganizza i file dei programmi per un avvio più rapido"), perché con la scusa di ottimizzare l'avvio (usando i dati contenuti nella directory nascosta c:\windows\applog) spesso vengono lasciati dati nell'ultima parte del disco (esperienza personale). Per Norton Speedisk regolatevi di conseguenza, ricordando che le versioni anteriori alla 4 non supportano la suddetta directory Applog, quindi con Windows 98 rischiate di vedervelo rallentare invece di velocizzare. Dopo aver ripartizionato, potrete rieffettuare la deframmentazione riattivando le opzioni disattivate. * Un'ultima nota: conviene deframmentare dalla Modalità provvisoria, così sarete certi che non ci siano processi in background che potrebbero far ripartire Defrag nel caso essi si mettessero in attività, o peggio che andassero a scrivere nella zona appena deframmentata, o alla fine del disco, vanificando il tutto. A questo punto partite in modalità provvisoria e deframmentate, finalmente! Un ultimo consiglio: quando Defrag ha finito il suo lavoro, anche se la procedura può sembrare poco ortodossa, conviene aspettare una decina di secondi e se la luce dell'hard-disk non da segni di vita (non dovrebbe, non essendoci niente in background né attiva la memoria virtuale) conviene RESETTARE, invece di chiudere Defrag e Sessione per riavviare. Questo perché Windows in fase di chiusura potrebbe andare a riscrivere nella zona appena deframmentata (esperienza personale). Attenzione ATTENZIONE: io ho eseguito questa procedura più volte senza riscontrare problemi, nemmeno la partenza di Scandisk, ma il Reset potrebbe causare danni al file-system esistente se non anche all'hard-disk in rari casi. Il sottoscritto non si assume alcuna responsabilità per eventuali danni provocati da questa procedura: se temete di fare danno chiudete normalmente Windows e incrociate le dita (d'altronde, tutta la procedura di mettere mano al file-system è pericolosa, quindi...). Ancora una cosa: il DOS standard stabilisce che non ci sia più di una partizione primaria, anche se nella pratica ciò è tollerato e permette di realizzare un sistema multiboot come ho esposto all'inizio. _________________________________________________________________________________________________________ 1.5. FIPS 1.5.1. Introduzione Fips è un programma molto potente, che permette di ridurre le dimensioni delle partizioni primarie FAT (Fips 1.5 e 2.0) e FAT32 (solo Fips 2.0). Fips riduce lo spazio di una partizione PRIMARIA modificando alcuni valori nella Tavola delle Partizioni e nel settore di boot, creando nello spazio che rimane vuoto una nuova partizione PRIMARIA (NON formattata, quindi se vi serve di nuovo per DOS/Windows, dovete formattarla, mentre se vi serve per Linux potete o cambiarle l'identificativo con fdisk DI LINUX o eliminarla per poi creare le partizioni che servono da Linux, come esposto nella prima parte). Per questo Fips NON funziona su partizioni estese, ma solo su quelle primarie, e funziona solo se NON avete già raggiunto il limite di 4 partizioni primarie per hard-disk. Fips non cambia la dimensione dei cluster né il tipo di FAT della partizione originaria, mentre per quella nuova i cluster saranno generati in base alla dimensione della partizione, come fa usualmente Format, tranne se si ha una FAT32, nel cui caso i cluster saranno di 4 kbyte. _________________________________________________________________________________________________________ 1.5.2. Prerequisiti all'uso di FIPS Preparate il dischetto come spiegato prima e dalla directory dove avete scompattato Fips copiateci dentro i file: restorrb.exe, fips.exe e errors.txt. Leggete tutte le istruzioni generali date in precedenza. Attenzione ATTENZIONE: se usate Stacker/Superstor/DoubleSpace per comprimere una parte del vostro hard-disk, o se usate On Track Disk Manager o EZdrive per estendere le capacità di riconoscimento degli hard-disk eide da parte dei vecchi bios, o ancora nel caso di hard-disk SCSI, leggete il file SPECIAL.txt che accompagna Fips e gli altri documenti. _________________________________________________________________________________________________________ 1.5.3. Uso di FIPS Infilate il floppy preparato prima e riavviate il pc. Al prompt lanciate fips, il quale dopo aver controllato di non essere in ambiente multitasking incomincerà a controllare quanti hard-disk ci sono nel pc, permettendo di scegliere, poi mostra la tabella delle partizioni dell'hard-disk scelto, effettua il controllo del settore principale e nel caso di più partizioni primarie, permette di scegliere quella su cui operare. Mostra quindi il settore di avvio della partizione scelta, fa degli altri controlli e verifica che le due copie della FAT siano congruenti, poi verifica lo spazio vuoto alla fine della partizione. In ognuno di questi casi, se viene riscontrato un errore, Fips esce al prompt fermandosi e segnalando l'errore riscontrato. Viene chiesto quindi di salvare lo stato attuale della tabella delle partizioni sul floppy, per poter tornare indietro in caso di errori. FATELO! Se tutto va bene, viene permesso di ridimensionare la partizione in modo visuale, tramite i tasti cursore. Quando avete raggiunto una situazione accettabile, premete Invio. Fips rifà di nuovo tutti i controlli, vi mostra la nuova tabella delle partizioni e vi chiede se volete continuare, premendo C. Fips rifà ancora tutti i controlli (pignolo, eh? ;-) ) e vi chiede se volete scrivere la nuova tabella delle partizioni su disco. Se premete Y essa viene scritta sul disco e ritornate al prompt. Tutto fatto! Ora RIAVVIATE il pc per rendere attivi i cambiamenti e verificate il tutto. NON fate niente sul disco prima di aver riavviato. Se qualcosa non vi soddisfa, ripristinate la situazione precedente ripartendo dal dischetto su cui avete salvato la tabella delle partizioni (perché l'avete fatto, vero? ;-) ) usando restorrb. Controllate di nuovo la vecchia partizione con Scandisk o altro, riavviate il pc per vedere che parta come prima. Per usare la partizione sotto DOS o Windows, oppure per suddividerla ancora, DOVETE prima formattarla (ATTENZIONE alle lettere, sicuramente sono cambiate!). Per usarla sotto Linux, usate il suo fdisk per cambiarle l'ID di tipo da FAT a Linux Native o Linux Swap, e usate MKFS per creare un file-system EXT2. Dovreste a questo punto essere a posto (più o meno, fino a quando la metà oscura del vostro hard-disk (DOS/Win) non sarà stata eliminata ;-) ). _________________________________________________________________________________________________________ 1.6. FSRESIZE Fsresize è un tool per Linux abbastanza recente (attualmente in versione 0.08) che permette di modificare le dimensioni delle partizioni FAT16 e 32 in modo veloce e senza bisogno di deframmentare prima il file-system. Ha quindi grosse potenzialità, ma alcuni pesanti difetti: infatti, poichè non può cambiare il tipo di FAT in uso, il numero di cluster deve rimanere costante, e in caso di allargamento della partizione il numero non può eccedere quello stabilito dalla FAT (es.: se anche aveste 4 GB liberi, ma usate FAT16, non potete avere una partizione di più di 2 GB). Prima di usarlo, valgono sempre le considerazioni fatte in precedenza, fate un dosfsck o una scandisk e un bel backup. Esempi d'uso (tratti dalla man page): fsresize /dev/hda9 -i mostra delle informazioni sulla partizione specificata fsresize /dev/hda2 324M --backup=dosc.backup esegue il resize della partizione specificata impostandola a 324 MB e facendo il backup nel file indicato fsresize /dev/hda1 5654k esegue il resize della partizione specificata impostandola a 5654 KB senza fare il backup fsresize /dev/hda3 2545 esegue il resize della partizione specificata impostandola a 2545 KB senza fare il backup (se non si specifica M o m, oppure K o k, il default è k, per kilobytes) fsresize /dev/hda5 --restore dosd.backup ripristina la partizione specificata a partire dal file indicato Usate SEMPRE l'opzione --backup, che in caso di errori permette tramite --restore di ripristinare il tutto. È possibile che LILO non funzioni al riavvio, quindi prima di riavviare date /sbin/lilo da root per risistemarlo. _________________________________________________________________________________________________________ Capitolo 2. Loadlin In questa sezione spiego come avviare Linux con Loadlin, un programma DOS che permette di evitare di installare Lilo da qualsiasi parte, utile spesso quando si ha a che fare con multiple (e frequenti) installazioni di Windows, che solitamente sovrascrivono l'MBR eliminando Lilo. Verrà anche mostrato l'uso di un menu che faciliterà la scelta dell'OS, oltre alla gestione di due diversi kernel (per esempio uno stabile e uno in prova - duplicate le relative sezioni per averne altri). Create una directory (io la chiamo loadlin, perché in linux ho installato mulinux, per emergenze) nella vostra partizione Windows e copiateci dentro il kernel stabile che usate (da Linux, è nella directory /boot), rinominandolo vmlinuz.old, e l'eventuale nuovo kernel in prova, rinominandolo vmlinuz.new. Copiateci dentro anche loadlin.exe, dalla directory Dosutils presente nel cd della vostra distribuzione. Ora create il file c:\loadlin\linuxold.bat come segue: loadlin.exe @loadlin.old e create il file delle impostazioni c:\loadlin\loadlin.old: vmlinuz.old root=/dev/hdb2 ro vga=extended mem=128M append="reserve=0x300,64 ether=9,0x300,eth0" Il primo rigo è il nome del file del kernel; il secondo (MODIFICATELO per il vostro sistema! Altre info nella pagina delle Partizioni) è la partizionie di root di linux; il terzo è OBBLIGATORIO per montare il filesystem a sola lettura (ci penserà il processo principale init a rimontartlo in lettura/scrittura durante l'avvio); il quarto rigo è opzionale (a me piace la console 80x50); il quinto permette di specificare se avete più di 64 mbyte di RAM, nel caso non vengano riconosciuti tutti; l'ultimo rigo serve per comunicare parametri per qualche periferica che devono essere passati al kernel (in questo caso una scheda di rete NE2000 compatibile ISA). Se avete il secondo kernel in prova, create anche il file c:\loadlin\linuxnew.bat come segue: loadlin.exe @loadlin.new e create il secondo file delle impostazioni c:\loadlin\loadlin.new: vmlinuz.new root=/dev/hdb2 ro vga=extended mem=128M append="reserve=0x300,64 ether=9,0x300,eth0" Ora modificate il file c:\msdos.sys (PRIMA date: attrib -s -h -r c:\msdos.sys) nelle seguenti righe: ... altre cose presenti da non toccare [Options] BootGUI=0 Logo=0 ... altre cose presenti da non toccare NON cancellate tutte quelle x alla fine, il file deve essere più lungo di 1024 byte. Rimettete a posto i permessi con attrib +s +h +r c:\msdos.sys. Ora il file c:\config.sys: [Menu] menuitem=Win98, Avvia Windows 98... menuitem=MSdos, Avvia MS-DOS... menuitem=Linux_New, Avvia Linux-New... menuitem=Linux_Old, Avvia Linux-Old... menudefault=Win98,5 [Win98] DEVICE=C:\WINDOWS\HIMEM.SYS DEVICE=C:\WINDOWS\EMM386.EXE NOEMS DOS=HIGH,UMB [MSdos] DEVICE=C:\WINDOWS\HIMEM.SYS DEVICE=C:\WINDOWS\EMM386.EXE NOEMS DOS=HIGH,UMB [Linux_New] [Linux_Old] Naturalmente prendete tutto quello che già avete nel vostro config.sys e copiatelo in entrambe le sezioni Win98 e MSdos (dovrebbero essere uguali), al posto di quello che ho messo io. Ultimo file, c:\autoexec.bat: goto %config% :Win98 rem ... inserite le altre cose presenti nel vostro autoexec.bat rem le 4 righe seguenti non servono per linux, ma tornano utili con win ;-) deltree /y c:\windows\temp md c:\windows\temp set tmp=c:\windows\temp set temp=c:\windows\temp win goto end :MSdos rem ... inserite le altre cose presenti nel vostro autoexec.bat rem le 4 righe seguenti non servono per linux, ma tornano utili con win ;-) deltree /y c:\windows\temp md c:\windows\temp set tmp=c:\windows\temp set temp=c:\windows\temp goto end :Linux_New call c:\loadlin\linuxnew.bat goto end :Linux_Old call c:\loadlin\linuxold.bat goto end :end Un consiglio: dati i noti disservizi di Windows, se avete 2 o più partizioni VFAT, spostate la directory loadlin in un'altra partizione e modificate i path (magari copiateci dentro per backup anche i file autoexec.bat, config.sys e msdos.sys). Nel caso aggiorniate il kernel, ricordate di ricopiare il nuovo file nella directory loadlin!!! _________________________________________________________________________________________________________ Capitolo 3. Kernel Qui si spiega come compilare e installare un kernel della serie stabile 2.2.x. Di solito questo si fa per includere nel kernel delle funzionalità non presenti, ad esempio il supporto per alcune schede che per motivi di genericità non vengono sempre incluse nei kernel di serie delle distribuzioni, oppure per modelli recenti che per forza non esistevano all'epoca. Non è un procedimento complicato, ma vanno seguiti dei passi stabiliti, per non creare instabilità nel sistema a causa del mancato supporto a proprietà basilari, come il supporto al filesystem ext2, o ai binari elf, oppure ancora al tipo di disco da cui fate il boot. Per sapere quale kernel avete in funzione nel vostro PC, usate il comando uname -r. Per sapere qual è l'ultima versione di kernel disponibile online, usate il comando finger @finger.kernel.org. _________________________________________________________________________________________________________ 3.1. Prerequisiti 3.1.1. Reperimento Il sito principale è ftp://ftp.kernel.org, ma esistono i mirror nazionali, reperibili come ftp.XX.kernel.org, dove XX è il codice del paese (ad esempio "it" per Italia, "de" per Germania, "fr" per Francia, "uk" per Inghilterra, e così via). Cercate nella directory /pub/linux/kernel/2.2. In genere esistono 2 tipi di file in 2 formati di compressione diversi. I file sono del tipo: linux-VERSIONE_KERNEL.tar.COMPRESSORE, oppure patch-VERSIONE_KERNEL.tar.COMPRESSORE. COMPRESSORE può essere gz per file compressi con GZIP, o bz2 per file compressi con BZIP2 (in genere più piccoli) I file che iniziano per linux contenengono i sorgenti del kernel COMPLETO, mentre i file che iniziano per patch contengono solo le differenze con le versioni precedenti. Quindi, per esempio, ci possono essere i file: linux-2.2.14.tar.gz, linux-2.2.14.tar.bz2, patch-2.2.14.tar.gz e patch-2.2.14.tar.bz2, insieme in genere a tutte le versioni precedenti. Conviene scaricare la versione completa se proprio non avete i sorgenti, mentre se avete una versione precedente potete scaricare solo i file di differenza, da applicare sui sorgenti in vostro possesso per avere alla fine la STESSA IDENTICA versione di sorgenti che avreste ottenuto dalla versione completa. Ricordate però che dovete scaricare TUTTE le versioni di patch dalla versione in vostro possesso fino a quella che volete ottenere (quindi se avete i sorgenti completi linux-2.2.11.tar.gz, e volete arrivare alla versione 2.2.14, dovete scaricare i file patch-2.2.12.tar.gz, patch-2.2.13.tar.gz e patch-2.2.14.tar.gz, da applicare al 2.2.11 in successione, come indicato in seguito (ATTENZIONE!: le patch delle versioni "pre..." non sono incrementali). Un consiglio: NON usate i sorgenti standard forniti dalle distribuzioni se dovete applicarvi delle patch, perché in genere sono versioni modificate e le patch notando questo fatto non vengono applicate (tipico il caso della RedHat), oltre al fatto che non mettono a posto alcuni collegamenti. Inoltre cercate di evitare le versioni sperimentali dei kernel (2.X.YYY, con X dispari), a meno che non aggiungano il supporto per qualche nuovo hardware di cui non potete fare a meno, perché a volte non sono completamente stabili (sono sperimentali per questo). _________________________________________________________________________________________________________ 3.1.2. Software necessario Naturalmente i sorgenti del kernel. Poi i programmi gzip e bzip2, in base al tipo di compressione usata per i sorgenti. I pacchetti software: make, bin86, glibc-devel, gcc (in genere, se viene segnalata la mancanza qualche file, fa parte di questi pacchetti, quindi installateli tutti). Se volete usare l'interfaccia grafica di configurazione in X-Window, naturalmente dovete aver installato e configurato bene l'X-server, e poi vi servono anche il pacchetto contenente il linguaggio tcl e il suo tool grafico tk. _________________________________________________________________________________________________________ 3.1.3. Scompattazione, patch e avvio della configurazione Ecco i passi da seguire (tutto ciò che è tra doppi apici in grassetto è un comando, e va dato senza di essi; come esempio si suppone di avere una versione 2.2.11 e di aggiornare alla versione 2.2.14): 1. Se non lo siete già, diventate utente root e spostatevi in /usr/src ("su root", più la password, poi "cd /usr/src") 2. Date: "ls -l". Controllate se esiste una riga che contiene 'linux': se non esiste, saltate al punto 5; se esiste e il primo carattere della riga è d, si tratta di una directory, saltate al punto 4; altrimenti se esiste e il primo carattere della riga è l, si tratta di un collegamento, continuate col punto 3 3. Rimuovete il link: "rm -f linux" (in questo modo i vecchi sorgenti eventualmente presenti rimarranno nella directory cui puntava il link, in genere 'linux-VERSIONE_KERNEL'), e saltate al punto 5 4. Rinominate la directory: "mv linux linux.old" (in questo modo i vecchi sorgenti eventualmente presenti verranno spostati nella directory 'linux.old'), e continuate col punto 5 5. Scompattate i nuovi sorgenti: se il file in vostro possesso finisce in '.gz', date "tar xvzf /persorso/del/file/linux-2.2.11.tar.gz", mentre se finisce con '.bz2', date "tar xvf /persorso/del/file/linux-2.2.11.tar.bz2 --use-compress-program bzip2" 6. Se avete già l'ultima versione dei sorgenti, saltate al punto 7, altrimenti se dovete applicare delle patch per aggiornare i sorgenti ad una versione più recente, date i seguenti comandi (TUTTE le patch vanno applicate in sequenza): cd linux gzip -dc /persorso/del/file/patch-2.2.12.gz | patch -p1 gzip -dc /persorso/del/file/patch-2.2.13.gz | patch -p1 gzip -dc /persorso/del/file/patch-2.2.14.gz | patch -p1 cd .. nel caso abbiate dei file del tipo 'patch-VERSIONE_KERNEL.bz2', sostituite nei comandi precedenti 'gzip' con 'bzip2' 7. Rinominate la directory ottenuta in base alla versione dei sorgenti che avete ottenuto (nell'esempio 2.2.14) e ricreate alcuni collegamenti simbolici: mv linux linux-2.2.14 ln -s linux-2.2.14 linux rm -rf /usr/src/linux/include/asm /usr/include/asm rm -rf /usr/include/linux /usr/include/scsi ln -s /usr/src/linux/include/asm-i386/ /usr/src/linux/include/asm ln -s /usr/src/linux/include/asm-i386/ /usr/include/asm ln -s /usr/src/linux/include/linux/ /usr/include/linux ln -s /usr/src/linux/include/scsi/ /usr/include/scsi così da portare il tutto in una situazione standard (i sorgenti devono essere in '/usr/src/linux/') 8. Si passa ora alla fase più delicata dell'operazione: scegliere cosa includere e cosa no nel kernel. Date "cd linux" e poi "make mrproper" per eliminare residui di eventuali vecchie compilazioni (attenzione che questo comando cancella il file '.config', che contiene le impostazioni date in una precedente compilazione, quindi nel caso fatevene una copia). Ora date a vostra scelta uno dei tre comandi seguenti, in base al tipo di interfaccia che volete usare (solo quello che c'è prima del # !!!): make config # (interfaccia a caratteri base) make menuconfig # (interfaccia a caratteri con menu) make xconfig # (interfaccia grafica - dovete essere in X-Window) e passiamo alla configurazione dei parametri. _________________________________________________________________________________________________________ 3.2. Parametri 3.2.1. Code maturity level options * Prompt for development and/or incomplete code/drivers: 'y' _________________________________________________________________________________________________________ 3.2.2. Processor type and features * Processor family: selezionate il vostro processore. Nel caso di Intel Pentium Pro, Pentium II, Celeron o superiori, oppure Cyrix 6x86 o Cyrix_mii, scegliete PPro/6x86MX * Maximum Physical Memory: scegliete 1GB se avete meno di 1 GB, 2GB altrimenti * Math emulation: 'n' ('y' solo se avete un 386 o 486 sx senza coprocessore) * MTRR (Memory Type Range Register) support: 'y', anche se il vostro processore non lo supporta * Symmetric multi-processing support: 'y' solo se avete più processori (nello STESSO computer!) _________________________________________________________________________________________________________ 3.2.3. Loadable module support * Enable loadable module support: 'y' * Set version information on all symbols for modules: 'n' * Kernel module loader: 'y' _________________________________________________________________________________________________________ 3.2.4. General setup * Networking support: 'y' SEMPRE, serve almeno per il dispositivo di loopback. least need it for loopback interface * PCI support: 'y', tranne se avete vecchi PC senza bus PCI * PCI access mode: Any * PCI quirks: 'y' * PCI bridge optimization (experimental): 'n' * Backward-compatible /proc/pci: 'y' * MCA support: 'n', tranne che per vecchi PC IBM con bus Microchannel * SGI Visual Workstation support: 'n' * System V IPC: 'y' * BSD Process Accounting: 'y' * Sysctl support: 'y' * Kernel support for a.out binaries: 'm' * Kernel support for ELF binaries: 'y' * Kernel support for MISC binaries: 'm' * Kernel support for JAVA binaries (obsolete): 'n' * Parallel port support: 'y' or 'm', a scelta. * PC-style hardware: 'm' * Support foreign hardware: 'n' * Advanced Power Management BIOS support: 'y' solo nei portatili (nei PC Desktop potrebbe causare kernel panic e OOPS). Tutte le opzioni che seguono sono disponibili solo se questa opzione è 'y' * Ignore USER SUSPEND: 'n' * Enable PM at boot time: 'n' * Make CPU Idle calls when idle: 'n' * Enable console blanking using APM: 'y' * Power off on shutdown: 'y' * Ignore multiple suspend: 'y' * Ignore multiple suspend/resume cycle: 'y' * RTC stores time in GMT: 'y' solo se il PC è impostato sull'ora di Greenwich invece di quella locale * Allow interrupts during APM BIOS calls: 'n' _________________________________________________________________________________________________________ 3.2.5. Plug and Play support * Plug and Play support: 'y' * Auto-probe for parallel devices: 'm' se avete periferiche su porta parallela, altrimenti 'n' _________________________________________________________________________________________________________ 3.2.6. Block devices * Normal PC floppy disk support: 'm' * Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support: 'y' se si hanno periferiche IDE * Use old disk-only driver on primary interface: 'n' * Include IDE/ATA-2 DISK support: 'y' se avete pariferiche IDE da cui volete fare il boot (se avete dischi IDE ma partite da SCSI, mettete 'm') * Include IDE/ATAPI CDROM support: 'm' se avete un CDROM IDE * Include IDE/ATAPI TAPE support: 'y' o 'm' solo se avete periferiche di backup a nastro IDE * Include IDE/ATAPI FLOPPY support: 'y' o 'm' solo se avete periferiche floppy IDE, tipo ZIP * SCSI emulation support: 'm' se avete un masterizzatore IDE * CMD640 chipset bugfix/support: 'y' se avete questo chip ('n' se avete solo periferiche SCSI) * CMD640 enhanced support: 'n' * RZ1000 chipset bugfix/support: 'y' se avete questo chip ('n' se avete solo periferiche SCSI) * Generic PCI IDE chipset support: 'y' * Generic PCI bus-master DMA support: 'y' * Boot off-board chipsets first support: 'n' * Use DMA by default when available: 'y' * [...VARIE]: attivate le varie opzioni in base al vostro PC (in genere, 'n' a tutte) * Loopback device support: 'm' * Network block device support: 'n' * Multiple devices driver support: 'n' a meno che non vogliate provare il RAID software (leggete il RAID-HOWTO) * RAM disk support: 'n' * XT hard disk support: 'n' -- what, you still have disks like this? :) * Parallel port IDE device support: 'm' se avete qualche periferica IDE su porta parallela, tipo CDROM (e selezionate il driver opportuno), 'n' altrimenti * Compaq SMART2 support: 'n' _________________________________________________________________________________________________________ 3.2.7. Networking options * Packet socket: 'm' * Kernel/User netlink socket: 'y' * Routing messages: 'n' * Netlink device emulation: 'm' * Network firewalls: 'y' se volete abilitare il supporto per il firewalling e masquerading * Socket filtering: 'n' * UNIX domain sockets: 'y' altrimenti X-window non si avvierà * TCP/IP networking: 'y' * IP: multicasting: 'n' * IP: advanced router: 'y' se volete usare il PC come router o per fare il masquerading di una rete locale verso Internet * [...VARIE]: in genere, 'n' a tutte * IP: firewalling: 'y' se volete configurare firewall e masquerading. Se volete attivare quest'ultimo, DOVETE rispondere 'y' anche a "IP: always defragment", "IP: masquerading" e "IP: ICMP masquerading" * IP: firewall packet netlink device: 'y' * IP: transparent proxy support: 'y' * IP: masquerading: 'y' per attivare il masquerading * IP: ICMP masquerading: 'y' per attivare il masquerading * IP: masquerading special modules support: 'n' * IP: optimize as router not host: 'y' per attivare il masquerading e il router * [...VARIE]: in genere, 'n' a tutte * IP: TCP syncookie support: 'y' per prevenire il D.O.S. da SYN-FLOOD * IP: Reverse ARP: 'n' * IP: Allow large windows (not recommended if <16MB of memory): 'y' * CPU is too slow to handle full bandwidth: 'n', tranne se siete connessi a interfacce a larga banda (gigabit Ethernet, FDDI, etc.) * [...VARIE]: in genere, 'n' a tutte, tranne se dovete collegarvi a reti Novell, nel qual caso attivate "The IPX protocol" _________________________________________________________________________________________________________ 3.2.8. QoS and/or fair queueing * QoS and/or fair queueing: 'n' (il resto è disabilitato di conseguenza) _________________________________________________________________________________________________________ 3.2.9. Telephony Support * Linux Telephony Support: 'n' (il resto è disabilitato di conseguenza) _________________________________________________________________________________________________________ 3.2.10. SCSI support * SCSI support: 'y' se avete uno o più adattatori e periferiche SCSI oppure un drive ZIP parallelo o un masterizzatore, 'n' altrimenti. * SCSI disk support: 'y' (e non 'm') per se fate il boot da un disco SCSI, altrimenti non riuscirete ad avviare il sistema! * SCSI tape support: 'm' se avete periferiche a nastro SCSI * SCSI CDROM support: 'm' se avete CDROM SCSI * Enable vendor-specific extensions (for SCSI CDROM): 'y' se avete CDROM SCSI Nec, Toshiba o masterizzatori HP * SCSI generic support: 'm' se avete un masterizzatore, IDE o SCSI * Probe all LUNs on each SCSI device: 'n' * Verbose SCSI error reporting (kernel size +=12K): 'n' * SCSI logging facility: 'n' _________________________________________________________________________________________________________ 3.2.11. SCSI low-level drivers * [...VARIE]: in genere, 'n' a tutte, tranne che per il vostro eventuale adattatore SCSI * IOMEGA parallel port (ppa - older drives): 'm' se avete uno dei primi modelli di ZIP parallelo * IOMEGA parallel port (imm - newer drives): 'm' se avete uno degli ultimi modelli di ZIP parallelo * [...VARIE]: in genere, 'n' a tutte, tranne che per il vostro eventuale adattatore SCSI _________________________________________________________________________________________________________ 3.2.12. Network device support * Network device support: 'y' se avete una scheda di rete o per collegarvi a Internet * Dummy net driver support: 'm' * [...VARIE]: in genere, 'n' a tutte * PLIP (parallel port) support: 'm' se volete creare una rete con cavi paralleli PLIP, altrimenti 'n' * PPP (point-to-point) support: 'y' o 'm' se volete collegarvi a Internet via modem * [...VARIE]: in genere, 'n' a tutte _________________________________________________________________________________________________________ 3.2.13. ARCnet devices * ARCnet devices: 'n' _________________________________________________________________________________________________________ 3.2.14. Ethernet (10 or 100Mbit) * ETHERNET (10 or 100Mbit): 'y' se avete uno o più adattatori di rete Ethernet * [...VARIE]: in genere, 'n' a tutte tranne che per il vostro modello di scheda _________________________________________________________________________________________________________ 3.2.15. Ethernet (1000 Mbit) * [...VARIE]: in genere, 'n' a tutte _________________________________________________________________________________________________________ 3.2.16. Appletalk devices * Dovrebbe essere disattivato, altrimenti 'n' a tutte _________________________________________________________________________________________________________ 3.2.17. Token ring devices * [...VARIE]: in genere, 'n' a tutte _________________________________________________________________________________________________________ 3.2.18. Wan interfaces * [...VARIE]: in genere, 'n' a tutte _________________________________________________________________________________________________________ 3.2.19. Amateur Radio support * [...VARIE]: in genere, 'n' a tutte _________________________________________________________________________________________________________ 3.2.20. IrDA subsystem support * IrDA subsystem support: 'y' o 'm' se avete una porta a infrarossi (tipicamente i portatili) * IrLAN protocol: 'y' o 'm' se avete abilitato IrDA e avete un sistema di emulazione di rete Ethernet * IrCOMM protocol: 'y' o 'm' se avete abilitato IrDA e avete un sistema di emulazione di porta seriale * IrLPT protocol: 'y' o 'm' se avete abilitato IrDA e avete un sistema di emulazione di porta parallela, e abilitate il supporto client o server * IrDA protocol options: 'y' * Cache last LSAP: 'y' * Fast RRs: 'n' (guardate l'help) * Debug information; 'n' * IrLAP compression: 'n' _________________________________________________________________________________________________________ 3.2.21. Infrared-port device drivers * IrTTY (uses Linux serial driver): 'y' o 'm' * IrPORT (IrDA serial driver): 'y' o 'm' * [...VARIE]: in genere, 'n' a tutte tranne che per il vostro modello di chip _________________________________________________________________________________________________________ 3.2.22. ISDN subsystem * ISDN support: 'y' se avete un adattatore ISDN interno * Support synchronous PPP: 'y' se vi connettete a Internet * Use VJ-compression with synchronous PPP: chiedete al provider se è supportata * Support generic MP (RFC 1717): 'n' (guardate l'help) * Support audio via ISDN: 'n' (guardate l'help) * Support ISDN diversion services: 'n' (guardate l'help) e nel caso abilitate "Support AT-FAX Class 2 commands" * [...VARIE]: in genere, 'n' a tutte tranne che per il vostro modello di scheda _________________________________________________________________________________________________________ 3.2.23. Old CD-ROM drivers (not SCSI, not IDE) * Old CD-ROM drivers (not SCSI, not IDE): 'n', tranne che per vecchi modelli di CDROM con interfaccia proprietaria _________________________________________________________________________________________________________ 3.2.24. Character devices * Virtual terminal: 'y' * Support for console on virtual terminal: 'y' * Standard/generic (dumb) serial support: 'y' * Support for console on serial port: 'n' * Extended dumb serial driver options: 'n' * Non-standard serial port support: 'n' * Unix98 PTY support: 'y' e lasciate il valore "Maximum number of Unix98 PTYs in use (0-2048)" al default, 256 * Parallel printer support: 'm' se avete una stampante parallelaif you have a parallel port printer * Support IEEE1284 status readback: 'y' * Mouse Support (not serial mice): 'y' in genere, ma guardate l'help e attenti ai laptop. Se avete un mouse seriale, scegliete 'n' * QIC-02 tape support: 'y' se avete un sistema di backup a nastro non SCSI (esclusi quelli su controller floppy, altre informazioni nel seguito) * Watchdog Timer Support: 'n' * /dev/nvram support: 'n' * Enhanced Real Time Clock Support: 'y' * Double Talk PC internal speech card support: 'n' _________________________________________________________________________________________________________ 3.2.25. Mice * [...VARIE]: in genere, 'n' a tutte tranne che per il vostro modello di mouse (esclusi i seriali, guardate sopra) _________________________________________________________________________________________________________ 3.2.26. Joysticks * [...VARIE]: in genere, 'n' a tutte tranne che se volete il supporto per i joystick, e sceglietene il modello _________________________________________________________________________________________________________ 3.2.27. Watchdog Cards * Dovrebbe essere disattivato, altrimenti 'n' a tutte _________________________________________________________________________________________________________ 3.2.28. Video For Linux * [...VARIE]: in genere, 'n' a tutte tranne che se volete il supporto per una scheda di acquisizione video, radio o Quickcam, e sceglietene il modello _________________________________________________________________________________________________________ 3.2.29. Ftape, the floppy tape device driver * Ftape (QIC-80/Travan) support: 'y' se avete un drive a nastro connesso al controller dei floppy disk _________________________________________________________________________________________________________ 3.2.30. Filesystems * Quota support: 'n' tranne che se volete stabilire delle quote di disco per gli utenti (in genere sui server) * Kernel automounter support: 'n' tranne se volete che i device vengano montati in automatico * ADFS filesystem support (read only) (EXPERIMENTAL): 'n' tranne se volete accedere a filesystem Acorn * Amiga FFS filesystem support: 'n' tranne se volete accedere a filesystem Amiga * Apple Macintosh filesystem support (experimental): 'n' tranne se volete accedere a filesystem Macintosh * DOS FAT fs support: 'y' or 'm' per poter accedere a dischi o partizioni MS-DOS/Windows da Linux * MSDOS fs support: 'm' * UMSDOS: Unix-like filesystem on top of standard MSDOS filesystem: 'n' * VFAT (Windows-95) fs support: 'm' (comprende il supporto a FAT32) * ISO 9660 CDROM filesystem support: 'm' * Microsoft Joliet CDROM extensions: 'y' * Minix fs support: 'n' * NTFS filesystem support (read only): 'n' tranne se volete accedere a filesystem Windows NT (il supporto in scrittura è PERICOLOSO) * OS/2 HPFS filesystem support (read only): 'n' tranne se volete accedere a filesystem OS/2 * /proc filesystem support: 'y' * /dev/pts filesystem for Unix98 PTYs: 'y' * QNX filesystem support (EXPERIMENTAL): 'n' tranne se volete accedere a filesystem QNX * Second extended fs support: 'y' * [...VARIE]: in genere, 'n' a tutte _________________________________________________________________________________________________________ 3.2.31. Network File Systems * Coda filesystem support (advanced network fs): 'n' * NFS filesystem support: 'y' se il vostro PC è un client NFS * NFS server support: 'y' se il vostro PC è un server NFS, e nel caso lasciate a 'n' "Emulate SUN NFS server" * SMB filesystem support (to mount WfW shares etc.): 'y' se volete montare partizioni di rete da server Windows (9x o NT). NON serve per creare un server Samba (per questo serve appunto Samba), ma solo per accedere ad altre partizioni * NCP filesystem support (to mount NetWare volumes): 'y' se volete montare partizioni di rete da server Novel NetWare, altrimenti 'n' _________________________________________________________________________________________________________ 3.2.32. Partition Types * [...VARIE]: in genere, 'n' a tutte _________________________________________________________________________________________________________ 3.2.33. Native Language Support * [...VARIE]: in genere, 'n' a tutte tranne a quelle seguenti: * Codepage 437 (United States, Canada): 'm' * Codepage 850 (Europe): 'm' * NLS ISO 8859-1: 'm' * NLS ISO 8859-15: 'm' _________________________________________________________________________________________________________ 3.2.34. Console drivers * [...VARIE]: in genere, 'n' a tutte tranne a quelle seguenti: * VGA text console: 'y' * Video mode selection support: 'y' se volete usare il framebuffer (per accedere alle schede video VESA non supportate altrimenti e per avere un pinguino al boot ;-) ). Serve comunque un X-Server * Support for frame buffer devices (EXPERIMENTAL): 'y' se volete attivare il framebuffer * VESA VGA graphics console: 'y' se volete attivare il framebuffer _________________________________________________________________________________________________________ 3.2.35. Sound * [...VARIE]: in genere, 'n' a tuttetranne a quelle seguenti: * Sound card support: 'm' se avete una scheda audio, e selezionate il driver opportuno _________________________________________________________________________________________________________ 3.2.36. Additional low level sound drivers * [...VARIE]: in genere, 'n' a tutte, o selezionate il driver opportuno _________________________________________________________________________________________________________ 3.2.37. Kernel hacking * Magic SysRq key: 'n' _________________________________________________________________________________________________________ 3.3. Compilazione e installazione Fatto tutto questo, salvate con l'opzione apposita, incrociate le dita e date: make dep && make clean && make bzImage && make modules uscite e andate a farvi un caffè o una lunga passeggiata (con un processore a 200 MHz servono in genere una quindicina di minuti, regolatevi!) Non è come aspettare un figlio, ma la prima volta ci si ritrova con le unghie completamente rosicchiate ;-). Se tutto è andato bene, il vostro nuovo bambino... ehm, kernel, è contenuto nel file '/usr/src/linux/arch/i386/boot/bzImage'. Complimenti! Ora bisogna installare il tutto. Per prima cosa i moduli. Se avete ricompilato la stessa versione di kernel che state già usando, dovete spostare la directory con la versione precedente dei moduli, prima di installarli (se avete compilato una versione diversa da quella in uso, potete saltare il primo dei due comandi seguenti): mv /lib/modules/VERSIONE_KERNEL /lib/modules/VERSIONE_KERNEL.old make modules_install Fatto questo, controllate se nella directory '/boot' esistono i seguenti file: ls -l /boot/System.map /boot/vmlinuz come prima, se il primo carattere è una 'l' si tratta di collegamenti (rimuoveteli con rm -f /boot/...), mentre se è '-' si tratta di file (rinominateli con mv -f /boot/NOMEFILE /boot/NOMEFILE-VERSIONE_KERNEL_PRECEDENTE). Ora copiate in '/boot' il kernel e la System-map aggiornate e ricreate i collegamenti (l'esempio si riferisce sempre al kernel 2.2.14): cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.2.14 ln -s /boot/vmlinuz-2.2.14 /boot/vmlinuz cp /usr/src/linux/System.map /boot/System.map-2.2.14 ln -s /boot/System.map-2.2.14 /boot/System.map Se usate 'loadlin', copiate il nuovo kernel nella sua directory (guardate la pagina apposita del Quick&Easy Configuration HOWTO). Mentre se usate 'lilo', modificate il file '/etc/lilo.conf' in modo da avere sia il vecchio kernel che il nuovo (fino a quando non sarete sicuri che quest'ultimo funzioni perfettamente - la parte aggiunta per il nuovo kernel è quella tra le due righe di ###..., e qualcosa potrebbe essere diverso): boot = /dev/hda delay = 5 vga = normal root = /dev/hdb2 # correggere con la vostra partizione di root! read-only image = /boot/vmlinuz.old # controllate o rinominate il vecchio kernel di conseguenza label = oldlinux ################################# image = /boot/vmlinuz # questo è il nuovo kernel label = linux ################################# other = /dev/hda1 label = dos table = /dev/hda e ridate "/sbin/lilo -v" per rimetterlo a posto (man lilo, man lilo.conf o lilo-howto per altre informazioni). Se volete rimuovere lilo, usate il comando "fdisk /mbr" dal DOS, oppure "lilo -U" da Linux. Per la stampante, controllate che il file '/etc/conf.modules' contenga le righe: alias parport_lowlevel parport_pc options parport_pc io=0x378, 0x278 irq=7 auto Se volete provare il kernel prima di usarlo definitivamene, tralasciate per ora tutta la parte dopo "make modules_install" e copiatelo su un dischetto che userete come boot (il floppy NON va montato per eseguire queste operazioni!!!): cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.2.14 cp /usr/src/linux/vmlinuz-2.2.14 /dev/fd0 rdev /dev/fd0 /dev/hda2 rdev -R /dev/fd0 1 Sostituite a /dev/hda2 la vostra partizione di root ('/')!!! Questo è tutto! Nota: Per Debian: dopo aver ricompilato, potete ottenere un pacchetto .deb contenente kernel e moduli e che aggiorna anche in automatico lilo, col seguente comando dato da dentro la dir '/usr/src/linux/' : make-kpkg --revision pingu.0 kernel_image dove potete sostituire pingu.0 con quello che volete. _________________________________________________________________________________________________________ Capitolo 4. Internet In questa sezione viene spiegato come connettersi a Internet da shell, senza l'uso di tool grafici, usando l'autenticazione PAP, ormai fornita da tutti i provider. Con i computer moderni, veloci e stabili anche sotto X-window, può sembrare un controsenso, ma se vi abituerete a fare alcune cose da shell vedrete che sarete molto più produttivi e veloci che sotto X. E poi, per leggere e inviare mail e news, che sono puro testo, è inutile caricare pesanti tool grafici, che spesso crashano sul più bello. Oppure potreste avere problemi col server X, rimanendo tagliati fuori (se postate un messaggio sul perché X non parte, e lo fate da shell, avrete la risposta e potrete configurarvelo a puntino!). Insomma, le ragioni per avere internet ANCHE da shell sono molteplici, quindi procediamo nella configurazione. Nota: Io sono un'anomalia: Linux è bello perché si possono fare le stesse cose in svariati modi. Parto sempre da shell, ma uno dei primi comandi che do è startx, perché il mio Celeron 450 con 256Mb regge bene e mi piace il desktop di KDE. Per avviare la connessione uso kppp perché mi ci trovo bene, ma ero partito da Kmail e Knode per approdare spero DEFINITIVAMENTE a Mutt ed Slrn, veloci ed efficienti come nessun altro programma, e di cui trovate le configurazioni nelle ultime pagine del Quick&Easy Configuration HOWTO. Aggiornamento (31/7/2001): nel mio cammino verso il Nirvana Pinguino, ormai uso solo tool testuali per cose nate testuali e che continuano ad essere ancor'oggi prevalentemente testuali. Ormai uso solo Slrn, Mutt, e le connessioni da console con Pon e Poff. Per Irc e Icq uso Xchat e Licq, ma in caso di emergenza ho sempre sottomano le loro versioni da console ;-). Naturalmente dovete avere il supporto per il protocollo PPP nel kernel (scrivete pppd e se vi escono caratteri strani siete a posto). Vi servono anche i programmi pppd e chat. I parametri per la connessione dovete chiederli al vostro provider, e protestate se vi dicono che Linux non è supportato, con i parametri si può configurare anche una caffettiera! In particolare dovete chiedere gli indirizzi IP dei DNS, che in Windows vengono settati in automatico. Nota: Per conoscere in Windows gli IP dei DNS (in caso vengano assegnati in automatico), per poterli inserire in Linux, che invece li richiede obbligatoriamente, eseguite (tramite la voce Esegui... del Menu d'Avvio o Start) il comando winipcfg DOPO esservi collegati a internet, poi cliccate su Dettagli >> e guardate la seconda voce (DNS) della schermata che vi trovate davanti: quello che vedete è l'IP del DNS primario del provider che state usando, mentre premendo il tasto con i 2 punti ".." avrete l'IP del DNS secondario. Per prima cosa configurate il modem, creando se non già presente un link tra il dispositivo seriale e il modem. Ricordate che in Linux le seriali corrispondono a /dev/ttySX, dove X vale 0 per COM1, 1 per COM2 e così via (NON usate più le vecchie /dev/cuaX, ormai cadute in disuso e deprecate). Nel mio sistema il modem è connesso a COM2, quindi il collegamento sarà: ln -sf /dev/ttyS1 /dev/modem Prima di continuare una nota: esistono in giro dei FALSI modem, non perché contengano mattoni, alla napoletana ;-), ma perché hanno una parte della logica di controllo implementata via software. E qual è il software più diffuso, purtroppo? Quello di zio Bill! Per questo sono anche chiamati softmodem o winmodem. La quasi totalità di quelli interni PCI sono winmodem (scrivo quasi perché non sono a conoscenza di modem interni PCI non soft, quindi non posso escluderlo a priori). Anche alcuni esterni sono winmodem. Se il vostro modem è un Cosexant, o un Motorola SM56, o un Soft56k e compagnia, solo per citare quelli che più si trovano in giro, mettetevi l'anima in pace e non cominciate nemmeno a configurare internet con Linux. Qualche speranza la potreste avere con i Lucent, integrati anche in vari PC portatili, in quanto esiste un driver binario sperimentale che sembra funzionare. Niente da fare invece per gli USB: per ora non c'è alcun supporto, speriamo che qualcosa si muova dopo l'uscita dei kernel 2.4.x, che incominceranno a supportare anche l'USB. Nota: Aggiornamento: pare che ultimamente le cose si siano smosse e finalmente alcuni Winmodem inizino a funzionare anche con Linux. Pare che ora i modem Conexant e altri funzionino, ma non so quanto bene. Forse funziona anche qualche modem USB, ma per maggiori dettagli riferitevi a http://www.linmodems.org. Continuiamo. Lanciate minicom da utente root, se tutto procede bene dovreste ottenere un output come il seguente: AT S7=45 S0=0 L1 V1 X4 &C1 E1 Q0 OK Uscite da minicom con CTRL-A X Invio. Create o modificate tutti i file seguenti, cambiando i parametri di DNS, dominio, numero di telefono, nome utente e password. === file: /etc/resolv.conf === # cambiate dominio e DNS (se avete impostato un DNS locale, sostituite # a libero.it il vostro dominio, e a nameserver il valore 127.0.0.1) domain libero.it nameserver 195.210.91.1 nameserver 195.210.91.2 === file: /etc/ppp/pon === #!/bin/sh # NON lasciate spazi dopo la \ alla fine delle righe seguenti # e sostituite il vostro nome utente alla fine dell'ultima riga /usr/sbin/pppd connect "/usr/sbin/chat -v -f /etc/ppp/ppp-chat" noauth \ /dev/modem 57600 deflate 12,12 crtscts debug lock modem nodetach \ defaultroute noipdefault login noproxyarp asyncmap 0 hide-password \ ipcp-accept-remote lcp-echo-interval 30 lcp-echo-failure 8 user mionomeutente & # aggiungete le 2 opzioni seguenti alla riga precedente per avviare in automatico # la connessione non appena pppd riscontra traffico sulla seriale # demand idle 30 # i messaggi d'errore sono inviati dal pppd verso il syslog, da dove potrete # leggerli da root con il comando: tail -n 25 -f /var/log/messages === file: /etc/ppp/poff === #!/bin/sh kill -INT `cat /var/run/ppp0.pid` === file: /etc/ppp/pap-secrets === #inserite qui il vostro nome utente e la vostra password mionomeutente * miapassword === file: /etc/ppp/ppp-chat === # Cambiate la stringa di init e il numero del vostro ISP alla fine TIMEOUT 30 ABORT BUSY ABORT ERROR ABORT 'NO CARRIER' ABORT 'NO DIALTONE' ABORT 'Invalid Login' ABORT 'Login incorrect' '' '+++AT&FB40&K44X3S2=128' OK 'ATDT096851010' CONNECT '' Ora date tutti i seguenti comandi, per consentire anche ad un utente comune di avviare e chiudere la connessione. chmod 750 /etc/ppp/pon chmod 750 /etc/ppp/poff chmod 600 /etc/ppp/pap-secrets ln -sf /etc/ppp/pon /usr/bin ln -sf /etc/ppp/poff /usr/bin Ora verificate che esista un gruppo degli utenti che possono usare il ppp. Controllate che in /etc/group ci sia una riga simile alla seguente, altrimenti inseritela, magari usando il comando addgroup: pppusers:x:230: e modificatela come la seguente, inserendo alla fine separati da virgole i nome degli utenti che possono collegarsi: pppusers:x:230:VostroNomeDiLogin,AltroUtentePpp Continuate a dare i comandi seguenti: chown root.pppusers /dev/ttyS1 chmod 664 /dev/ttyS1 chown root.pppusers /etc/ppp/pon chown root.pppusers /etc/ppp/poff chown root.pppusers /usr/bin/pon chown root.pppusers /usr/bin/poff chmod a+s /usr/sbin/pppd chmod a+s /usr/sbin/chat ln -sf /usr/sbin/pppd /usr/bin ln -sf /usr/sbin/chat /usr/bin Per un minimo di sicurezza, modificate i file /etc/hosts.allow e /etc/hosts.deny come segue (ed eliminate da /etc/inetd.conf i servizi che non vi servono, cioè tutti tranne auth, commentandoli con #; se avete configurato un news server locale lasciate attivo anche nntp): === file: /etc/hosts.allow === ALL:127.0.0.1 === file: /etc/hosts.deny === ALL:ALL Potete avviare ed arrestare automaticamente dei programmi insieme alla connessione, tramite i file script /etc/ppp/ip-up e /etc/ppp/ip-down, che vengono richiamati dal pppd in automatico appena la connessione è attiva e quando non è più presente. ecco alcuni esempi: === file: /etc/ppp/ip-up === #!/bin/sh # inserite le righe alla fine di quanto eventualmente # già presente e prima di un eventuale exit 0 # avvia il proxy server in modalità online wwwoffle -online # attiva il firewall /usr/sbin/firewall start # invia la posta in giacenza sendmail -q # scarica le news usenet fetchnews # scarica la posta dell'utente mrshark ricontrollando ogni 300 secondi su mrshark -c "fetchmail -d 300" === file: /etc/ppp/ip-down === #!/bin/sh #interrompe lo scaricamento della posta su mrshark -c "fetchmail -q" # abbatte il firewall /usr/sbin/firewall stop # pone il proxy server in modalità offline wwwoffle -offline Dovreste essere a posto, ora potrete avviare la connessione con pon e abbatterla con poff. E invece NO! Il pon funziona anche da utente, mentre il poff no, perché non è permesso ad un utente che non sia root di abbattere la connessione ppp. Il PPP-Howto suggerisce, se non volete loggarvi come root, di spegnere il modem o staccare il cavo della linea telefonica, oppure usare il programma sudo per concedere questo diritto anche agli utenti. _________________________________________________________________________________________________________ Capitolo 5. Postfix Nota: Questa parte è un'estensione del mini-postfix-howto di AGX, autore della distribuzione italiana BadPenguin, e a cui va il merito di buona parte di questa sezione. Postfix vi permette di avere nel vostro computer un vero e proprio server SMTP, che vi permette di inviare la posta da locale e che nulla ha da invidiare a quello del vostro provider! È preferibile al più diffuso Sendmail per ragioni di sicurezza, facilità di configurazione e di manutenzione. Prima di installarlo, rimuovete sendmail (le istruzioni sono in fondo alla pagina), altrimenti avrete conflitti tra i due. _________________________________________________________________________________________________________ 5.1. Configurazione di Postfix Innanzitutto assicuratevi che parta ad ogni avvio, controllate che in /etc/rc.d/init.d (o l'equivalente della vostra distribuzione) ci sia lo script postfix e date chkconfig --add postfix, oppure aggiungete postfix start a /etc/rc.d/rc.local (o equivalente). Modificate /etc/postfix/aliases in modo che la posta indirizzata all'utente root venga ricevuta da un utente realmente esistente (è pericoloso gestire la posta da root, potreste perderla tutta, ricordatelo!), inserendo o modificando l'ultima riga come segue: # Basic system aliases -- these MUST be present. MAILER-DAEMON: postmaster postmaster: root # General redirections for pseudo accounts. bin: root daemon: root games: root ingres: root nobody: root system: root toor: root uucp: root # Well-known aliases. manager: root dumper: root operator: root # trap decode to catch security attacks decode: root # Person who should get root's mail root: nome_utente_esistente Consiglio di lasciare che postfix contatti l'SMTP del vostro provider, perché sempre più spesso i server per evitare lo spam fanno dei controlli sull'origine dei messaggi tramite delle interrogazioni ai DNS, e a meno che non abbiate registrato un dominio vostro, NON vi troveranno altrimenti, e la posta resterà nel vostro spool! Consiglio inoltre di impostare l'opzione defer_transports=smtp in /etc/postfix/main.cf per evitare che postfix continui ad interrogare internet per cercare di inviare la posta: a collegamento avvenuto potete usare sendmail -q o postfix flush per inviare tutto (potete inserire il comando in /etc/ppp/ip-up, in modo da fare tutto in automatico a connessione stabilita). Il comando mailq (o sendmail -bp) vi fornisce informazioni sullo stato del vostro spool SMTP, quali e quanti messaggi sono ancora accodati e altro ancora. Per sapere quando la coda è vuota, potete usare il seguente script: #!/bin/sh /usr/sbin/sendmail -q sleep 10 while mailq | grep '^[^ ]*\*' >/dev/null do sleep 10 done Altri comandi utili sono postfix start (avvia postfix), postfix reload (per far sì che postfix rilegga il file di configurazione dopo eventuali cambiamenti), postfix stop (ferma postfix), postfix check (controlla la configurazione di postfix). Ecco un esempio di file /etc/postfix/main.cf (le poche righe da modificare sono indicate all'inizio del file, e eventuali altri parametri presenti nel vostro file main.cf possono essere lasciati al loro valore di default): #- file di configurazione principale di Postfix #- I parametri che DOVETE cambiare sono i seguenti, seguendo le istruzioni #- date nel file. In particolare, per il relayhost, fate il comando seguente: #- nslookup smtp.vostro.provider #- per conoscere l'IP dell'SMTP del vostro provider, e sostituitelo tra le #- parentesi quadre, LASCIANDOLE! #- "myhostname", "mydomain" e "relayhost" #- la directory della coda di postfix queue_directory = /var/spool/postfix #- la directory dove risiedono i programmi di postfix (gli RPM di solito li #- installano in /usr/sbin, cambiate di conseguenza per altre installazioni) program_directory = /usr/sbin #- la directory dove risiedono tutti i programmi del tipo postXXX command_directory = $program_directory #- la directory che contiene i demoni di postfix daemon_directory = /usr/lib/postfix #- il possessore dei processi di postfix. Usate un utente dedicato, con #- privilegi minimi, e che non sia daemon o nobody, e CREATELO!!! mail_owner = postfix #- i privilegi di default dell'agente di smistamento locale default_privs = nobody #- la directory di spool di default, dove finiscono le email in arrivo mail_spool_directory = /var/spool/mail #- il programma usato per lo smistamento locale delle email. Correggete #- eventualmente il path. In genere per sicurezza è meglio richiamare #- procmail quì, piuttosto che da fetchmail mailbox_command = /usr/bin/procmail #- il nome COMPLETO del vostro host, compreso il dominio myhostname = pingu.mrshark.home #- il nome del vostro dominio mydomain = mrshark.home #- il dominio che risulterà l'origine per le email smistate localmente myorigin = $mydomain #- l'elenco di domini che postfix condidererà locali, per i queli cioè #- verranno smistate le email direttamente, senza interpellare l'esterno mydestination = $myhostname, localhost.$mydomain, $mydomain #- le interfacce di rete da cui accettare email, in genere tutte inet_interfaces = all #- il banner riportato da postfix quando lo si contatta smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) #- il metodo di trasporto delle email usato di default default_transport = smtp #- l'elenco degli IP delle reti attaccate al computer, ritenute come locali. #- Per un computer singolo basta solo 127.0.0.0/8, mentre per reti più ampie #- aggiungete le relative sottoreti, usando le maschere opportune mynetworks = 127.0.0.0/8, 192.168.0.0/24 #- l'SMTP del vostro provider, cui verranno inviate le email in uscita. #- Se volete che postfix contatti direttamente l'SMTP di destinazione, #- commentate la riga seguente. Le [] evitano la risoluzione del nome #- da parte del DNS, accelerando le operazioni (se inserite l'ip è meglio) relayhost = [mail.libero.it] #- disabilita la risoluzione dei nomi di dominio. Se usate quest'opzione, #- DOVETE usare l'indirizzo IP dell'SMTP del vostro provider per il parametro #- relayhost visto in precedenza (usate "nslookup smtp.vostro.provider" ...) disable_dns_lookups = yes #- informa il postmaster di possibili problemi con il mail-server notify_classes = resource, software, bounce, policy, protocol #- questo evita connessioni indesiderate spontanee via PPP defer_transports = smtp #- questi lasciateli come sono, indicano i limiti per le operazioni simultanee local_destination_concurrency_limit = 2 default_destination_concurrency_limit = 10 #- riscrive gli header mascherandoli, in modo che appaiano come tutti #- provenienti come da un unico host, utile sia in dial-up che in rete. #- Usatelo in unione ai file XXX_canonical, spiegati di seguito masquerade_domains = $mydomain #- l'elenco degli alias di sistema alias_maps = hash:$config_directory/aliases alias_database = hash:$config_directory/aliases #- usate questi file per specificare come riscrivere gli indirizzi in uscita #- (in seguito è presente un esempio). Potete usare il solo canonical sia per #- gli indirizzi in ingresso che per quelli in uscita, oppure usare i file #- sender_canonical e recipient_canonical per essere più precisi. Se presenti #- tutti, comunque il file canonical è l'ultimo ad essere processato, perché #- il più generico. In genere basta usare solo il file sender_canonical, #- commentate gli altri. Se ad esempio inviate una email come utente locale pippo, #- verrà riscritta in uscita come se fosse inviata da pippo@libero.it, per esempio #canonical_maps = hash:$config_directory/canonical #recipient_canonical_maps = hash:$config_directory/recipient_canonical sender_canonical_maps = hash:$config_directory/sender_canonical #- usate questo file per riscrivere gli indirizzi delle email in ingresso, in modo #- che se contengono uno dei vostri indirizzi email pubblici, vengano riscritti #- come se fossero diretti al vostro utente locale indicato (un esempio in seguito) virtual_maps = hash:$config_directory/virtual #- anti-spam! Confronta gli header delle email con quelli riconosciuti come spammers, #- e in tal caso scarta l'email. Rallenta leggermente il processo! La prima riga #- definisce i server usati per il controllo, la seconda e la terza impongono delle #- restrizioni, la quarta definisce un file aggiuntivo in cui inserire delle espressioni #- regolari tramite le quali scartare a priori email potenzialmente pericolose, come il #- famoso virus I-Love-You. NON va fatto il postmap! La quinta richiede che l'MTA invii #- un comando HELO per stabilire la connessione, cosa che i software di spam di solito #- non fanno, mentre gli MTA veri fanno quasi sempre! maps_rbl_domains = blackholes.mail-abuse.org, dialups.mail-abuse.org, rbl.maps.vix.com, dul.maps.vix.com smtpd_client_restrictions = permit_mynetworks, reject_maps_rbl, reject_unknown_hostname smtpd_sender_restrictions = permit_mynetworks, reject_unknown_sender_domain #header_checks = regexp:$config_directory/header_checks smtpd_helo_required = yes #- Se volete un backup TOTALE di tutto quello che passa attraverso Postfix, #- togliete il commento dalla riga seguente e modificate l'indirizzo email. #- L'indirizzo indicato riceverà in copia nascosta (BCC) tutte le email!!! #always_bcc = indirizzo.email@backup.com Nota: Se volete gestire più domini virtuali sul vostro server, per fare in modo che le email che dovrebbero essere smistate in locale non vadano a zonzo per internet prima di essere consegnate, dovete elencare TUTTI i domini che sono LOCALI nella direttiva mydestination, separandoli con virgole. Ora create i file per far corrispondere i vostri indirizzi email ai vostri utenti locali. Si tratta dei file /etc/postfix/sender_canonical (che contiene gli indirizzi che verranno inseriti nel campo from per ogni utente al posto di utente@vostra.macchina) e /etc/postfix/virtual (che stabilisce a quali utenti locali vadano inviate le email in base all'indirizzo remoto contenuto). Come esempi ecco i miei file. Questo è il mio /etc/postfix/sender_canonical: root mrshark@libero.it mrshark mrshark@libero.it antonio mrshark@libero.it e questo il mio /etc/postfix/virtual (tutte le email dai miei indirizzi finiscono all'utente locale mrshark): mrshark@linuxfan.com mrshark mrshark@libero.it mrshark mrshark@tiscalinet.it mrshark antonio.fragola@tin.it mrshark Ogni volta che modificate /etc/postfix/aliases dovete rigenerare il database dando il comando: postalias /etc/postfix/aliases mentre se modificate il file /etc/postfix/sender_canonical date: postmap /etc/postfix/sender_canonical oppure per /etc/postfix/virtual date: postmap /etc/postfix/virtual Dopo ogni modifica a qualcuno di questi tre file, dovete riavviare postfix con il comando postfix reload. Ricordate di installare e configurare anche un MDA, come procmail, per far smistare la posta in arrivo in mailbox diverse piuttosto che in una sola di default. Se volete un'analisi dei log di postfix, potete usare il programma in perl pflogsumm, scaricabile da http://home.msen.com/~jimsun/postfix_contrib.html, inserendo con crontab -e una riga tipo la seguente: 0 2 * * * /path/to/pflogsumm.pl -d today /var/log/maillog | mail -s "Postfix Mail Report" root L'utente indicato alla fine della riga precedente riceverà delle email contenenti un'analisi dei log di postfix. _________________________________________________________________________________________________________ 5.2. Disattivazione e disinstallazione di Sendmail Per disattivare sendmail date i seguenti comandi: mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF mv /usr/bin/newaliases /usr/bin/newaliases.OFF mv /usr/bin/mailq /usr/bin/mailq.OFF chmod 755 /usr/sbin/sendmail.OFF /usr/bin/newaliases.OFF /usr/bin/mailq.OFF /usr/sbin/sendmail.OFF -q L'ultimo comando serve a svuotare dalle eventuali email la coda delle email, inviandole. Nota: Per RedHat e Mandrake: se installando postfix vi dice che c'è un conflitto con sendmail, devete prima rimuovere quest'ultimo, magari prima facendovi un backup dei suoi file di configurazione, nel caso (ma quando mai! ;-) ) voleste ritornare indietro. Postfix fornisce dei wrapper per i comandi di sendmail, quindi forzate la rimozione con l'opzione "--nodeps", per ignorare le dipendenze. Se volete semplicemente disattivarlo, fate come mostrato poco fa, altrimenti per disinstallarlo, date i seguenti comandi: mkdir /root/sendmail-old cp /etc/aliases /root/sendmail-old/ cp /etc/sendmail.cf /root/sendmail-old/ cp /etc/sendmail.cw /root/sendmail-old/ cp /etc/mail/* /root/sendmail-old/ rpm -e sendmail sendmail-doc sendmail-cf --nodeps killall sendmail rpm -Uvh postfix-19990906_pl07.i586.rpm (l'ultimo comando potrebbe essere diverso, nel caso abbiate una versione più recente di postfix). Se avevate un'installazione funzionante precedente di sendmail, potete importare i vecchi alias in postfix senza riscriverli tutti, copiando dal backup precedente /root/sendmail-old/aliases in /etc/postfix/aliases e dando il comando newaliases per creare il file aliases.db necessario a postfix. _________________________________________________________________________________________________________ Capitolo 6. Fetchmail Fetchmail è il programma che si occupa di ricevere la posta dalle vostre caselle email remote e passarle a procmail che si occupa dello smistamento locale. È forse il programma più semplice da configurare, basta creare nella propria home un file .fetchmailrc simile al seguente: === file: $HOME/.fetchmailrc === poll popmail.libero.it timeout 60 with proto POP3 user "tuo-nome-utente-remoto" there with password "tua-password-remota" is tuo-login-locale here options fetchall poll pop.tiscalinet.it timeout 60 with proto POP3 user "tuo-nome-utente-remoto" there with password "tua-password-remota" is tuo-login-locale here options keep Le sezioni possono essere ripetute, aggiungendone altre per eventuali altri pop-server. La sintassi è simile all'inglese, quindi: interroga (poll) il server remoto indicato, se non ottieni risposta (timeout) per 60 secondi abortisci, usa il protocollo (proto) POP3, con il nome utente (user) e la password (password) remoti indicati, che corrisponde all'utente (is here) dato e passa tutto quello che ricevi al server smtp locale per lo smistamento tramite procmail (si potrebbe usare l'opzione mda di fetchmail, ma per sicurezza è meglio fare richiamare procmail dall'smtp). options keep mantiene la posta sul server remoto, senza cancellarla dopo averla scaricata, mentre options fetchall scarica tutti i messaggi, sia vecchi che nuovi. Ricordate che il file .fetchmailrc deve avere al piu' attributi 0710 (io uso 0600), altrimenti fetchmail non parte: quindi date nella vostra home-directory un bel: chmod 0710 .fetchmailrc Per ricevere la vostra posta, date dal prompt di shell il comando: fetchmail. Possibili opzioni utili sono: * -v : (anche ripetuto, come -vvvv) che stampa a video un resoconto di quello che sta succedendo, più dettagliato in base a quante v mettete * -c : controlla se c'è nuova posta senza scaricarla * -d n : (dove n indica il numero di secondi), avvia in modalità demone, che controlla e scarica la posta ogni n secondi * -q : interrompe lo scaricamento a intervalli regolari della posta * -a : scarica sia i vecchi che i nuovi messaggi * -k : scarica la posta lasciandola anche sul server remoto * -F : cancella i vecchi messaggi dal server remoto * -l n : non scarica i messaggi di dimensione superiore a quella indicata con n Ricordate di impostare anche procmail per lo smistamento della posta prelevata nelle vostre caselle locali, altrimenti la posta rimane in /var/spool/mail/nomeutente. Attenzione NON USATE LA POSTA DA UTENTE root! È PERICOLOSO, POTRESTE PERDERLA TUTTA! _________________________________________________________________________________________________________ Capitolo 7. Procmail 7.1. Introduzione Procmail è il programma che si occupa di smistare in diverse caselle le email che arrivano dai vostri account pop o direttamente dal sistema. È forse il più complicato tra i programmi che dovrete configurare per la gestione della vostra posta elettronica. Prima di tutto alcune precisazioni su alcune convenzioni che uso: le caselle che contengono email in entrata io le chiamo per comodità IN-qualchecosa, mentre quelle in uscita sono ovviamente OUT-qualcosaltro, e le mailing-lists con ML-ancoraqualcosa. I nomi di file sono interamente in minuscolo, mentre le directory iniziano con una lettera Maiuscola. I file accessori di .procmailrc finiscono con ".rc". Per mia comodità tengo di solito i file di configurazione ausiliari nelle directory di pertinenza del servizio, quindi i file richiamati da .procmailrc sono in $HOME/Mail/.Pm (mentre i file di Mutt sono in $HOME/Mail/.Mutt, i file di Slrn sono in $HOME/News/.Slrn, ecc). Il punto iniziale delle directory serve per nasconderle mentre sfoglio i miei spool con mutt o slrn, per mail e news. Per sicurezza TUTTA la posta in arrivo viene accodata in un file di backup (mostrerò anche come mantenere questo file in formato compresso gzip, per ridurre gli sprechi di spazi), verranno estratte dal flusso in ingresso le email provenienti da persone conosciute (per riinviarle in un file apposito), e quelle provenienti da mailing list (inviate in file univoci per ciascuna), lasciando le email rimanenti nello spool principale. Il file di configurazione di Procmail (.procmailrc, nella vostra directory HOME) è suddiviso in due parti distinte: la prima è la configurazione vera e propria del programma, con variabili e path vari; la seconda invece è fatta dall'insieme delle regole che permettono di smistare la posta nei diversi file mailbox. In particolare, per la seconda parte, è più comodo suddividere le regole in file distinti (da includere nel file principale con la direttiva INCLUDERC), in base al loro uso: ad esempio un file con le regole per le mailing-list, un file per le email da amici, un file per lo spam, e così via. Questa comunque è la strada seguito nel Quick&Easy Configuration HOWTO. Procmail processa messaggi nell'ordine in cui sono scritte le regole, all'interno del file .procmailrc o nei file in esso inclusi, e se non trova alcuna regola adatta accoda il messaggio allo spool principale (ecco perché, senza alcun file .procmailrc, i messaggi finiscono in /var/spool/mail/nomeutente, in genere mailbox di default di un sistema Linux). Le regole di procmail sono composte da espressioni regolari (la sintassi è nella sezione apposita), e possono essere divise in tre parti: 1. una linea di inizio (con possibili flag), :0, seguito da una serie di flags che ne indicano il comportamento (alcune vengono spiegate nel seguito, le altre possono essere trovate in man procmailrc). Il secondo ":" indica che si vuole usare un lockfile sulla mailbox durante il processo, in modo da prevenire una possibile corruzione della stessa in caso di accesso contemporaneo da altri programmi (pensate alla possibile cancellazione di un messaggio con il vostro client mail mentre la mailbox è in fase di elaborazione da procmail). Dopo il ":" si può indicare un nome per il file di lock, altrimenti verrà generato in automatico da procmail. 2. una o più condizioni, identificate da * come primo carattere 3. una linea di smistamento, che può essere un file, una directory o una linea che inizia con | (pipe), che permette di inviare il messaggio in input ad un programma esterno per una qualche elaborazione, o ancora una linea che inizia per !, che permette di inviare una copia del messaggio a ciascun indirizzo email indicato dopo il !. Altre possibilità sono elencate in man procmailrc. _________________________________________________________________________________________________________ 7.2. File di configurazione Questo è un file di configurazione abbastanza generico, può essere usato così com'è, perché le parti variabili (le regole di smistamento) sono contenute in altri file (elencati alla fine di questo) che vengono richiamati da questo principale: === file: .procmailrc === #directory MAILDIR = $HOME/Mail # ASSICURATI CHE ESISTA! Le email finiranno qui! PMDIR = $MAILDIR/.Pm # crea anche questa dir PMSRC = $PMDIR DUMMY=`test -d $MAILDIR || mkdir $MAILDIR` DUMMY=`test -d $PMDIR || mkdir $PMDIR` DUMMY=`test -d $MAILDIR/Sent || mkdir $MAILDIR/Sent` DUMMY=`test -d $MAILDIR/Read || mkdir $MAILDIR/Read` #varie SHELL=/bin/sh LINEBUF=8192 PATH=$HOME/bin:/bin:/usr/bin:/usr/local/bin DEFAULT=$MAILDIR/IN.default # mailbox di default per le email in entrata. Qui finiscono # le email che non sono elaborate o smistate prima da qualche regola adatta. # Se non definito, in generale le email finiscono in /var/spool/mail/nomeutente. DUMMY=`test -f $DEFAULT || touch $DEFAULT` # crea lo spool principale se non esiste FORMAIL=/usr/bin/formail # path di formail, usato per processare alcune email SENDMAIL=/usr/sbin/sendmail # path di sendmail #log VERBOSE = yes # impostare a no dopo il debug LOGABSTRACT = all # produce log MOLTO estesi, impostare a no in seguito LOGFILE = $PMDIR/pm.log # file di log # variabili utili (possono essere usate nelle regole per abbreviarne la scrittura, # ad esempio come $NomeVariabile) NL = " " # nuova linea (un invio tra "") WSPC = " " # blank: spazio + tab SPC = "[$WSPC]" # Regexp: spazio + tab SPCL = "($SPC|$)" # spazio o tab o nuova linea NSPC = "[^$WSPC]" # NON spazio o tab s = $SPC # abbreviazione: come in Perl \s d = "[0-9]" # una cifra -- Perl \d w = "[0-9a-z_A-Z]" # una parola alfanumerica -- Perl \w W = "[^0-9a-z_A-Z]" # NON una parola alfanumerica -- Perl \W a = "[a-zA-Z]" # una parola, solo alfabetica # imposta la variabile DATE come "mese_esteso-anno" # attenzione, gli apici sono inversi, quindi ALT-GR piu' l'apice normale! DATE = `date +%B-%Y` #file .rc aggiuntivi INCLUDERC = $PMDIR/general.rc INCLUDERC = $PMDIR/lists.rc INCLUDERC = $PMDIR/autoreply.rc INCLUDERC = $PMDIR/friends.rc INCLUDERC = $PMDIR/spam.rc # attivate 1 solo di questi filtri antispam #INCLUDERC = $PMDIR/spam2.rc Per usare procmail, dovete istruire i programmi a richiamarlo. Per Fetchmail e Postfix potete trovare le istruzioni nelle relative sezioni del Quick&Easy Configuration HOWTO (si tratta di un rigo per parte), mentre per Sendmail, dovrete creare il file .forward nella vostra directory HOME (questo passo non è necessario se procmail è il gestore locale di default per lo smistamento, come nel caso di Redhat e distribuzioni derivate): === file: .forward === "| IFS=' ' && p=/usr/bin/procmail && test -f $p && exec $p -f- || exit 75 #mrshark" Ricordatevi di sostituire a mrshark il vostro nome di login, e copiate esattamente come vedete, comprese virgolette e apici! In alcuni sistemi potrebbe essere richiesto che il file sia leggibile da tutti e la vostra directory HOME sia attraversabile. Date i comandi seguenti (quello relativo al .procmailrc serve a prevenire che il file venga ignorato dall'MTA, infatti se ha permessi 666 postfix lo ignora e invia la posta in /var/spool/mail/nomeutente): cd chmod 644 .forward chmod 644 .procmailrc chmod a+x . Per controllare i file di log, potete usare lo script mailstat che viene fornito con procmail. Il suo uso è molto semplice, basta avviarlo fornendo come argomento il path del file di log (l'esempio seguente si riferisce alla configurazione impostata nel file .procmailrc precedente): mailstat $HOME/Mail/.Pm/pm.log mailstat fornisce un rapporto sulle email arrivate e smistate a partire dalla volta precedente in cui è stato lanciato lo stesso mailstat: infatti esso dopo l'uso rinomina il file di log precedente con estensione .old e ne ricrea uno vuoto. Avete quindi anche un metodo per tenere entro dimensioni accettabili il file di log, richiamando mailstat! Comunque, dopo aver testato procmail, è utile ridurre i log, impostando VERBOSE=no e LOGABSTRACT=no in .procmailrc. _________________________________________________________________________________________________________ 7.3. File di regole (esempi) === file: general.rc === # backup di tutte le email in ingresso # N.B.: se si vuole un backup compresso, sostituire con quanto segue, senza # iniziale :0c: |gzip -9fc >> .backup.gz #:0c: #.backup # corregge possibili header from errati :0fhw: | $FORMAIL -I "From " -a "From " # emimina i messaggi doppi, copiandoli per sicurezza in un file apposito :0Whc:msgid.lock | $FORMAIL -D 8192 $PMDIR/msgid.cache :0a: .duplicati :0: * ^TO_root IN.admin #correzione vecchi messaggi pgp :0 * !^Content-Type: message/ * !^Content-Type: multipart/ * !^Content-Type: application/pgp { :0 fBw * ^-----BEGIN PGP MESSAGE----- * ^-----END PGP MESSAGE----- | formail -i "Content-Type: application/pgp; format=text; x-action=encrypt" :0 fBw * ^-----BEGIN PGP SIGNED MESSAGE----- * ^-----BEGIN PGP SIGNATURE----- * ^-----END PGP SIGNATURE----- | formail -i "Content-Type: application/pgp; format=text; x-action=sign" } # corregge indicatori di firme errati (maledetto outlook...) :0 fBw * ^--$ | sed -e 's/^--$/-- /' # corregge prefissi di risposta errati (sempre sia maledetto outlook...) :0 fHw * ^Subject:.*R: | sed -e 's/R:/Re:/g' # "impipa" a Little Brother DataBase per conservare # gli indirizzi email di chiunque mi scriva :0hc | lbdb-fetchaddr Nota: Il flag f permette di considerare la pipe seguente come un filtro; il flag h impone che siano inviati anche gli header in pipe; il flag w impedisce che il file di lock sia rilasciato fino a quando il comando in pipe non ha concluso il suo processo. Il flag c permette di far proseguire l'email attraverso il flusso delle regole successive. Quindi in questo caso, essendo la prima regola, TUTTE le email saranno copiate per backup nel file indicato, dopo di che continueranno ad attraversare le altre regole, fino a incontrarne un'altra che effettuerà un confronto positivo (eventualmente facendola proseguire anch'essa con un flag c), e quindi togliendola dal flusso, o finiranno nello spool principale nel caso contrario. Il flag W ha lo stesso comportamento di quello w, ma non invia messaggi di avvertimento sullo schermo ("Program Failure"). Infine il flag a, permette di eseguire un comando SOLO se la regola IMMEDIATAMENTE precedente ha avuto esito positivo (quindi in questo caso se viene trovato un messaggio doppio, viene accodato a ".duplicati"). La macro "TO_" viene spiegato tra poco. Le ultime regole correggono alcuni messaggi che potrebbero risultare errati (vecchi pgp, outlook...), e conservano gli indirizzi nell'archivi di LBDB, un programma che consente di raccogliere informazioni sui mittenti. === file: lists.rc === DUMMY=`test -d $MAILDIR/Lists || mkdir $MAILDIR/Lists` :0: * ^TO_procmail@informatik.rwth-aachen.de Lists/ML-procmail :0: * ^TO_vim@vim.org Lists/ML-vim-$DATE Nota: TO_ è una macro predefinita di procmail che intercetta un indirizzo email fra gli header destinazione (To, Cc, Resent-To, ecc.). Va scritto ESATTAMENTE come lo vedete (* ^TO_indirizzo@email), rispettando spazi e maiuscole. Non inserite simboli < o >. Altre informazioni all'interno di man procmailrc. Suggerimento: Inserite le regole per le mailing-list più trafficate all'inizio di lists.rc, in modo che i messaggi vengano elaborati prima e attraversino meno regole, velocizzando il processo. Nota: Il secondo esempio invece suddivide le email anche in base a mese e anno (la variabile DATE è impostata in .procmailrc), il tutto in automatico (mese e anno sono quelli dello smistamento, NON dell'invio dagli autori alla mailing-list!) ! Le email da mailing-list finiscono in una directory apposita, che viene creata in automatico se non esiste. === file: spam.rc === :0: * ^from.*qualche\.rompi\.balle@spamlandia\.com /dev/null :0: * ^from.*sex /dev/null # free money? Ma andassero a cag**e... :0 * ^Subject:.*\$\$\$ spam # filtro tramite black-list :0 * ? formail -x"From" -x"From:" -x"Sender:" -x"Reply-To:" -x"Return-Path:" -x"To:" | egrep -is -f $PMDIR/black.lst spam # email che non hanno me come destinatario :0: * !^TO .*(mrshark|fragola).* spam # X-Advertisement header = spam! :0: * ^X-Advertisement:.* spam # email indirizzate a nessuno! :0: * To:[ ]*$ spam # header "To:" assente! :0: * !^To: .* spam # campi Message-ID vuoti di solito indicano mailserver # fuori norma, spesso usati per inviare spam. :0 * ^Message-ID.*<> spam Nota: Lo spam finisce dritto dritto nel nulla! Notate l'uso di \. per indicare il punto (ricordate che il punto da solo significa QUALSIASI CARATTERE, quindi anche il punto stesso, ma non fidatevi, potrebbe avere effetti non voluti). /dev/null è un buco nero di sistema (hai capito il pinguino! ;-) ) che disperde qualsiasi cosa ci finisca dentro. Il secondo esempio invece l'ho messo per far vedere che non è necessario mettere .* alla fine: è sottinteso, e in questo caso tutte le email che contengono la stringa sex vengono eliminate. La terza filtra i messaggi che contengono $$$ nel Subject:. Le ultime regole sono spiegate nella sezione seguente dei trucchetti. Attenzione I due file di regole spam.rc e spam2.rc sono attualmente alternativi! Infatti molte delle cose presenti nel primo file sono fatte anche da SpamBouncer, e per filtri specifici potete sempre usare la Black-List. Attivatene quindi un solo file in .procmailrc! === file: friends.rc === :0: * ^from.*gino@pluto\.cxm gino :0: * ^subject.*barzellett { :0c: ! michele@yahoo.com :0: barzellette } Nota: Qui da notare l'uso delle parentesi graffe, che permettono di riunire comandi che devono agire su una stessa email. In questo caso di tutte le email che arrivano e che contengono la stringa barzellett (quindi sia barzelletta che barzellette) nel subject, ne viene generata una copia che viene inoltrata a michele@yahoo.com, dopo di che l'email finisce nella mailbox barzellette e la regola si conclude. _________________________________________________________________________________________________________ 7.4. Usi avanzati e trucchetti 7.4.1. Gestione compatta delle Mailing List Un grazie ad Aldo Maggi (Turms) per la prima regola seguente! ;-) Potete sostituire le regole nel file lists.rc con la sola regola seguente, elencando tra le () tutte le mailing list che avete sottoscritto, separandole con una pipe (|). Dovete inserire solo la parte dell'indirizzo email della ML che compare prima della @ nel campo From delle email che ricevete. :0: * ^TO_\/(debian-lists|pluto-linux|lugroma|cslug|erlug)@ * MATCH ?? ()\/[^@]+ Lists/ML-$MATCH Se volete automatizzare ancora la gestione delle mailing list, potete usare al posto della regola precedente le seguenti, che cercano di intercettare gli header aggiuntivi che di solito vengono aggiunti dai gestori di ML. Questi sono quelli che ho trovato io, se per caso qualche email scappa a queste regole e finisce nella vostra mailbox di default, non dovete fare altro che vedere quale altro header usa il programma che gestisce la ML e aggiungere una nuova regola simile alle seguenti: :0: * ^X-Mailing-List-Name: \/[^@]+ Lists/`echo $MATCH | sed -e 's/[\/]/_/g'` :0: * ^Sender: owner-\/[^@]+ Lists/`echo $MATCH | sed -e 's/[\/]/_/g'` :0: * ^X-BeenThere: \/[^@]+ Lists/`echo $MATCH | sed -e 's/[\/]/_/g'` :0: * ^Delivered-To: mailing list \/[^@]+ Lists/`echo $MATCH | sed -e 's/[\/]/_/g'` :0: * ^X-Mailing-List: <\/[^@]+ Lists/`echo $MATCH | sed -e 's/[\/]/_/g'` :0: * ^X-Loop: \/[^@]+ Lists/`echo $MATCH | sed -e 's/[\/]/_/g'` :0: * ^X-List-ID: <\/[^@\.]+ Lists/`echo $MATCH | sed -e 's/[\/]/_/g'` :0: * ^X-list: \/[^@\.]+ Lists/`echo $MATCH | sed -e 's/[\/]/_/g'` _________________________________________________________________________________________________________ 7.4.2. Salvataggio automatico degli allegati La regola seguente salva tutti gli allegati delle email in entrata in una serie di sottodirectory di $MAILDIR/attach/: le sottodirectory sono create in base alla data, ma potete modificare molto semplicemente lo script per salvarle in altri modi. DATE è definita nello script .procmailrc principale. Per salvare TUTTI gli allegati, questa regola va messa in coda a general.rc La regola ha il flag c, quindi il messaggio poi procede normalmente attraverso le regole seguenti. DUMMY=`test -d $MAILDIR/attach || mkdir $MAILDIR/attach` DUMMY=`test -d $MAILDIR/attach/$DATE || mkdir $MAILDIR/attach/$DATE` METAMAIL_TMPDIR=$MAILDIR/attach/$DATE :0cbhHB: | metamail -q -w -x _________________________________________________________________________________________________________ 7.4.3. Risponditore automatico Le regole seguenti creano dei risponditori automatici, che inviano una email precreata in risposta ad un'altra email con un subject fissato, evitando però di rispondere a mailing list o a messaggi provenienti da noi stessi, e inviando un unico messaggio per persona, anche in presenza di email multiple, usando una cache dei campi From. La seconda regola invece invia in automatico un file (se volete sapere le novità dell'ultima versione del Quick&Easy Configuration HOWTO, mandatemi un'email con subject: "qechowto-update", senza le virgolette e con body vuoto, tanto non lo leggo, visto che vi sarà inviata una risposta automatica ;-) ), conservando comunque l'email in un file nascosto, per sapere chi richiede cosa...). L'ultima regola invia la vostra firma pubblica pgp a chi la richiede. === file: autoreply.rc === :0Whc: vacation.lock * $^To:.*\<$\LOGNAME\> * !^FROM_DAEMON * !^X-Loop: tuo.indirizzo@di.email | formail -rD 8192 vacation.cache :0ehc | (formail -rI"Precedence: junk" \ -A"X-Loop: tuo.indirizzo@di.email" ; \ echo "Ho ricevuto la tua email,"; \ echo "ma non sarò a casa prima di lunedì."; \ echo "-- "; cat $HOME/.signature \ ) | $SENDMAIL -oi -t :0 * !^From +TUO_USERNAME * !^Subject:.*Re: * !^FROM_DAEMON * ^Subject:.*send-file | (formail -r ; cat filename) | $SENDMAIL -oi -t .richieste_file # invia in automatico la chiave pubblica pgp a chi # la richiede indicando nel Subject: "get pgp key" :0 * !^Subject:.*Re: * !^FROM_DAEMON * ^Subject: get pgp key | (/usr/bin/formail -r ; cat $HOME/.pgp_publickey) | $SENDMAIL -oi -t .richieste_pgp _________________________________________________________________________________________________________ 7.4.4. Processare via procmail una mailbox esistente Se dovete/volete far processare una mailbox esistente secondo le regole che avete stabilito per procmail, potete usare il seguente script, preso dai docs ufficiali. Sostituite il percorso di ORGMAIL con quello del vostro effettivo spool o della mailbox da trattare. #!/bin/sh ORGMAIL=/var/spool/mail/$LOGNAME if cd $HOME && test -s $ORGMAIL && lockfile -r0 -l1024 .newmail.lock 2>/dev/null then trap "rm -f .newmail.lock" 1 2 3 13 15 umask 077 lockfile -l1024 -ml cat $ORGMAIL >>.newmail && cat /dev/null >$ORGMAIL lockfile -mu formail -s procmail <.newmail && rm -f .newmail rm -f .newmail.lock fi exit 0 oppure usare il semplice comando: cat nome-file-mbox | formail -s procmail _________________________________________________________________________________________________________ 7.4.5. Killing form Mutt Questo tip è una semplificazione di quello presente in Linux Gazette N. 62. Le regole seguenti, insieme a 2 macro per mutt e a uno script perl, permettono di implementare velocemente un sistema di kill con una semplice combinazioni di tasti, in modo simile alla macro onekey-score.sl del newsreader slrn. Aggiungete queste 2 righe al file .muttrc nella vostra HOME: macro index \ek "| formail -x From: | addysort >> ~/Mail/.Pm/black.lst\n" macro pager \ek "| formail -x From: | addysort >> ~/Mail/.Pm/black.lst\n" In questo modo, con un semplice k aggiungerete il mittente dell'email attualmente visualizzata o evidenziata in mutt alla black-list, cioè un file che viene poi usato da procmail nelle volte successive per filtrare le email indesiderate, inviandole in una mailbox per lo spam o direttamente su /dev/null, a voi la scelta. Lo script perl addysort è il seguente (copiatelo in qualche directory compresa nel vostro $PATH, e rendetelo eseguibile con un chmod 755 addysort): #!/usr/bin/perl -wn # Estrae l'indirizzo email dall'attuale riga "From:" unless (/\]+)/, "\n"; } La regola che filtra tramite la black-list l'ho aggiunta al file spam.rc visto prima, quindi andate a leggerla direttamente in quella sezione, e in pratica confronta gli header che indicano la destinazione finale con i campi "From" contenuti nel file della black-list. Le ultime 5 regole del file spam.rc servono a intercettare altre possibili fonti di spam. _________________________________________________________________________________________________________ 7.4.6. Correzione tipi MIME errati La regola seguente preconverte le email testuali in arrivo, che dovessero essere in formato base64 o quoted-printed, in un più semplicemente gestibile formato 8bit. :0 * ^Content-Type: *text/plain { :0 fbw * ^Content-Transfer-Encoding: *quoted-printable | mimencode -u -q :0 Afhw | formail -I "Content-Transfer-Encoding: 8bit" :0 fbw * ^Content-Transfer-Encoding: *base64 | mimencode -u -b :0 Afhw | formail -I "Content-Transfer-Encoding: 8bit" } _________________________________________________________________________________________________________ 7.5. Combattere lo SPAM Vediamo ora come filtrare eventuale UCE/UBE (Unsolicited Commercial/Bulk Email, cioè spam o posta indesiderata). Ci sono vari metodi e programmi, ma io uso SpamBouncer, prelevabile da http://www.spambouncer.org, cioè una serie di file rc contenenti un insieme di regole per procmail che permettono di fare varie cose sfiziose ;-), individuando lo spam cercando tra gli spammer conosciuti, siti e domini noti, ISP irresponsabili, header e body con contenuti riferibili a spam. In base a come impostato, permette di fare le seguenti cose: * marcare con un header aggiuntivo le email, rispedendole al normale flusso delle regole di procmail, potendo così fare il filtraggio direttamente dal mailreader * marcare le email sospette, inviandole in una mailbox separata, e cancellando quelle che sono sicuramente spam * inviare un "bounce" simulato di tipo MAILER-DAEMON, che a volte fa pensare a un indirizzo email errato, portando alla cancellazione del medesimo dalla ML (ma non sperateci molto...) * contattare gli ISP degli spammer lamentandosi per lo spam ricevuto * notificare gli spammer che le loro email sono state bloccate, fornendo loro una password per aggirare il blocco (gli spammer raramente lo fanno, ma qualche vostro conoscente eventualmente bloccato potrebbe averne bisogno) Nell'ultimo caso, gli indirizzi email di quelli che vi rispondono vengono aggiunti al file indicato dalla direttiva NOBOUNCE, e non verranno più bloccati in futuro. Tenete presente che comunque il tutto è gestito automaticamente, quindi è normale che salti fuori l'eccezione che confermi la regola... Scaricate il file: http://www.spambouncer.org/sb.zip e date i comandi seguenti per scompattare il tutto: cd $HOME/Mail/.Pm mkdir sb && cd sb cp /percorso/verso/il/file/sb.zip . unzip sb.zip rm -f sb.zip Si consiglia di filtrare lo spam nell'ultima parte, in particolare dopo il trattamento delle mailing list. Il file principale è sb.rc, che contiene tutte le impostazioni per il filtro, e che viene richiamato dal file spam2.rc seguente: Attenzione I due file di regole spam.rc e spam2.rc sono attualmente alternativi! Infatti molte delle cose presenti nel primo file sono fatte anche da SpamBouncer, e per filtri specifici potete sempre usare la Black-List. Attivatene quindi un solo file in .procmailrc! === file: spam2.rc === # filtro tramite black-list :0 * ? formail -x"From" -x"From:" -x"Sender:" -x"Reply-To:" -x"Return-Path:" -x"To:" | egrep -is -f $PMDIR/black.lst spam # impostazioni per spambouncer ADMINFOLDER=${MAILDIR}/IN.admin # email bounced, da root, postmaster, abuse, etc. BULKFOLDER=${MAILDIR}/IN.bulk # per bulk email, che sembra leggittima MYEMAIL=${PMDIR}/.myemail # posizione del file contenente tutti i vostri # indirizzi email, elencati uno per riga ALTFROM=otheremail@othersite.com # un indirizzo email alternativo, ma comunque valido, # per non far sapere agli spammer la tua vera email, # quando invii messaggi in cui ti lamenti dello spam BLOCKFOLDER=${MAILDIR}/IN.block # email sospette, ma possibilmente non spam BLOCKREPLY=SILENT # SILENT per filtrare semplicemente le email bloccate # NOTIFY per informare l'autore che l'email e' stata # bloccata, e informarlo su come oltrepassare il # blocco se pensano di essere leggittimati a farlo BYPASSWD=zeugma # password per le persone che si vedono bloccate le # loro email legittime da Spam Bouncer. Permette di # aggirare il filtro. CAMBIARLA SPESSO!!! NOBOUNCE=${PMDIR}/.nobounce # posizione del file NOBOUNCE, contenente una per # riga le email delle persone che non devono MAI # essere bloccate. E' un normale file di testo, # quindi non usate escape per il punto, tipo \. !!! # Viene anche aggiornato in automatico da SB stesso. NOLOOP=${ALTFROM} # email usata nel campo X-Loop: per prevenire i loop PATTERNMATCHING=SILENT # abilita il filtro Pattern Matching di Spam Bouncer # NONE lo disattiva; SILENT filtra le email senza # avvertire il mittente; NOTIFY filtra e avverte il # mittente che la sua email e' stata bloccata SBDIR=${PMDIR}/sb # directory contenente i filtri di SpamBouncer SPAMFOLDER=${MAILDIR}/spam # mailbox che ricevera' lo spam, cambiare in /dev/null # per eliminarla definitivamente SPAMREPLY=SILENT # SILENT per filtrare ma non autolamentarsi. # BOUNCE per inviare al mittente un messaggio bounce # di tipo "MAILER-DAEMON". COMPLAIN per inviare un # messaggio di lamentela all'abuse del mittente. BOTH # per inviare il bounce e lamentarsi con l'abuse DULCHECK=no # se impostata a "yes", effettua un controllo con le # liste MAPS DUL. Questo riduce significativamente lo # spam, ma puo' crearvi problemi se corrispondete con # molta gente che usa uno Unix e un proprio mailserver. # Consiglio in questo caso di attivare la variabile # BLOCKREPLY=NOTIFY, in modo da consentire al mittente # di aggiungere il proprio indirizzo all'elenco dei # NOBOUNCE, usando la password contenute in $BYPASSWD. ORBSCHECK=no # stesse considerazioni di DULCHECK, ma per l'ORBS. RSSCHECK=no # stesse considerazioni di DULCHECK, ma per il MAPS RSS. RBLCHECK=yes # questa invece puo' essere attivata tranquillamente, # visto che l'RBL lista spammer e siti certificati :-) INCLUDERC=${SBDIR}/sb.rc # ATTIVA SPAMBOUNCER!!! # Le regole seguenti inviano le email indirizzate a uno dei vostri indirizzi email # nello spool di default, spostando quelle che non hanno voi nei campi To: o Cc:, # o che vi sono state inviate in Bcc: in un altro folder. Viene usato il file indicato # in precedenza nella variabile $MYEMAIL, quindi create questo file indicando tutti # gli indirizzi email in cui ricevete posta, elencandoli uno per riga :0: * ? test -f ${MYEMAIL} && \ (${FORMAIL} -zxFrom: -zxReply-To: |\ fgrep -i -f ${MYEMAIL}) | ${FORMAIL} -A"X-Folder: Default" >>${DEFAULT} :0: | ${FORMAIL} -A"X-Folder: Bulk" >>${BULKFOLDER} Il file è ampliamente commentato, quindi leggetelo direttamente e modificate dove necessario. Attenzione Si consiglia inoltre di tradurre i due file spam e notify, che contengono rispettivamente i messaggi automatici usati per lamentarsi con l'ISP dello spammer, e il messaggio inviato a chi si vede bloccate le proprie email per avvisarlo su come aggirare il blocco tramite una password. Nella tarball dei FILES ci sono le versioni che uso io, già tradotte. Nota: Per aggiornare il tutto, controllate le novità sul sito indicato in precedenza, e scompattate il nuovo file come fatto prima, a sovrascrivere la vecchia versione. Consiglio di sottoscrivere la mailing list che annuncia le nuove versioni, tanto è a bassissimo traffico. _________________________________________________________________________________________________________ 7.6. Sintassi delle espressioni regolari Nota: La sintassi proviene da quella del comando egrep. * ^ inizio della linea * $ fine della linea * ogni singolo carattere corrisponde a sè stesso (se si tratta di un carattere speciale, per fare il confronto lo si deve far precedere da \ , quindi: \?, \+, \{, \|, \(, \), ecc. * . qualsiasi carattere eccetto il fine-linea * [12a-e-] un carattere tra quelli racchiusi tra parentesi. In questo caso può essere: 1, 2, a, b, c, d, e, -. Gruppi consecutivi di caratteri si identificano con il primo, seguito da - e dall'ultimo (a-e=abcde). Se il primo carattere è ^, si intende qualsiasi carattere ESCLUSI quelli tra parentesi. Per includere il simbolo ] lo si deve mettere per primo, mentre per inserire il simbolo ^ lo si deve mettere da qualsiasi parte TRANNE che all'inizio, e per il carattere - deve essere l'ULTIMO prima della parentesi quadra. * * il carattere precedente può essere presente 0 o più volte * + il carattere precedente può essere presente 1 o più volte * ? il carattere precedente può essere presente 0 o 1 volte al massimo * {n} il carattere precedente può essere presente esattamente n volte * {n,} il carattere precedente può essere presente almeno n volte * {n,m} il carattere precedente può essere presente almeno n volte e al massimo m * due espressioni regolari possono essere concatenate, ottenendone un'altra generata dalla concatenazione dei risultati delle sottostringhe * due espressioni regolari separate da | diventano alternative * la ripetizione ha precedenza più alta rispetto alla concatenazione, che a sua volta ha precedenza più alta rispetto all'alternatività (usate le parentesi tonde per modificare questo comportamento) * per eseguire il confronto con una parola intera invece che con una sottostringa, racchiudetela tra \< e \>: ad esempio \ riconoscerà "test" ma non "testing" * di solito i confronti non sono sensibili a maiuscole o minuscole, quindi un piccolo errore sarà perdonato! _________________________________________________________________________________________________________ Capitolo 8. Leafnode 8.1. Configurazione Leafnode si occupa di ricevere e inviare i post da e verso i newsgroup Usenet. È in genere adatto, data la sua semplicità, per computer singoli o comunque piccole reti. Se necessitate di creare newsgroup locali per la vostra LAN, o avete bisogno di maggior potenza e opzioni, rivolgetevi a INN, di cui potete trovare un'ampia trattazione nell'Howto scritto da Filippo Panessa - aka Kalem (http://web.tiscalinet.it/kalem). Non potete usare contemporaneamente due demoni che cercano di controllare la stessa porta, quindi nel caso abbiate INN o altri newsserver, commentate la riga apposita all'interno di /etc/inetd.conf o /etc/xinetd.conf e riavviate. Per configurarlo, dopo averlo installato, modificate il file /etc/leafnode/config come segue (è proprio il minimo indispensabile, ci sono molte più opzioni, direttamente commentate nel file). Ricordate che la directory /etc/leafnode/ e il suo contenuto devono appartenere all'utente e gruppo news, quindi date da una console, loggati come utente root: chown -R news.news /etc/leafnode/ Ricordate inoltre che alcune vecchie distribuzioni di leafnode non erano compatibili con l'anno 2000, quindi usatene una versione > 1.9.4. Segue il file config di esempio: === file: /etc/leafnode/config === ## inserisci qui il tuo server news - OBBLIGATORIO server = news.libero.it ## I thread vengono cancellati dopo il numero di giorni seguente, ## se non definito diversamente con groupexpire - OBBLIGATORIO ## man leafnode per informazioni su groupexpire expire = 60 ## Numero massimo di messaggi da scaricare per volta. Sconsigliato ## sia impostarlo al di sotto di 1000 che al disopra di 2000 maxfetch = 2000 ## per scaricare solo gli header dei messaggi e in seguito solo i body ## marcati per il download, impostare delaybody ad 1 delaybody = 0 ## impedisce di scaricare articoli più grandi di 50000 bytes maxbytes = 50000 ## impedisce di scaricare articoli più lunghi di 1000 righe maxlines = 1000 ## massimo numero di giorni in cui sarà scaricato un newsgroup che non ## viene letto, prima di annullare la sottoscrizione in automatico timeout_long = 7 ## minimo numero di giorni in cui sarà scaricato un newsgroup che forse si è sottoscritto ## per errore e non viene letto, prima di annullare la sottoscrizione in automatico timeout_short = 2 ## attiva l'invio di messaggi di debug al syslog, per evidenziare malfunzionamenti debugmode = 1 ## evita che vengano sottoscritti in automatico newsgroup non desiderati ## in caso di crosspost verso di essi create_all_links = 0 ## file contenente i filtri per i messaggi da NON scaricare (leggete alla fine della pagina ## per altre informazioni e nel caso togliete il carattere # all'inizio della riga seguente) # filterfile = /etc/leafnode/filterfile Controllate che in /etc/inetd.conf sia presente una riga come la seguente, NON commentata da #: nntp stream tcp nowait news /usr/sbin/tcpd /usr/sbin/leafnode Nel caso non esista, aggiungetela. Se invece usate xinetd, guardate la sezione apposita dell'howto, c'è un file già pronto. Date da utente root: killall -HUP inetd per riavviare il demone inetd, oppure killall -USR1 xinetd per riavviare il demone xinetd e provate a fare: telnet localhost 119 per vedere se leafnode vi risponde. Dovreste ottenere una riga simile alla seguente: 200 Leafnode NNTP Daemon, version 1.9.19 running at localhost.localdomain Nel caso di inetd, potrebbe dover essere aggiunta al file /etc/hosts.allow la riga: leafnode: LOCAL e al file /etc/hosts.deny la riga: ALL: ALL Per scaricare le news, dovete lanciare il comando: fetchnews da utente root o news (badate che spesso l'utente news viene creato ma non gli viene assegnata una password, quindi non può loggarsi; nel caso da utente root date il comando: passwd news e assegnategliene una). Se non volete loggarvi come utenti root o news (presuppongo che l'eseguibile fetchnews sia in /usr/sbin/, se which fetchnews vi da un path diverso sostituitelo dove necessario), date i seguenti comandi da root : chown root.news /usr/sbin/fetchnews chmod a+s /usr/sbin/fetchnews ln -s /usr/sbin/fetchnews /usr/bin/fetchnews e poi modificate /etc/group in modo che nell'ultimo campo appaia il vostro nome utente: prima: news:x:13:news dopo: news:x:13:news,vostronomeutente Nota: il numero può cambiare, e la x potrebbe essere assente nel caso non utilizziate le shadow password o potrebbe essere qualcosa di ingarbugliato nel caso il gruppo abbia una password, sempre non shadow. La prima volta che lancerete il comando fetchnews verranno scaricati tutti i nomi dei gruppi presenti sul server remoto. Dopo questa fase, entrate nel vostro newsreader preferito e scorrendo la lista dei newsgroup marcate quelli che volete frequentare, entrando nel newsgroup scelto e LEGGENDO il placeholder di leafnode (questo dovrebbe creare i file: /var/spool/news/interesting.groups/nome.del.gruppo.scelto di lunghezza 0: controllate e se ciò non avviene createli voi con il comando: touch /var/spool/news/interesting.groups/nome.del.gruppo.scelto, ripetendo per ognuno dei gruppi scelti). Al successivo lancio di fetchnews verranno scaricati gli header e gli articoli (in base all'impostazione di delaybody nel file /etc/leafnode/config) dei gruppi sottoscritti. Per leggerli, impostate il vostro newsreader su server: localhost e porta 119. Riguardo a quale newsreader scegliere, io vi consiglio slrn per console (la configurazione è nelle ultime pagine del Quick&Easy Configuration HOWTO): ci sono varie scuole di pensiero a seconda che vogliate un programma da console o da gui. Tra i migliori per console ci sono slrn e tin, tra quelli per gui i più promettenti sembrano pan e knode (notate che ho scritto "promettenti", non migliori, in quanto ancora buggatelli anzichenò), oltre al veterano knews (che non c'entra niente con il KDE, il cui newsreader krn è bene che evitiate come LA PESTE, a meno che vi piaccia tanto Windows da volerne emulare i crash sotto Linux! ;-) ). Possibili opzioni utili di fetchnews sono: * -v : (anche ripetuto, come -vvvv) che stampa a video un resoconto di quello che sta succedendo, più dettagliato in base a quante v mettete * -P : invia solo i vostri nuovi messaggi, senza scaricare quelli presenti sul server remoto * -n : evita l'annullamento automatico delle sottoscrizioni di gruppi che non si leggono da molto tempo (intervallo modificabile nel file di configurazione, opzioni timeout_short e timeout_long). Per cancellare i vecchi post che hanno superato il tempo di expire, data da utenti root o news il comando: texpire, magari forzandolo con l'opzione -f. _________________________________________________________________________________________________________ 8.2. Scorefile Con leafnode potete anche impostare dei filtri per evitare di scaricare del tutto degli articoli che non vi interessano. Quello che segue è un esempio di killfile creato da Davide Alberani (un grazie 1000 a lui!), e per attivarlo modificatelo e copiatelo nel file /etc/leafnode/filterfile e decommentate la riga apposita nel file /etc/leafnode/config (per una spiegazione della sintassi delle espressioni regolari presenti, fate riferimento alla sezione apposita del Quick&Easy Configuration HOWTO nella pagina di Procmail): # # File di filtro per leafnode di Davide Alberani # # Aggiornato al 12 aprile 2001 # # Leafnode puo` essere scaricato da: # http://www.leafnode.org # # Formato principalmente durante la frequentazione dei gruppi: # it.comp.os.linux.* # it.cultura.ateismo # it.comp.os.dibattiti # it.comp.sicurezza.varie # it.news.gruppi # it.arti.cinema # # # Nota: # probabilmente vi conviene cancellare o commentare alcune righe # nella sezione Subject, a seconda di quali sono i vostri interessi. # Per quanto riguarda le entry nella sezione From, NON rompete le # gonadi: c'e` finito chi - a mio *insindacabile* giudizio - ha rotto # troppo le scatole, e` troppo stupido per perdere tempo a leggero # o semplicemente si e` fatto trascinare troppe volte in discussioni # con cerebrolesi. # Qualcuno puo` anche esserci finito per errore, capita. # # # L'angolo polemico: # Ho ricevuto lamentele da persone che, avendo trovato un proprio # indirizzo e-mail in questa lista, mi hanno richiesto di eliminare # l'intero filtro (il tutto perche`, per un qualche motivo, non mi si # voleva indicare l'indirizzo in questione). # Ora, immagino che nella mente di qualcuno cio` possa essere # perfettamente sensato, magari tirando in causa la famosa ed # abusatissima legge sulla privacy (675/96). # Naturalmente nutro seri dubbi che tale legge possa limitare il # mio diritto (che discende dalla costituzione) di pubblicare un # banale elenco di persone/indirizzi/subject che mi stanno antipatici, # ricordando che tutte le voci sono tratte da post Usenet pubblicamente # disponibili. # Mi ero peraltro - e ripeto, per pura sensibilita` personale, non # certo perche` stia violando qualche legge - reso disponibile ad # eliminare la *singola* voce interessata, specie nel caso essa # contenesse un cognome/nome. Non avendo mai ricevuto indicazione # di quale fosse la riga "incriminata", a questo punto ritiro la # mia disponibilita`. # # Corollario di MrShark: siccome il tizio in questione non ha MAI # fornito l'indirizzo email da eliminare, ma ha trolleggiato per # una settimana accampando diritti che non ha, abbiamo inserito # anche i due suoi nuovi indirizzi email con i quali ha rotto le # balle sul NG del net-abuse, perche` se non era troll prima e # non meritava di finire nel killfile, sicuramente l'ha meritato # dopo i suoi exploit, vincendo un mongolino d'oro! Tie'! ;-) # # Killare un dato subject solo in un dato newsgroup: # Ne avevo discusso tempo fa con Derfel; a quanto mi ricordo, # dall'ultima volta che ho controllato i sorgenti, leafnode passa le # varie linee dell'header separatamente alla funzione che ne controlla # eventuali match, quindi non sarebbe possibile farlo. # Derfel pero` era giunto a questa soluzione: # # (?-im)Newsgroups:.*IL.NEWSGROUP\nSubject: IL SUBJECT.*\n # # Che pare funzionare. # Io pero` ci credo ancora il giusto. :-) # Aggiornamento: da quanto ho capito questa regola funziona usando # il comando applyfilter, che pero` non e` come vorrei usare io il # filtro... :-) # # More info: # Se volete maggiori informazioni sulle regular expression, leggetevi: # man 7 pcre # man 7 regex # man 1 egrep # # Enjoy. # #################### # Subject generici # #################### # killa *tutti* i subject completamente maiuscoli (a parte l'eventuale Re:) # togliere il commento (#) se si vuole attivare questa regola #^Subject: (Re: |R: )*[^a-z]*$ # i post con troppi '!', '?' o '$' (?im)^Subject:.*\!\!\!\! (?im)^Subject:.*\?\?\?\? (?im)^Subject:.*\$\$\$.* # subject eccessivamente generici (?im)^Subject: (Re: |R: )*non legge[rt]e *[\?\!]*$ (?im)^Subject: (Re: |R: )*aiuto+ *[\?\!]*$ (?im)^Subject: (Re: |R: )*he+l+p+ *[\?\!]*$ (?im)^Subject: (Re: |R: )*prov[ae] *[\?\!]*$ (?im)^Subject: (Re: |R: )*problem[ai] *[\?\!]*$ (?im)^Subject: (Re: |R: )*test *[\?\!]*$ (?im)^Subject: (Re: |R: )*domand[ae] *[\?\!]*$ # post periodici del GCN ^Subject:.*benvenuto su Usenet\! (?im)^Subject: RFD, CFV e it\.news\.gruppi (?im)^Subject: Usenet e news - dove saperne di piu\` (?im)^Subject: Istruzioni per la creazione di gruppi della gerarchia it (?im)^Subject: \[HOWTO\] COME PORRE DOMANDE IN QUESTO GRUPPO (?im)^Subject: Come funzionano le news: il crosspost e\` Male (?im)^Subject: \[MANIFESTO\] it\.news\.gruppi (?im)^Subject: I gruppi Usenet it\.\* - istruzioni per l\'uso (?im)^Subject: E Quali sono i gruppi della gerarchia it\.\* \? ################################## # Subject per it.comp.os.linux.* # ################################## (?im)^Subject:.*sb[ -]*64 (?im)^Subject:.*winlinux (?im)^Subject:.*emacs (?im)^Subject:.*system\.map (?im)^Subject:.*iomega (?im)^Subject:.*sb pci (?im)^Subject:.*toshiba (?im)^Subject:.*vmware (?im)^Subject:.*banshee (?im)^Subject:.*isdn (?im)^Subject:.*slrn (?im)^Subject:.*star.*office (?im)^Subject:.*sb.*live (?im)^Subject:.*blaster.*live (?im)^Subject:.*suse (?im)^Subject:.*red[ -]*hat (?im)^Subject:.*caldera (?im)^Subject:.*mandrake (?im)^Subject:.*tnt2 (?im)^Subject:.*trio.*3d (?im)^Subject:.*3dfx (?im)^Subject:.*samba (?im)^Subject:.*kppp (?im)^Subject:.*voo?doo? (?im)^Subject:.*rh ?[567] (?im)^Subject:.*nvidia (?im)^Subject:.*i740 (?im)^Subject:.*virge (?im)^Subject:.*matrox (?im)^Subject:.*x11amp (?im)^Subject:.*mp3 (?im)^Subject:.*yamaha (?im)^Subject:.*slac?kware (?im)^Subject:.*sound ?blaster # i post periodici su it.comp.os.linux.* (?im)^Subject:.*FAQ: Le mailing list italiane ^Subject:.*\[FAQ\] RISPOSTE ALLE DOMANDE PIU\` FREQUENTI ^Subject: REGOLE BASE DI \"it\.comp\.os\.linux\.iniziare\" ^From: autoposter ^From: autoposter ^From: gz@indirizzo.non.valido.it \(AUTOPOSTER-AMF\) #(?im)^Subject:.*cazz.*linux #^Subject: REGOLE BASE DI it\.comp\.os\.linux\.iniziare #^Subject: \[NEW\] REGOLE BASE DI \"it\.comp\.os\.linux\.iniziare\" #(?im)^Subject: Quali sono i gruppi della gerarchia it\.\* \? ######## # From # ######## # # La suddivisione in sezioni potrebbe essere inesatta... # ######## # VS©s # ######## ^From:.*VS© ^From:.*vs\.ru ^From:.*>>FoX<< ^From:.*Gek© ^From:.*glm ^From:.*tommygun.*@freemail.it #^From:.*Frank ############ # Raeliani # ############ ^From:.*exdor@tin.it ^From:.*kenpatera@tin.it ############################### # From per it.comp.os.linux.* # ############################### ^From:.*KiLLa ^From:.*kurty@libero.it ^From:.*kaig@wappi.com ^From:.*deditor@libero.it ^From:.*Marco Bertini ^From:.*geqbm@tin.it ^From:.*pigo@ahoooo.libero.it ^From:.*nobady@nobady.com ^From:.*butindaro@tiscalinet.it ^From:.*jalessa@tin.it ^From:.*lorciao@tiscalinet.it ^From:.*giochio@inwind.it ^From:.*plucky@libero.it ^From:.*nme106@hotmail.com ^From:.*oivluf@libero.it ^From:.*henrywinter ^From:.*BeavisandButthead@usa.net ^From:.*Windows®2000 ^From:.*sevenofnine@freemail.it ^From:.*dark\.tower@iol.it ^From:.*BLUKLEIN@iol.it ^From:.*m\.lore@tiscalinet.it ^From:.*suppo@katamail.com ^From:.*newsoft@nsoft.it ^From:.*errebi@fiscalinet.it ^From:.*a\.sevi@katamail.com ^From:.*kingz@tiscalinet.it ^From:.*nkoffr@tin.it ^From:.*giovannad\'arco@tiscalinet.it ^From:.*gaucie@tin.it ^From:.*borisnospam@hotmail.com.com ^From:.*io@io.it ^From:.*junfan ^From:.*ziocan@fica.it ^From:.*ciberneta@libero.it ^From:.*junfan77@libero.it ^From:.*maandateacagher@dicorsa.gulp ^From:.*madQ ^From:.*XPDCVwtw ^From:.*geremia@mclink.it ^From:.*info@aroundstore.com ^From:.*woody_hesse@iol.it ^From:.*a_capelli@hotmail.com ^From:.*aes-mail@freenet.hut.fi ^From:.*grog@tin.it ^From:.*jacline@dueffe.it ^From:.*urihel@mmp2.iol.it ^From:.*acia@tin.it ^From:.*alexievi?c?@tin.it ^From:.*liberal73@iname.com ^From:.*tznt0078@pt.tizeta.it ^From:.*paolocl@netmail.com ^From:.*fedrox@libero.it ^From:.*fdonline@iname.com ^From:.*maga@provincia.ps.it ^From:.*inaj@freemail.it ^From:.*hot@warm.bo ^From:.*npole@_REMOVE_bigfoot.com ^From:.*hastaluego99@.*hotmail.com ^From:.*bluesedelica@iol.it ^From:.*cbu_ut@hotmail.com ^From:.*massj@BUDDAflashmail.com ^From:.*new@life.now ^From:.*debian@matsumanga.co.jp ^From:.*as.ps@flashnet.it ^From:.*C_Zambo@iol.it ^From:.*club.italia.milano@iol.it ^From:.*juretto@tin.it ^From:.*gattoone@hotmail.com ^From:.*mariafrf@tin.it ^From:.*tamarica@tin.it ^From:.*nathing@tin.it ^From:.*andreap@instation.it ^From:.*stephendedalus1@yahoo.com ^From:.*dpmarc@tin.it ^From:.*torque_@hotmail.com ^From:.*giulio_bottini@bigfoot.com ^From:.*FOX99@mail.asianet.it ^From:.*mpolve@tin.it ^From:.*nino@affaritaliani.it ^From:.*alxcost@tin.it ^From:.*eghiani@etruria.net ^From:.*microgest@microgest.it ^From:.*aiax@excite.com ^From:.*jodyrm@hotmail.com ^From:.*menthos@posta.alinet.it ^From:.*hongkongmail@iname.com ^From:.*taexpo.*@idirect.ca ^From:.*vendicator@hell.com ^From:.*S&F@tin.it ^From:.*rick\.sabbadini@iol.it ^From:.*condon@hotpop.com ^From:.*wiwaxia@bigfoot.com #^From:.*maxadamo@tin.it ###################### # From per it.news.* # ###################### ^From:.*lustfemale ^From:.*bamoo*@sexmagnet.com ^From:.*fogazzid@usa.net ^From:.*robcn@ibm.net ^From:.*alessandro\.villetti@usa.net ^From:.*f.varoli@antilink.prolink.replica.it ^From:.*crpraolini@.*libero.it ^From:.*jojo@arcanet.it ^From:.*pxqpas@tin.it ^From:.*roxana@flashnet.it ^From:.*nstdvd@nospamtin.it ^From:.*blisset@i.am ^From:.*mat66@arc.it ^From:.*pod@pineto.net ^From:.*nicola@netstation.org ^From:.*rcaudan@whitepower.com ^From:.*nsj@iname.com ^From:.*tipfkam.*@hotmail.com ^From:.*fuoripista@altavista.net ^From:.*fuoripista@yahoo.it ^From:.*fogazzid@bigfoot.com # Pirotti. Un uomo, un mito. ^From:.*pirotti@ngweb.it ^From:.*pr[ou]sper.*@.*ctonline.it ^From:.*pirotti@tiscalinet.it ^From:.*prpiro@tin.it ^From:.*prosperopirotti@tin.it ^From:.*stamink@armando.com ############################### # From per it.cultura.ateismo # ############################### ^From:.*canali.massimo@tiscalinet.it ^From:.*tito_tazio@hotmail.com ^From:.*rcaudan@mankind.org ^From:.*pasquale.tufano@libero.it ^From:.*cavaliereverde@tiscalinet.it ^From:.*botti\.d@tiscalinet.it ^From:.*med.nat@transports.it ^From:.*barabb\.a@iol\.it ^From:.*Club\.italia\.milano@iol.it ^From:.*Pietro_Buttiglione@insieme.net ^From:.*spiritologia@iol.it ^From:.*spiritologia@supereva.it ^From:.*whole\.lotta@lo.ve ^From:.*w6130370@inwind.it ^From:.*saccoforino@yahoo.com ^From:.*chief@etruria.net ^From:.*mlagatt@tin.it ^From:.*thats\.the\.way@do.it ^From:.*shermin93@hotmail.com ^From:.*ad549379@silab.dsi.unimi.it ^From:.*auro\.zac@tiscalinet.it ^From:.*picardismy@life.sbam ^From:.*trekkers@forever.slump # Gianfranco Bruno. Cerca di insidiare i record del Pirotti. ^From:.*gbruno@webaq.it ^From:.*vicolo_connery@yahoo.com ^From:.*supergiaf@libero.it ^From:.*supergiaf@tiscalinet.it ############################# # Vari e ben poco eventuali # ############################# ^From:.*titanio@freemail.it ^From:.*aledumas@libero.it That's all folks! _________________________________________________________________________________________________________ 8.3. Leafnode+ Nota: Sottosezione a cura di Giambo Leafnode+ deriva da Leafnode v1.4. La differenza più interessante rispetto al suo predecessore è forse la velocità nello scaricare gli articoli di ogni NG: lo scaricamento avviene in maniera asincrona, non aspettando cioè una risposta per ogni richiesta prima di procedere con la prossima, bensì spedendo più richieste ed eventualmente riformulando quelle che non hanno ricevuto una risposta. Risulta inoltre più veloce nel fornire i suoi servizi una volta contattato. Manca purtroppo dell'opzione delaybody che permette di scaricare in un secondo tempo il corpo di un messaggio del quale si è letto il titolo: l'autore promette di implementare questa possibilità se le richieste saranno numerose. Manca inoltre il filterfile, quindi bisogna scaricare tutti i post per ogni newsgroup sottoscritto. Personalmente non ne sento la mancanza, anzi, per dirla tutta, non credo che sia giusto che un'amministratore si arroghi il diritto di filtrare i messaggi che a lui non vanno a genio prevaricando così i suoi utenti; questi ultimi possono utilizzare le possibilità di filtraggio offerte dai loro newsreader. Dall'altro lato c'è da dire che per una LinuxBox configurata per un solo utente, l'utilizzo di un filtro può portare ad un buon risparmio sulla bolletta telefonica, risparmio però facilmente uguagliabile dalla maggiore velocità di leafnode+ nello scaricare i messaggi rispetto al suo predecessore. Come si può notare, ci sono tutti gli elementi per innescare una guerra santa, o per spingere qualche volenteroso a implementare il filtraggio utilizzando i sorgenti di leafnode: magari potrà nascere una nuova creatura, leafnode++ :-) In linea di massima leafnode+ assomiglia al suo predecessore, vi rimando al capitolo su leafnode per quel che concerne la creazione degli utenti, l'uso di fetchnews e texpire. La differenza principale è che il file di configurazione non si trova nella directory /etc/leafnode/, bensì in quella /usr/lib/leafnode/. Se si compila partendo dai sorgenti, si può modificare nel Makefile la voce LIBDIR per piazzare i file di configurazione in /etc/leafnode/ (Il che sarebbe, IMHO, più ordinato). Attenzione Se si compila partendo dai sorgenti, di default l'installazione crea un file in questa directory con il nome config.example: Sarà necessario quindi copiare il file con il nome corretto, cioè config, facendo attenzione ai diritti di lettura/scrittura sia del file che della directory che lo contiene (in questa directory verrà scritto pure il groupinfo!). Il file di configurazione è analogo a quello di Leafnode. [BUGS]. C'è un curioso BUG con la versione 2.10: la prima volta che viene dato il comando make installall compare la scritta: make: libutil.a: Command not found Ridando il comando make installall il tutto viene compilato e installato correttamente. _________________________________________________________________________________________________________ Capitolo 9. Firewall Un firewall è essenzialmente un dispositivo che permette di gestire come un filtro il traffico tra due interfacce di rete. In questa sezione vedremo come impostare un firewall per un sistema Linux, sia per proteggere un singolo PC, sia una rete locale, in entrambe le situazioni nel caso di collegamento a internet. Inoltre vedremo come poter consentire la condivisione di una connessione internet, in modo che un singolo PC possa isolare da possibili attacchi esterni e allo stesso tempo permetta l'accesso all'esterno alla rete locale. Per accesso esterno considero solo quello in entrata: tutti i PC della rete potranno inviare e ricevere tutte le informazioni che vorranno, ma non potranno offrire servizi all'esterno (infatti per questo servizio serve un demone apposito, rinetd). Inoltre l'inserimento nella macchina firewall di un server DNS e di un cache proxy permetteranno di sveltire il traffico: il server DNS locale permette infatti di avere una risposta più immediata alle richieste di risoluzione dei nomi in indirizzi IP, mentre il cache proxy permette di tenere copie locali delle pagine web e dei file già scaricati, evitando una nuova richiesta esterna Nota: Questi due tipi di servizi sono trattati nelle sezioni DNS e WWWOFFLE del Quick&Easy Configuration HOWTO). Linux contiene già al suo interno tutto il necessario per implementare un firewall e il masquerading: si tratta del tool ipchains dei kernel 2.2.x. I kernel della serie 2.0.x usavano ipfwadm, mentre quelli dell'ultima versione 2.4.x usano iptables: qui si tratterà solo la gestione con ipchains e kernel 2.2.x (e in futuro iptables), mentre ipfwadm non verrà trattato. Per poter utilizzare ipchains, è necessario che il kernel sia compilato con le opzioni di firewalling seguenti impostate a Yes: * Network firewalls * IP: firewalling * IP: always defragment * IP: transparent proxy support * IP: masquerading * IP: ICMP masquerading più naturalmente tutto quello che vi serve per la rete (networking, ppp, ethernet, routing, ecc.). Ipchains suddivide il traffico in tre tronconi, fornendo tre filtri: input, output e forward, gestibili tramite una serie di regole che stabiliscono il trattamento del pacchetto arrivato. Le regole vengono applicate nell'ordine in cui sono inserite, e se non è presente alcuna regola specifica, si applica la politica di default. Nel Quick&Easy Configuration HOWTO prendereno in considerazione solo le cose essenziali e solo quelle trattate nello script seguente, per il resto si rimanda al Firewall-Howto e all' Ipchains-Howto, oltre all'ottima sezione degli Appunti di Informatica Libera. L'impostazione tipica di una regola è la seguente: ipchains [] [] Le opzioni di comando sono: * -F o --flush : elimina tutte le regole del filtro specificato * -D o --delete : elimina una o più regole dal filtro specificato * -A o --append : aggiunge una regola in coda a quelle del filtro selezionato * -I o --insert : inserisce una regola in una posizione stabilita del filtro selezionato * -R o --replace : sostituisce una regola del filtro selezionato * -L o --list : elenca le regole di un uno o di tutti i filtri * -P o --policy : cambia la politica predefinita per il filtro specificato I filtri sono (rispettivamente per pacchetti in entrata, uscita e in transito): input, output, forward Gli obiettivi sono: * ACCEPT : consente il transito del pacchetto * DENY : impedisce il transito del pacchetto, limitandosi a ignorarlo * REJECT : impedisce il transito del pacchetto notificando all'origine il rifiuto (viene inviato un messaggio ICMP specificante che il pacchetto è stato rifiutato) Le regole invece usano le seguenti opzioni (le parentesi [] indicano qualcosa di opzionale, mentre il ! indica una negazione): * -p [!] {tcp|udp|icmp|all} : stabilisce il protocollo cui si applica la regola (default: all) * -i [!] interfaccia : stabilisce a quale interfaccia si applica la regola * -j obiettivo : stabilisce cosa fare in caso di corrispondenza della regola * -s [!] indirizzo[/maschera] : l'indirizzo sorgente da cui arriva il pacchetto (default : 0.0.0.0/0, cioè ogni indirizzo) * -d [!] indirizzo[/maschera] : l'indirizzo cui è diretto il pacchetto (default : 0.0.0.0/0, cioè ogni indirizzo) * -l : effettua il log di quanto passa attraverso la regola * -n : non risolve i nomi di domini (lascia l'ip numerico) Altre informazioni sono reperibili nei documenti su indicati. Il mascheramento IP permette di far credere all'esterno che l'origine delle connessioni è sempre un solo nodo, anche quando in realtà si tratta di un nodo interno ad una rete privata. Naturalmente, il nodo che esegue il mascheramento è poi in grado di distinguere quali siano stati i nodi mascherati che hanno originato la connessione, girando a loro i pacchetti di loro competenza. Lo script seguente funziona sia come firewall che da mascheramento di una rete locale interna verso Internet. È configurato per l'accesso dialup via ppp (usa l'interfaccia ppp0). Leggete i commenti nel file, modificate dove indicato e andate in pace. Dalla revisione 10 dello script, la configurazione (cioè le parti dello script che NECESSARIAMENTE vanno adeguate al proprio sistema) è stata estrapolata dallo script principale, e posta il un file a parte, che se non modificate lo script sarà /etc/firewall.conf. Per sapere come abilitare il supporto per firewall e masquerading, guardate nella pagina relativa al kernel. Lo script dovrebbe fare la maggior parte dei controlli su esistenza di file, connessione, parametri, e segnalarvi se qualcosa non va. Date i seguenti comandi per settare i giusti proprietari e permessi: cp firewall /usr/sbin chown root.root /usr/sbin/firewall chmod 744 /usr/sbin/firewall cp firewall.conf /etc chown root.root /etc/firewall.conf chmod 644 /etc/firewall.conf Una volta modificato il file di configurazione, potete avviare il firewall DOPO aver stabilito la connessione (prima non esiste l'interfaccia di rete ppp0!) col comando firewall start, e arrestarlo col comando firewall stop. Altri comandi sono: firewall restart, per riavviarlo dopo aver modificato il file di configurazione a connessione attivata, e firewall status, per avere un resoconto delle regole attualmente attive nel sistema. Consiglio di automatizzare questa procedura, inserendo i comandi di avvio e arresto rispettivamente in /etc/ppp/ip-up e /etc/ppp/ip-down. Se usate REDHAT e simili, questi ultimi sono dei file, quindi basta inserire i comandi al loro interno. Se invece usate DEBIAN, questi sono delle directory, e contengono degli script. Per il resto il funzionamento è analogo: i file o gli script nelle dir vengono avviati rispettivamente subito dopo aver stabilito la connessione e subito prima di arrestarla. Esempi di script per Debian sono i seguenti: #!/bin/bash # script /etc/ppp/ip-up/firewallstart /usr/sbin/firewall start e: #!/bin/bash # script /etc/ppp/ip-up/firewallstop /usr/sbin/firewall stop Nota: Per il mascheramento di ICQ, dovete scaricare, compilare e installare il modulo ip_masq_icq, reperibile all'URL http://freeshell.org/~djsf/masq-icq/ oppure all'URL http://djsf.narod.ru/masq-icq/ (un grazie a Filippo Panessa per il suggerimento!). In ICQ2000 non funziona ancora il trasferimento file. Nella configurazione dei client che vengono mascherati, dovete impostare nelle loro opzioni l'uso di un firewall sull'intervallo di porte 2000:4000. #!/bin/bash # # ========================================================================== # ========= Script per la configurazione di un Firewall per Linux ========== # ========================================================================== # # Da utilizzarsi esclusivamente per una macchina stand-alone connessa # ad internet tramite connessione dial-up. E' necessario disporre di # un kernel della serie 2.2.x o 2.3.x compilato con il supporto # del masquerading, del firewall e l'opzione "always defragment". # In questa versione si usa IPCHAINS, NON IPFWADM o IPTABLES! # Viene filtrato cio' che entra e permesso alla rete di uscire # # $Revisione: 11.0$ # modificato da MrShark su un lavoro precedente di Maurizio Cimaschi, # con vari preziosi suggerimenti di Pierluigi De Rosa e Marco d'Itri. # (Se ci sono errori, fatemeli conoscere a: ). # # Utilizzo: firewall start|stop|status|restart # start = attiva il firewall # stop = disattiva il firewall # status = impostazioni correnti del firewall # restart = rilegge il file di configurazione # # by Antonio Fragola, aka MrShark - The Informaniac # # Da questa revisione, le parti variabili sono state spostate in un # file esterno di configurazione, quindi NON c'e' piu' bisogno di # intervenire all'interno di questo file, a meno di non volerlo # personalizzare aggiungendo nuovi servizi eventualmente assenti. # Segue una serie di funzioni, lo script principale e' alla fine # ========================================================================== fw_root () { #--------------- verifica che lo script sia avviato da root if [ $UID != 0 ]; then clear echo -e "\aATTENZIONE: solo l'utente root puo' avviare il firewall!" exit 1 fi } # fw_root # ========================================================================== fw_cfg () { #--------------- verifica presenza file di configurazione CFG="/etc/firewall.conf" if [ -f $CFG ]; then # source del file di configurazione . $CFG else clear echo -e "\aATTENZIONE: il file $CFG non e' presente!" echo "Da questa revisione, le parti variabili sono state spostate in un" echo "file esterno di configurazione, quindi NON c'e' piu' bisogno di" echo "intervenire all'interno di questo file, a meno di non volerlo" echo "personalizzare aggiungendo nuovi servizi eventualmente assenti." exit 1 fi } # fw_cfg # ========================================================================== fw_const () { #--------------- costanti utili #--------------- le parti variabili sono nel file di configurazione INTERFACES=`/sbin/ifconfig | grep Link | cut -d \ -f 1` CURRENT_KERNEL=`uname -r` INTERFACEMASK="255.255.255.255" INTERFACEIP=`/sbin/ifconfig $INTERFACE | grep inet | \ cut -d : -f 2 | cut -d \ -f 1` LOCALIP="$INTERFACEIP/$INTERFACEMASK" ANYWHERE="0.0.0.0/0" LOOPBACK="127.0.0.0/8" CLASS_A="10.0.0.0/8" CLASS_B="172.16.0.0/12" CLASS_C="192.168.0.0/16" CLASS_D_MULTICAST="224.0.0.0/4" CLASS_E_RESERVED_NET="240.0.0.0/5" NFS_PORT="2049" # (TCP/UDP) NFS SOCKS_PORT="1080" # (TCP) Socks # X Windows alloca le porte a partire dalla 6000 e incrementa # fino alla 6063 per ogni server addizionale in funzione. XWINDOW_PORTS="6000:6063" # (TCP) X windows # traceroute di solito usa -S 32769:65535 -D 33434:33523 TRACEROUTE_SRC_PORTS="32769:65535" TRACEROUTE_DEST_PORTS="33434:33523" PRIVPORTS="0:1023" UNPRIVPORTS="1024:65535" # i client SSH incominciano dalla porta 1023 e vanno a scalare fino alla 513 # per ogni nuova connessione simultanea generata da una porta privilegiata. # I client possono essere impostati per usare solo porte non privilegiate. SSH_PORTS="1022:1023" #--------------- codici escape colori RED="\\033[1;31m" GREEN="\\033[0;32m" WHITE="\\033[0;39m" CYAN="\\033[0;36m" BLUE="\\033[1;34m" ORANGE="\\033[0;33m" YELLOW="\\033[1;33m" MAGENTA="\\033[1;35m" } # fw_const # ========================================================================== fw_nointerface () { #--------------- comunica che non esiste l'interfaccia di rete clear echo -e "${RED}ATTENZIONE: ${YELLOW}l'interfaccia " echo -e "${RED}ppp0${YELLOW} NON e' attiva nel sistema." echo -e "Firewall NON attivato. Controllare connessione Internet" echo -en "${WHITE}Interfacce attualmente attive nel PC: " for irf in ${INTERFACES} ; do echo -en "${RED}${irf}${WHITE} " done echo -e "\n\a" exit 1 } # fw_nointerface # ========================================================================== fw_go () { #--------------- inizio attivazione e flushing echo echo "Attivazione del Firewall in corso..." echo -e "Indirizzo IP locale sull'interfaccia ${YELLOW}" echo -e "$INTERFACE${WHITE} : ${RED}$LOCALIP${WHITE}" echo -n "Flushing delle regole eventualmente presenti : " $IPCHAINS -F input $IPCHAINS -F output $IPCHAINS -F forward echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]" } # fw_go # ========================================================================== fw_protezioni () { #--------------- attivazione protezioni varie echo -n "Permesso traffico locale sull'interfaccia di loopback : " $IPCHAINS -A input -s $ANYWHERE -i lo -j ACCEPT echo -e "\t[ ${GREEN}OK ${WHITE}]" echo -n "Permesso traffico locale sull'interfaccia di rete della LAN : " $IPCHAINS -A input -i $LOCAL_INTERFACE -s $LOCALNET -j ACCEPT echo -e "\t[ ${GREEN}OK ${WHITE}]" echo -n "Attivazione Source Address Verification : " if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f done echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t[ ${RED}NO ${WHITE}]" echo -n "SAV non disponibile, utilizzo di ipchains : " $IPCHAINS -A input -s 127.0.0.1 -i lo -j ACCEPT echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]" fi #--------------- syn cookie echo -n "Attivazione TCP SYN Cookie Protection : " if [ -e /proc/sys/net/ipv4/tcp_syncookies ]; then echo 1 >/proc/sys/net/ipv4/tcp_syncookies echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t[ ${RED}NO ${WHITE}]" fi #--------------- always defrag echo -n "Attivazione Always Defragging Protection : " if [ -e /proc/sys/net/ipv4/ip_always_defrag ]; then echo 1 > /proc/sys/net/ipv4/ip_always_defrag echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t[ ${RED}NO ${WHITE}]" fi #--------------- broadcast echo echo -n "Attivazione Broadcast Echo Protection : " if [ -e /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ]; then echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t[ ${RED}NO ${WHITE}]" fi #--------------- bad error echo -n "Attivazione Bad Error Message Protection : " if [ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ]; then echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t[ ${RED}NO ${WHITE}]" fi #--------------- icmp redirect echo -n "Disattivazione ICMP Redirect Acceptance : " if [ -e /proc/sys/net/ipv4/conf/all/accept_redirects ]; then for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > $f done for f in /proc/sys/net/ipv4/conf/*/send_redirects; do echo 0 > $f done echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t[ ${RED}NO ${WHITE}]" fi #--------------- source route echo -n "Disattivazione Source Routed Packets : " if [ -e /proc/sys/net/ipv4/conf/all/accept_source_route ]; then for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $f done echo -e "\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t[ ${RED}NO ${WHITE}]" fi #--------------- i marziani! echo -n "Log pacchetti spoofed, source routed, redirected : " if [ -e /proc/sys/net/ipv4/conf/all/log_martians ]; then for f in /proc/sys/net/ipv4/conf/*/log_martians; do echo 1 > $f done echo -e "\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t[ ${RED}NO ${WHITE}]" fi #--------------- impostazione policy echo -e "${YELLOW}Attivazione dei servizi in ingresso richiesti : ${WHITE}" echo -n "Impostazione della POLICY di ingresso a DENY : " $IPCHAINS -P input DENY echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]" } # fw_protezioni # ========================================================================== fw_dns () { #--------------- DNS (53) echo -n "Server DNS : " if [ $DNS = "ON" ]; then for dns in $DNS_IP ; do $IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s $dns 53 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT $IPCHAINS -A input -i $INTERFACE -p udp -s $dns 53 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT done echo -e "\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_dns # ========================================================================== fw_http () { #--------------- HTTP (80) e HTTPS (443) echo -n "Navigazione WEB : " if [ $HTTP = "ON" ]; then $IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s 0/0 80 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT $IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s 0/0 443 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_http # ========================================================================== fw_smtp () { #--------------- SMTP (25) echo -n "Invio posta : " if [ $SMTP = "ON" ]; then for smtp in $SMTP_IP ; do $IPCHAINS -A input -i $INTERFACE -p tcp -s $smtp 25 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT # $IPCHAINS -A input -i $INTERFACE -p tcp -s $ANYWHERE 25 \ # -d $LOCALIP $UNPRIVPORTS -j ACCEPT done echo -e "\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_smtp # ========================================================================== fw_imap () { #--------------- IMAP (143) echo -n "Posta IMAP : " if [ $IMAP = "ON" ]; then for imap in $IMAP_IP ; do $IPCHAINS -A input -i $INTERFACE -p tcp -s $imap 143 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT done echo -e "\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_imap # ========================================================================== fw_pop3 () { #--------------- POP3 (110) echo -n "Prelievo posta : " if [ $POP3 = "ON" ]; then for pop3 in $POP3_IP ; do $IPCHAINS -A input -i $INTERFACE -p tcp -s $pop3 110 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT done echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_pop3 # ========================================================================== fw_nntp () { #--------------- NNTP (119) echo -n "Newsgroup Usenet : " if [ $NNTP = "ON" ]; then for news in $NNTP_IP ; do $IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s $news 119 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT done echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_nntp # ========================================================================== fw_ftp () { #--------------- FTP (20/21) echo -n "File Transfer Protocol : " if [ $FTP = "ON" ]; then $IPCHAINS -A input -i $INTERFACE -p tcp ! -y --source-port 21 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT # FTP Port Mode (normale) $IPCHAINS -A input -i $INTERFACE -p tcp --source-port 20 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT # FTP Passive Mode (senza questa i browser non accedono ai siti FTP) $IPCHAINS -A input -i $INTERFACE ! -y --source-port $UNPRIVPORTS \ -d $LOCALIP $UNPRIVPORTS -p tcp -j ACCEPT echo -e "\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_ftp # ========================================================================== fw_ssh () { #--------------- SSH (22) echo -n "Secure Shell : " if [ $SSH = "ON" ]; then $IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s $ANYWHERE 22 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT $IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s $ANYWHERE 22 \ -d $LOCALIP $SSH_PORTS -j ACCEPT echo -e "\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_ssh # ========================================================================== fw_icmp () { #--------------- ICMP (solo tipi 0/3/11) echo -n "Traffico ICMP : " if [ $ICMP = "ON" ]; then $IPCHAINS -A input -p icmp -s $ANYWHERE 0 -d $LOCALIP -j ACCEPT $IPCHAINS -A input -p icmp -s $ANYWHERE 3 -d $LOCALIP -j ACCEPT $IPCHAINS -A input -p icmp -s $ANYWHERE 11 -d $LOCALIP -j ACCEPT echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_icmp # ========================================================================== fw_auth () { #--------------- AUTH (113) echo -n "Richieste di identificazione : " if [ $AUTH = "ON" ]; then $IPCHAINS -A input -i $INTERFACE -p tcp -d $LOCALIP 113 -j ACCEPT echo -e "\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_auth # ========================================================================== fw_irc () { #--------------- IRC (6667) echo -n "Internet Relay Chat : " if [ $IRC = "ON" ]; then $IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s $ANYWHERE 6667 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_irc # ========================================================================== fw_icq () { #--------------- ICQ (2000:4000) echo -n "ICQ : " if [ $ICQ = "ON" ]; then $IPCHAINS -A input -i $INTERFACE -p tcp -d $LOCALIP 2000:4000 -j ACCEPT $IPCHAINS -A input -i $INTERFACE -p udp -d $LOCALIP 4000 -j ACCEPT $IPCHAINS -A input -i $INTERFACE -p tcp --source-port 2000:4000 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT # con il "! -y" non funge il dcc in uscita! si deve impostare # anche il client ad usare questo range di porte # $IPCHAINS -A input -i $INTERFACE -p tcp ! -y --source-port 2000:4000 \ # -d $LOCALIP $UNPRIVPORTS -j ACCEPT $IPCHAINS -A input -i $INTERFACE -p udp --source-port 4000 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT echo -e "\t\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_icq # ========================================================================== fw_napster () { #--------------- NAPSTER (6699) echo -n "NAPSTER : " if [ $NAP = "ON" ]; then $IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s $ANYWHERE 6699 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT echo -e "\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_napster # ========================================================================== fw_realaudio () { #--------------- REALAUDIO (6970:6999) echo -n "REALAUDIO : " if [ $RAUD = "ON" ]; then $IPCHAINS -A input -i $INTERFACE -p udp --source-port $UNPRIVPORTS \ -d $LOCALIP 6970:6999 -j ACCEPT echo -e "\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_realaudio # ========================================================================== fw_whois () { #--------------- WHOIS (43) echo -n "WHOIS : " if [ $WHS = "ON" ]; then $IPCHAINS -A input -i $INTERFACE -p tcp ! -y --source-port 43 \ -d $LOCALIP $UNPRIVPORTS -j ACCEPT echo -e "\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_whois # ========================================================================== fw_trojan () { #--------------- log bo e netbus # Ogni tanto mi prude e mi va di divertirmi con fakebo! ;-) # Cosa c'e` dietro queste mie porte? Venite a trovarmi quando # sono online per saperlo, a vostro rischio e pericolo!!! ;-) echo -n "Log Bo e Netbus : " if [ $FAKE = "ON" ]; then $IPCHAINS -A input -i $INTERFACE -p tcp \ --destination-port 12345:12346 -l -j ACCEPT $IPCHAINS -A input -i $INTERFACE -p tcp \ --destination-port 31337 -l -j ACCEPT $IPCHAINS -A input -i $INTERFACE -p udp \ --destination-port 31337 -l -j ACCEPT #socks per fake proxy $IPCHAINS -A input -i $INTERFACE -p tcp \ --destination-port 1080 -l -j ACCEPT #fake telnet $IPCHAINS -A input -i $INTERFACE -p tcp \ --destination-port 23 -l -j ACCEPT #fake finger $IPCHAINS -A input -i $INTERFACE -p tcp \ --destination-port 79 -l -j ACCEPT #fake http $IPCHAINS -A input -i $INTERFACE -p tcp \ --destination-port 80 -l -j ACCEPT echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_trojan # ========================================================================== fw_jerks () { #--------------- ip personalizzati da filtrare echo -n "Internet Jerks : " if [ $JERK = "ON" ]; then for jerk in $JERK_IP ; do $IPCHAINS -A input -i $INTERFACE -s $jerk -j DENY done echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" else echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_jerks # ========================================================================== fw_nolog () { #--------------- blocco senza log echo -n "Blocco IGMP e PIM : " # Rifiuta senza loggarli i pacchetti dei protocolli IGMP (2) e PIM (103) # Libero ha il vizio di mandare 'sti pacchetti che ingolfano i log! ;-) $IPCHAINS -A input -i $INTERFACE -p 2 -s $ANYWHERE \ -d $CLASS_D_MULTICAST -j DENY $IPCHAINS -A input -i $INTERFACE -p 103 -s $ANYWHERE \ -d $CLASS_D_MULTICAST -j DENY echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" } # fw_nolog # ========================================================================== fw_blocklog () { #--------------- blocco e log echo -n "Blocco e log di tutto il resto : " # Rifiuta pacchetti spoof che simulano di provenire dall'esterno. $IPCHAINS -A input -i $INTERFACE -s $LOCALIP -j DENY -l # Rifiuta pacchetti che sembrano provenire da una rete privata di Classe A $IPCHAINS -A input -i $INTERFACE -s $CLASS_A -j DENY -l $IPCHAINS -A input -i $INTERFACE -d $CLASS_A -j DENY -l # Rifiuta pacchetti che sembrano provenire da una rete privata di Classe B $IPCHAINS -A input -i $INTERFACE -s $CLASS_B -j DENY -l $IPCHAINS -A input -i $INTERFACE -d $CLASS_B -j DENY -l # Rifiuta pacchetti che sembrano provenire da una rete privata di Classe C $IPCHAINS -A input -i $INTERFACE -s $CLASS_C -j DENY -l $IPCHAINS -A input -i $INTERFACE -d $CLASS_C -j DENY -l # Rifiuta pacchetti che sembrano provenire dall'interfaccia di Loopback $IPCHAINS -A input -i $INTERFACE -s $LOOPBACK -j DENY -l # Rifiuta pacchetti broadcast address SOURCE $IPCHAINS -A input -i $INTERFACE -s $INTERFACEMASK -j DENY -l # Rifiuta pacchetti multicast addresses di Classe D (in.h) (NET-3-HOWTO) # Il Multicast e' illegale come indirizzo sorgente, ed usa UDP. $IPCHAINS -A input -i $INTERFACE -s $CLASS_D_MULTICAST -j DENY -l # Rifiuta pacchetti da indirizzi IP riservati di Classe E $IPCHAINS -A input -i $INTERFACE -s $CLASS_E_RESERVED_NET -j DENY -l # Rifiuta pacchetti con indirizzi definiti riservati dall'IANA. # Nota: questi indirizzi vengono allocati periodicamente e possono # quindi variare. Controllare possibilmente ogni mese la nuova lista # http://www.isi.edu/in-notes/iana/assignments/ipv4-address-space # Per sicurezza, sono attivi solo le seguenti classi di ip: # # 0.*.*.* - Non possono essere bloccati per il DHCP # 127.*.*.* - LoopBack # 169.254.*.* - Link Local Networks # 192.0.2.* - TEST-NET # 224-255.*.*.* # # Gli altri variano troppo spesso ultimamente... $IPCHAINS -A input -i $INTERFACE -s 127.0.0.0/8 -j DENY -l $IPCHAINS -A input -i $INTERFACE -s 169.254.0.0/16 -j DENY -l $IPCHAINS -A input -i $INTERFACE -s 192.0.2.0/24 -j DENY -l $IPCHAINS -A input -i $INTERFACE -s 224.0.0.0/3 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 1.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 2.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 5.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 7.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 23.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 27.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 31.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 36.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 37.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 39.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 41.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 42.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 49.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 50.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 58.0.0.0/7 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 60.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 67.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 68.0.0.0/6 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 72.0.0.0/5 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 80.0.0.0/4 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 96.0.0.0/3 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 197.0.0.0/8 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 218.0.0.0/7 -j DENY -l # $IPCHAINS -A input -i $INTERFACE -s 220.0.0.0/6 -j DENY -l #--------------- porte TCP non privilegiate # NFS: instauramento connessione TCP $IPCHAINS -A input -i $INTERFACE -p tcp -y -d $LOCALIP \ $NFS_PORT -j DENY -l # Xwindow: instauramento connessione $IPCHAINS -A input -i $INTERFACE -p tcp -y -d $LOCALIP \ $XWINDOW_PORTS -j DENY -l # SOCKS: instauramento connessione # $IPCHAINS -A input -i $INTERFACE -p tcp -y -d $LOCALIP \ # $SOCKS_PORT -j DENY -l #--------------- porte UDP non privilegiate # NFS: instauramento connessione UDP $IPCHAINS -A input -i $INTERFACE -p udp -d $LOCALIP \ $NFS_PORT -j DENY -l # TRACEROUTE UDP in ingresso $IPCHAINS -A input -i $INTERFACE -p udp -s $ANYWHERE \ $TRACEROUTE_SRC_PORTS -d $LOCALIP $TRACEROUTE_DEST_PORTS -j DENY -l #--------------- altri log $IPCHAINS -A input -i $INTERFACE -p tcp -d $LOCALIP -j DENY -l $IPCHAINS -A input -i $INTERFACE -p udp -d $LOCALIP $PRIVPORTS \ -j DENY -l $IPCHAINS -A input -i $INTERFACE -p udp -d $LOCALIP $UNPRIVPORTS \ -j DENY -l $IPCHAINS -A input -i $INTERFACE -p icmp -s $ANYWHERE 5 \ -d $LOCALIP -j DENY -l $IPCHAINS -A input -i $INTERFACE -p icmp -s $ANYWHERE 13:255 \ -d $LOCALIP -j DENY -l $IPCHAINS -A input -i $INTERFACE -d $ANYWHERE -j DENY -l echo -e "\t\t\t\t[ ${GREEN}OK ${WHITE}]" } # fw_blocklog # ========================================================================== fw_ver_masqmod () { #--------------- controllo presenza moduli masquerading echo -e "${YELLOW}Mascheramento : ${WHITE}" echo -n "Controllo presenza moduli necessari : " MASQ_PRESENT="" for mod in ${IP_MASQ_MODULES}; do if [ ! -e /lib/modules/$CURRENT_KERNEL/ipv4/ip_masq_${mod}.o ]; then MASQ_PRESENT="err" fi done } # fw_ver_masqmod # ========================================================================== fw_yesmasqmod () { #--------------- moduli masquerading presenti e si continua echo -e "\t\t\t\t[ ${GREEN}OK ${WHITE}]" echo -n "Installazione dei moduli necessari al Mascheramento : " for mod in ${IP_MASQ_MODULES} ; do /sbin/insmod "ip_masq_${mod}" > /dev/null done echo -e "\t\t[ ${GREEN}OK ${WHITE}]" echo -n "Attivazione IP forwarding : " echo 1 > /proc/sys/net/ipv4/ip_forward echo -e "\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" echo -n "Impostazione della POLICY di inoltro a DENY : " $IPCHAINS -P forward DENY $IPCHAINS -A forward -i $INTERFACE -s $LOCALNET -j MASQ echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]" echo -n "Impostazione Timeout mascher. connessioni TCP a 10 ore : " $IPCHAINS -M -S 36000 0 0 echo -e "\t[ ${GREEN}OK ${WHITE}]" echo -n "Blocco e log di tutto il resto : " $IPCHAINS -A forward -j DENY -s $ANYWHERE -d $ANYWHERE -l echo -e "\t\t\t\t[ ${GREEN}OK ${WHITE}]" } # fw_yesmasqmod # ========================================================================== fw_nomasqmod () { #--------------- moduli masquerading assenti, informa e continua senza echo -e "\t\t\t\t[ ${RED}NO ${WHITE}]" echo echo -e "${RED}Errore!!! Moduli per il Mascheramento " echo -e "non presenti nel sistema. Ricompilare il kernel col " echo -e "supporto per firewall e masquerading.${WHITE}" echo } # fw_nomasqmod # ========================================================================== fw_masq () { #--------------- mascheramento rete locale all' esterno #--------------- verifica esistenza moduli mascheramento if [ $MASQ = "ON" ]; then fw_ver_masqmod #--------------- se esistono, attiva mascheramento if [ -z ${MASQ_PRESENT} ]; then fw_yesmasqmod #--------------- se non esistono, avverti e continua senza else fw_nomasqmod fi else echo -en "${YELLOW}Mascheramento : ${WHITE}" echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]" fi } # fw_masq # ========================================================================== fw_start () { #--------------- parte start dello script clear #--------------- verifica esistenza interfaccia esterna if [ -z $INTERFACEIP ]; then #--------------- se non esiste, avverti ed esci con errore 1 fw_nointerface #--------------- se l'interfaccia esiste, si procede else fw_go fw_protezioni fw_dns fw_http fw_smtp fw_imap fw_pop3 fw_nntp fw_ftp fw_ssh fw_icmp fw_auth fw_irc fw_icq fw_napster fw_realaudio fw_whois fw_trojan fw_jerks fw_nolog fw_blocklog fw_masq fi } # fw_start # ========================================================================== fw_stop () { #--------------- parte stop dello script clear echo "Disattivazione del Firewall in corso..." $IPCHAINS -F $IPCHAINS -P input ACCEPT $IPCHAINS -P forward ACCEPT if [ $MASQ = "ON" ]; then MASQ_PRESENT="" for mod in ${IP_MASQ_MODULES} ; do if [ ! -e /lib/modules/$CURRENT_KERNEL/ipv4/ip_masq_${mod}.o ]; then MASQ_PRESENT="err" fi done if [ -z ${MASQ_PRESENT} ] ; then echo -n "Rimozione dei moduli necessari al Mascheramento : " for mod in ${IP_MASQ_MODULES} ; do /sbin/rmmod "ip_masq_${mod}" > /dev/null done echo -e "\t\t[ ${GREEN}OK ${WHITE}]" echo -n "Disattivazione IP forwarding : " echo 0 > /proc/sys/net/ipv4/ip_forward echo -e "\t\t\t\t\t[ ${GREEN}OK ${WHITE}]" fi fi echo -e "${YELLOW}ATTENZIONE: IL FIREWALL NON E' PIU' OPERATIVO${WHITE}" } # fw_stop # ========================================================================== fw_status () { #--------------- parte stats dello script clear echo "Impostazioni attuali del firewall : " echo -e "Indirizzo IP locale sull'interfaccia \ ${YELLOW}$INTERFACE${WHITE} : ${RED}$LOCALIP${WHITE}" $IPCHAINS -L -n } # fw_status # ========================================================================== fw_altro () { #--------------- nessuna o errata opzione fornita allo script clear echo -en "${BLUE}#############################" echo -e "###############################${WHITE}" echo -en "${BLUE}###${YELLOW} Script di impostazione " echo -e "${MAGENTA}FIREWALL ${YELLOW}v11.0 ${BLUE}###${WHITE}" echo -en "${BLUE}#############################" echo -e "###############################${WHITE}" echo -e "${YELLOW}Utilizzo:${WHITE} firewall start|stop|status|restart" echo -e "\t${CYAN}start${WHITE} = attiva il firewall" echo -e "\t${CYAN}stop${WHITE} = disattiva il firewall" echo -e "\t${CYAN}status${WHITE} = impostazioni correnti del firewall" echo -e "\t${CYAN}restart${WHITE} = rilegge il file di configurazione" echo echo -en "${RED}ATTENZIONE: ${YELLOW}ricorda che l'interfaccia " echo -e "${RED}ppp0${YELLOW} e' attiva" echo -e "solo DOPO aver effettuato la connessione a Internet." echo -en "${WHITE}Interfacce attualmente attive nel PC: " for irf in ${INTERFACES} ; do echo -en "${RED}${irf}${WHITE} " done echo -e "\n\a" } # fw_altro # ========================================================================== # script principale fw_root #--------------- verifica che lo script sia avviato da root fw_cfg #--------------- verifica presenza file di configurazione fw_const #--------------- costanti utili #--------------- le parti variabili sono nel file di configurazione case "$1" in start) fw_start ;; stop) fw_stop ;; restart) fw_stop fw_start ;; status) fw_status ;; *) fw_altro exit 1 esac exit 0 Segue il file di configurazione: # ========================================================================== # ========= Script per la configurazione di un Firewall per Linux ========== # ========================================================================== # # Questo e' il file di configurazione usato dallo script generale di # firewall/masquerading. Modificate tutto quello che serve per adattarlo # al vostro sistema. NON dovrebbe essere necessario modificare lo script # in se', in quanto tutte le cose da modificare sono state spostate qui' # # by Antonio Fragola, aka MrShark - The Informaniac # # NON rimuovete nulla, cambiate solo le cose indicate. # Impostate a ON o OFF i servizi che vi servono o meno # posizione dell'eseguibile "ipchains" - eseguite "which ipchains" da root IPCHAINS="/sbin/ipchains" # interfaccia di rete che vi connette a Internet - di solito ppp0 INTERFACE="ppp0" # masquerading: ON solo se si ha una rete locale che deve accedere a internet. # Indicate anche l'interfaccia che vi collega alla rete locale per la quale # volete fare il masquerading, e la classe della vostra rete locale. Inoltre # indicate quali moduli volete mascherare (per icq serve un modulo NON fornito # col kernel, leggere nel Quick&Easy Configuration Howto per reperirlo). MASQ="ON" LOCAL_INTERFACE="eth0" LOCALNET="192.168.0.0/16" IP_MASQ_MODULES="ftp irc" # altri sono: "cuseeme quake vdolive raudio" # navigazione web HTTP="ON" # trasferimento file FTP="ON" # risoluzione nomi dominio - indicare gli IP dei server del vostro ISP DNS="ON" DNS_IP="193.70.152.25 193.70.192.25 195.130.224.18 195.130.225.129" # invio email - indicare l'IP del server del vostro ISP SMTP="ON" SMTP_IP="193.70.192.50 195.130.225.171" # ricezione email pop3 - inserite gli IP dei server imap che usate # (TUTTI quelli da cui volete ricevere email pop3, non solo quelli # del provider che usate correntemente), nel campo POP3_IP, usando # uno spazio come separatore tra l'uno e l'altro. Se volete andare # a capo, usate a fine riga il carattere "\", SENZA lasciare spazi # dopo di esso!!! Tenete presente che molti provider (come tiscali # e tin) usano IP multipli per i server, quindi dovrete elencarli # tutti (cercateli con nslookup) POP3="ON" POP3_IP="195.130.225.147 195.130.225.148 195.130.225.149 \ 195.130.225.150 195.130.225.151 195.130.225.152 \ 195.130.225.153 195.130.225.154 193.70.192.80 \ 195.130.225.172 193.70.192.70 62.149.128.10" # ricezione email imap - inserite gli IP dei server imap che usate # (TUTTI quelli da cui volete ricevere email imap, non solo quelli # del provider che usate correntemente), nel campo IMAP_IP, usando # uno spazio come separatore tra l'uno e l'altro. Se volete andare # a capo, usate a fine riga il carattere "\", SENZA lasciare spazi # dopo di esso!!! Tenete presente che molti provider (come tiscali # e tin) usano IP multipli per i server, quindi dovrete elencarli # tutti (cercateli con nslookup) IMAP="OFF" IMAP_IP="1.2.3.4 2.3.4.5 3.4.5.6" # news usenet - indicare l'IP del server del vostro ISP NNTP="ON" # news.libero.it, shy.datawell.it, news.caspur.it, news.unina.it, news.ecs.net news.cu.mi.it # NNTP_IP="192.106.1.6 213.26.160.219 193.204.5.75 192.132.34.81 194.21.74.41 193.43.96.1" NNTP_IP="192.106.1.6 213.26.160.219 192.132.34.81 193.43.96.1" # controlli vari di connessione - NON DISATTIVARE! ICMP="ON" # server identd - SERVE PER ALCUNE CONNESSIONI IRC AUTH="ON" # chat irc IRC="ON" # chat icq ICQ="ON" # connessione a server ssh SSH="ON" # napster NAP="ON" # realaudio RAUD="OFF" # client whois WHS="ON" # fakebo - OGNI TANTO MI PRUDE! ;-) FAKE="ON" # altri ip personalizzati da aggiungere al firewall - inserite gli # IP nel campo JERK_IP, usando uno spazio come separatore tra l'uno # e l'altro. Se volete andare a capo, usate a fine riga il carattere # "\", SENZA lasciare spazi dopo di esso!!! JERK="OFF" JERK_IP="1.1.1.1 2.2.2.2 3.3.3.3" THIS IS THE END, MY ONLY FRIEND (by JIM). _________________________________________________________________________________________________________ Capitolo 10. DNS Come dal titolo dell'Howto, creiamo un DNS facilmente e velocemente. La trattazione si riferisce a BIND v8.X (in BIND v4.X non so dove mettere le mani e BIND v9.X è ancora troppo giovane per un uso su macchine da produttività). Nella prima sezione vedremo come configurare Bind, nella seconda, per i più volenterosi e più attenti alla sicurezza, vedremo come spostare la configurazione già pronta per far girare Bind in un ambiente chroot, in modo che possibili aggressori che dovessero bucarlo si ritrovino ad avere a che fare con un filesystem ridotto ai minimi termini in cui possano fare pochissimi danni. Nota: Ho provato ad usare, su segnalazione di varie persone che hanno fatto la stessa cosa, questi stessi file di configurazione con BIND v9.X, che la Mandrake 8.0 installa di default. Ebbene, pare che vadano bene anche per questa versione del DNS, che pur introducendo varie novità (specie per la sicurezza), mantiene la stessa sintassi della versione precedente. Vengono solo segnalati dei warning ("the default for the 'auth-nxdomain' option is now 'no'", "no IPv6 interfaces found", "unknown logging category 'cname' ignored"), ma poi il DNS funziona comunque regolarmente. Sta di fatto che non l'ho testato approfonditamente, e la trattazione del CHROOT si riferisce esclusivamente a BIND v8.X. _________________________________________________________________________________________________________ 10.1. Configurazione di Bind Io a casa ho 2 PC, Pingu e Pinga, collegati in rete locale. Su Pingu a volte gira VmWare, cui in rete virtuale è assegnato l'IP 192.168.0.3. Inoltre accedo a Internet via modem analogico. Senza entrare nei dettagli, scopiazzatevi 'sti file e andate in pace (per altri dettagli leggete il DNS-Howto o gli immarcescibili & insostituibili Appunti di Informatica Libera, gli ex Appunti Linux). Potete cambiare i nomi (DOVETE anzi, se no Pingu e Pinga s'incavolano!) o aggiungerne altri, variando solo l'ultimo numero dell'IP, mentre per il resto lasciate tutto com'è, a meno di sapere dove mettere le mani. Anche se non avete una rete locale, i file vanno bene ugualmente, vi ritroverete con qualcosa in più che non pregiudicherà alcunchè, e vi spingerà al prossimo cambio di PC a tenervi quello attuale e collegarlo al nuovo, tanto più che non spendereste più di centomila lire tra schede di rete e cavi. Per prima cosa impostate il nome del vostro Linux-Box. Se non sapete cosa fare, sappiate che dovrete inventarvi un nome per il vostro PC e per il vostro dominio (consigliato NON sceglierne uno esistente, al massimo cambiate la parte finele, tipo: da yahoo.com a yahoo.cxm se proprio non avete fantasia...). Da utente root date il seguente comando: hostname nome-macchina ad esempio nel mio caso: hostname pingu (d'ora in poi ogni volta che vedete pingu.mrshark.home o simili, sostituiteli con i nomi scelti da voi). Impostate anche il file /etc/HOSTNAME come segue (alcune distribuzioni usano /etc/hostname): === file: /etc/HOSTNAME === pingu oppure: === file: /etc/hostname === pingu Nel caso abbiate una RedHat o derivate (Mandrake, Turbolinux ecc.), modificate il file /etc/sysconfig/network nella parte relativa a HOSTNAME e DOMAINNAME, altrimenti ad ogni riavvio l'hostname ritornerà localhost.localdomain : === file: /etc/sysconfig/network === ... HOSTNAME=pingu DOMAINNAME=mrshark.home Segue il file /etc/hosts, in questa versione già pronto per il protocollo ipv6. Dovreste cambiare solo gli elementi della riga 192.168.0.1. Il primo campo è l'IP della macchina, il secondo il nome completo, il terzo degli alias. NON ELIMINATE la riga 127...: serve per l'interfaccia di loopback, ossia un'interfaccia di rete fittizia che vi permette di collegarvi al vostro stesso PC come se fosse un normale computer di rete. Segue il file: === file: /etc/hosts === 127.0.0.1 localhost.localdomain localhost 192.168.0.1 pingu.mrshark.home pingu ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts Nel file /etc/host.conf inserite: === file: /etc/host.conf === order hosts,bind multi on Nel file named.conf inserite quanto segue, cambiando i due mrshark.home alla fine con il vostro dominio, e inserendo nella sezione forwarders gli IP dei DNS del provider che usate. Nota: Per conoscere in Windows gli IP dei DNS (in caso vengano assegnati in automatico), per poterli inserire in Linux, che invece li richiede obbligatoriamente, eseguite (tramite la voce Esegui... del Menu d'Avvio o Start) il comando winipcfg DOPO esservi collegati a internet, poi cliccate su Dettagli >> e guardate la seconda voce (DNS) della schermata che vi trovate davanti: quello che vedete è l'IP del DNS primario del provider che state usando, mentre premendo il tasto con i 2 punti ".." avrete l'IP del DNS secondario. Io ho messo 4 IP, visto che uso alternativamente 2 ISP diversi, ma dovrebbe funzionare anche con 2 soli IP, dato che di solito i DNS hanno libero accesso, e quindi potete contattare quelli di un ISP anche se ne usate un altro. Commentate le 4 righe della direttiva forwarders e le 4 righe di zone "."... se avete solo una rete locale e non accedete a internet (ci sono delle differenze per alcune directory nella distribuzione Debian, quindi seguono 2 file, usate quello che si addice alla vostra distribuzione; in particolare Debian tiene il file named.conf nella directory /etc/bind/, mentre quasi tutte le altre distribuzioni lo tengono in /etc/): === file: /etc/named.conf REDHAT === options { directory "/var/named"; allow-transfer { 127.0.0.1; 192.168.0.0/24; }; allow-query { 127.0.0.1; 192.168.0.0/24; }; forward first; forwarders { 193.70.152.25; 193.70.192.25; 195.130.224.18; 195.130.225.129; }; }; logging { category lame-servers { null; }; category cname { null; }; }; zone "." { type hint; file "/var/named/db.root"; }; zone "localhost" { type master; file "/var/named/db.local"; }; zone "127.in-addr.arpa" { type master; file "/var/named/db.127"; }; zone "0.in-addr.arpa" { type master; file "/var/named/db.0"; }; zone "255.in-addr.arpa" { type master; file "/var/named/db.255"; }; zone "mrshark.home" { type master; file "/var/named/mrshark.home"; }; zone "0.168.192.in-addr.arpa" { type master; file "/var/named/mrshark.home.rev"; }; === file: /etc/bind/named.conf DEBIAN === options { directory "/var/cache/bind"; allow-transfer { 127.0.0.1; 192.168.0.0/24; }; allow-query { 127.0.0.1; 192.168.0.0/24; }; forward first; forwarders { 193.70.152.25; 193.70.192.25; 195.130.224.18; 195.130.225.129; }; }; logging { category lame-servers { null; }; category cname { null; }; }; zone "." { type hint; file "/etc/bind/db.root"; }; zone "localhost" { type master; file "/etc/bind/db.local"; }; zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127"; }; zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0"; }; zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255"; }; zone "mrshark.home" { type master; file "/etc/bind/mrshark.home"; }; zone "0.168.192.in-addr.arpa" { type master; file "/etc/bind/mrshark.home.rev"; }; Nota: TUTTI i file seguenti vanno inseriti in una stessa directory, che è /var/named/ nel caso di RedHat, o /etc/bind/ nel caso di Debian. Quindi riporto i file senza fare riferimento alle dir, sta a voi inserirli nel punto giusto in base alla vostra distribuzione. Naturalmente dovete cambiare, dovunque li vedete, il nome "mrshark.home" con quello del dominio che avete scelto di usare, e pingu, pinga e win con i nomi dei vostri pc. Dovrete ora creare il file db.root. Questo file contiene gli indirizzi IP dei server DNS principali di Internet. Copiate il seguente (NON cambiate niente): === file: db.root === ; This file holds the information on root name servers needed to ; initialize cache of Internet domain name servers ; (e.g. reference this file in the "cache . " ; configuration file of BIND domain name servers). ; ; This file is made available by InterNIC registration services ; under anonymous FTP as ; file /domain/named.root ; on server FTP.RS.INTERNIC.NET ; -OR- under Gopher at RS.INTERNIC.NET ; under menu InterNIC Registration Services (NSI) ; submenu InterNIC Registration Archives ; file named.root ; ; last update: Aug 22, 1997 ; related version of root zone: 1997082200 ; ; ; formerly NS.INTERNIC.NET ; . 3600000 IN NS A.ROOT-SERVERS.NET. A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4 ; ; formerly NS1.ISI.EDU ; . 3600000 NS B.ROOT-SERVERS.NET. B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107 ; ; formerly C.PSI.NET ; . 3600000 NS C.ROOT-SERVERS.NET. C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12 ; ; formerly TERP.UMD.EDU ; . 3600000 NS D.ROOT-SERVERS.NET. D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90 ; ; formerly NS.NASA.GOV ; . 3600000 NS E.ROOT-SERVERS.NET. E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10 ; ; formerly NS.ISC.ORG ; . 3600000 NS F.ROOT-SERVERS.NET. F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241 ; ; formerly NS.NIC.DDN.MIL ; . 3600000 NS G.ROOT-SERVERS.NET. G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4 ; ; formerly AOS.ARL.ARMY.MIL ; . 3600000 NS H.ROOT-SERVERS.NET. H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53 ; ; formerly NIC.NORDU.NET ; . 3600000 NS I.ROOT-SERVERS.NET. I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17 ; ; temporarily housed at NSI (InterNIC) ; . 3600000 NS J.ROOT-SERVERS.NET. J.ROOT-SERVERS.NET. 3600000 A 198.41.0.10 ; ; housed in LINX, operated by RIPE NCC ; . 3600000 NS K.ROOT-SERVERS.NET. K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129 ; ; temporarily housed at ISI (IANA) ; . 3600000 NS L.ROOT-SERVERS.NET. L.ROOT-SERVERS.NET. 3600000 A 198.32.64.12 ; ; housed in Japan, operated by WIDE ; . 3600000 NS M.ROOT-SERVERS.NET. M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33 ; End of File I due file seguenti corrispondono all'interfaccia di loopback e suo reverse, non hanno bisogno di essere modificati: === file: db.local === ; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA localhost. root.localhost. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS localhost. @ IN A 127.0.0.1 === file: db.127 === ; ; BIND reverse data file for local loopback interface ; $TTL 604800 @ IN SOA localhost. root.localhost. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS localhost. 1.0.0 IN PTR localhost. I due file seguenti corrispondono all'indirizzo di broadcast e suo reverse, non hanno bisogno di essere modificati: === file: db.0 === ; ; BIND data file for broadcast zone ; $TTL 604800 @ IN SOA localhost. root.localhost. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS localhost. === file: db.255 === ; ; BIND reverse data file for broadcast zone ; $TTL 604800 @ IN SOA localhost. root.localhost. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS localhost. I due file seguenti corrispondono alla zona su cui il vostro dns avrà autorità e suo reverse, modificate ovunque vedete nomi riferiti ai miei pc: === file: mrshark.home === $ORIGIN mrshark.home. $TTL 1D @ IN SOA pingu.mrshark.home. root.pingu.mrshark.home. ( 1 ; Serial 8H ; Refresh 2H ; Retry 4W ; Expire 1D ) ; Default TTL ; @ IN MX 10 pingu.mrshark.home. @ IN NS pingu.mrshark.home. @ IN A 192.168.0.1 pingu IN A 192.168.0.1 pinga IN A 192.168.0.2 win IN A 192.168.0.129 localhost IN A 127.0.0.1 www IN CNAME pingu ftp IN CNAME pingu === file: mrshark.home.rev === $ORIGIN 0.168.192.in-addr.arpa. $TTL 1D @ IN SOA pingu.mrshark.home. root.pingu.mrshark.home. ( 1 ; Serial 8H ; Refresh 2H ; Retry 4W ; Expire 1D ) ; Default TTL @ IN NS pingu.mrshark.home. 1 IN PTR pingu.mrshark.home. 2 IN PTR pinga.mrshark.home. 129 IN PTR win.mrshark.home. L'ultimo file è quello che dice al sistema a quale dns rivolgersi, modificate i due domini indicati: === file: resolv.conf === search mrshark.home domain mrshark.home nameserver 127.0.0.1 nameserver 192.168.0.1 Salvate tutto, riavviate il sistema o riavviate BIND (da utente root: /etc/rc.d/init.d/named restart per RedHat, /etc/init.d/bind restart per Debian). Ora incominciate a fare le vostre prove. Esempi di prove per il mio PC sono (dal prompt di nslookup ">"): 192.168.0.1, 192.168.0.2, www.mrshark.home, ftp.mrshark.home, pingu.mrshark.home, pinga.mrshark.home, pingu, pinga. Se date l'IP dovete ottenere il nome e viceversa. Dopo esservi connessi a Internet, provate anche a fare qualche risoluzione di nomi di siti, p.e. www.yahoo.it o www.mrshark.it ;-). Nota: Nota per l'uso di programmi che gestiscono in automatico il file /etc/resolv.conf, tipo kppp o wvdial: se avete impostato e testato completamente il vostro DNS, nelle impostazioni di questi programmi, invece di indicare il dominio e gli IP dei DNS che vi vengono forniti dal provider, inserite il VOSTRO dominio e come IP del DNS inserite 127.0.0.1, ricordando però di inserire i VERI IP dei DNS del provider nella sezione forwarders del file named.conf, in modo che il vostro DNS possa interrogare quelli esterni nel caso non riesca a gestire in proprio la risoluzione dei nomi. _________________________________________________________________________________________________________ 10.2. Chrooting Bind Attenzione La trattazione del CHROOT si riferisce esclusivamente a BIND v8.X! Creare un ambiente chroot per un qualche servizio/demone significa creargli un mini filesystem, su cui si applicherà il comando chroot, che renderà la directory che lo contiene la sua directory root /: se anche riuscissero a violare il servizio, si ritroverebbero un sistema minimo in cui potranno fare ben poco. Di solito si assegnano i file in questa directory a un utente creato appositamente e senza alcun privilegio. Per portare il vostro Bind in un ambiente chroot, dovrete ricompilare dai sorgenti... quindi dovrete avere tutti i tool e librerie necessarie, fate riferimento alla documentazione presente nei sorgenti di Bind, che potete e dovete scaricare da: http://www.isc.org/bind.html, cercate il file bind-src.tar.gz. Per prima cosa create la struttura delle directory che accoglierà il vostro nuovo e fiammante Dns. Io ho usato /chroot/named/, con la seguente struttura risultante: /chroot +-- /named +-- /bin +-- /dev +-- /etc +-- /bind +-- /lib +-- /var +-- /run Quindi date i seguenti comandi: mkdir /chroot mkdir /chroot/named mkdir /chroot/named/bin mkdir /chroot/named/dev mkdir /chroot/named/etc mkdir /chroot/named/lib mkdir /chroot/named/etc/bind mkdir /chroot/named/var mkdir /chroot/named/var/run Ora creiamo l'utente e il gruppo, io ho usato UID e GID 200, che sulla mia Debian erano liberi, voi controllate che effettivamente sul vostro sistema non siano già assegnati, e fate attenzione quando usate la redirezione!!! Se vi scappa un singolo > invece di >>, potete dire addio ai vostri utenti e gruppi!!!: echo 'named:x:200:200:Nameserver:/chroot/named:/bin/false' >> /etc/passwd echo 'named:x:200:' >> /etc/group echo 'named:x:200:' > /chroot/named/etc/group Ora copiate i file della precedente configurazione di bind nella nuova directory (se avete usato i miei file, vanno tutti in /chroot/named/etc/bind/, tranne named.conf che va in /chroot/named/etc/). In seguito quest'ultimo file andrà modificato in minima parte per indicare i nuovi percorsi. Siccome vorrete dei bei log, se non avete una versione recente di syslogd che supporti l'opzione -a (non dovreste avere problemi con le moderne distribuzioni, ma comunque controllate la manpage di syslogd per accertarvene) in modo da poter fare ascoltare il vostro demone syslog già presente anche su un altro socket, avete a questo punto due strade da seguire: installare holelogd, prelevabile presso: ftp://ftp.obtuse.com/pub/utils/utils-1.0.tar.gz, configurandolo seguendo le sue istruzioni e avviandolo dallo script con cui avviate bind, prima di questo naturalmente, con un comando simile al seguente: daemon /usr/local/sbin/holelogd /chroot/named/dev/log (guardate negli script alla fine, le righe sono commentate), oppure configurare bind per fare il log su file invece che via syslog. Facciamo appartenere i file all'utente creato in precedenza: chown -R named:named /chroot/named/etc/bind chown named:named /chroot/named/var/run e copiamo nelle directory di pertinenza alcuni file di supporto, come la libreria C, ricreando anche la sua cache: cd /chroot/named/lib cp -p /lib/libc-2.*.so . ln -s libc-2.*.so libc.so.6 cp -p /lib/ld-2.*.so . ln -s ld-2.*.so ld-linux.so.2 cp /sbin/ldconfig /chroot/named/bin/ chroot /chroot/named /bin/ldconfig -v cp /etc/localtime /chroot/named/etc/ mknod /chroot/named/dev/null c 1 3 chmod 666 /chroot/named/dev/null Con questo avete finito di preparare il filesystem base, ora passiamo alla configurazione e compilazione dei sorgenti, nel momento in cui scrivo erano disponibili in versione 8.2.4: mkdir /usr/local/src/bind cd /usr/local/src/bind tar xvzf /percorso/dei/sorgenti/bind-src.tar.gz dovete modificare alcune opzioni nel file src/port/linux/Makefile.set, in particolare cambiare la riga: DESTRUN=/var/run in modo che diventi: DESTRUN=/chroot/named/var/run e cambiare tutti i percorsi /usr/... in /usr/local/..., nello stesso file. Ora modificate il file src/bin/named/named.h, cercando la riga: #include "pathnames.h" e trasformandola come segue, commentandola e aggiungendo altre cose che serviranno durante la compilazione: /* #include "pathnames.h" */ #define _PATH_NDCSOCK "/var/run/ndc" #define _PATH_CONF "/etc/named.conf" #define _PATH_DEBUG "named.run" #define _PATH_XFERTRACE "xfer.trace" #define _PATH_XFERDDT "xfer.ddt" #define _PATH_XFER "/bin/named-xfer" #define _PATH_DUMPFILE "named_dump.db" #define _PATH_STATS "named.stats" #define _PATH_MEMSTATS "named.memstats" #define _PATH_PIDFILE "/var/run/named.pid" #define _PATH_TMPXFER "xfer.ddt.XXXXXX" A questo punto potete compilare: cd src make clean make depend make NON date il make install, in quanto a questo punto dovete rimuovere la vostra precedente installazione di bind! Provvedete, usando il metodo adatto alla vostra distribuzione, ma solo DOPO aver fatto una copia di backup dello script che viene usato per avviare il DNS, che dopo modificheremo per adattarlo alla nuova situazione. Di solito questo script è /etc/rc.d/init.d/named nelle distribuzioni tipo RedHat o Mandrake, o /etc/init.d/bind in Debian. Ora potete dare il make install per installare i tool accessori. Gli unici file binari che dovranno finire nell'ambiente chroot sono named e named-xfer, e per sicurezza facciamo in modo che il programma named appena installato in /usr/local/sbin/ non possa essere avviato: cp src/bin/named/named /chroot/named/bin cp src/bin/named-xfer/named-xfer /chroot/named/bin chmod 000 /usr/local/sbin/named Ora cercate lo script di avvio del demone syslogd (di solito nella directory /etc/init.d/ o simile) e modificatelo nelle opzioni di avvio, in modo da aggiungere a quelle giè presenti (di solito "-m 0") anche l'opzione: -a /chroot/named/dev/log e riavviate syslogd. Dopo il suo riavvio, dovreste trovare il nuovo file /chroot/named/dev/log con caratteristiche simili alle seguenti: srw-rw-rw- 1 root root 0 Mar 13 20:58 log Ora modifichiamo lo script di avvio di bind di cui prima avete fatto una copia di riserva (perché l'avete fatto, vero? ;-) ). Seguono 2 versioni di script, per RedHat e Debian, se usate altre distribuzioni, adattateli, tenendo presente che le opzioni da aggiungere sono: -t /chroot/named -u named -g named. === Script di avvio per RedHat === #!/bin/sh # # named This shell script takes care of starting and stopping # named (BIND DNS server). # # chkconfig: 345 55 45 # description: named (BIND) is a Domain Name Server (DNS) \ # that is used to resolve host names to IP addresses. # probe: true # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 [ -f /chroot/named/bin/named ] || exit 0 [ -f /chroot/named/etc/named.conf ] || exit 0 #echo -n "Starting holelogd: " #daemon /usr/local/sbin/holelogd /chroot/named/dev/log #echo "." # See how we were called. case "$1" in start) # Start daemons. echo -n "Starting named: " daemon /chroot/named/bin/named -u named -g named -t /chroot/named echo touch /var/lock/subsys/named ;; stop) # Stop daemons. echo -n "Shutting down named: " killproc named rm -f /var/lock/subsys/named echo ;; status) /usr/local/sbin/ndc status exit $? ;; restart) /usr/local/sbin/ndc -n /chroot/named/bin/named "restart -u named -g named -t /chroot/named" exit $? ;; reload) /usr/local/sbin/ndc reload exit $? ;; probe) # named knows how to reload intelligently; we don't want linuxconf # to offer to restart every time /usr/local/sbin/ndc reload >/dev/null 2>&1 || echo start exit 0 ;; *) echo "Usage: named {start|stop|status|restart}" exit 1 esac exit 0 === Script di avvio per Debian === #!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin test -x /chroot/named/bin/named || exit 0 #echo -n "Starting holelogd: " #daemon /usr/local/sbin/holelogd /chroot/named/dev/log #echo "." case "$1" in start) echo -n "Starting domain name service: named" start-stop-daemon --start --quiet \ --exec /chroot/named/bin/named -- -g named -u named -t /chroot/named echo "." ;; stop) echo -n "Stopping domain name service: named" start-stop-daemon --stop --quiet --pidfile /chroot/named/var/run/named.pid \ --exec /chroot/named/bin/named -- -g named -u named -t /chroot/named echo "." ;; restart) /usr/local/sbin/ndc -n /chroot/named/bin/named "restart -u named -g named -t /chroot/named" ;; reload) /usr/local/sbin/ndc reload ;; force-reload) $0 restart ;; *) echo "Usage: /etc/init.d/bind {start|stop|reload|restart|force-reload}" >&2 exit 1 ;; esac exit 0 Le ultime modifiche riguardano il file /chroot/named/etc/named.conf, per indicare le nuove posizioni dei file. Ecco il file modificato: options { directory "/etc/bind"; pid-file "/var/run/named.pid"; named-xfer "/bin/named-xfer"; #query-source address * port 53; allow-transfer { 127.0.0.1; 192.168.0.0/24; }; allow-query { 127.0.0.1; 192.168.0.0/24; }; forward first; forwarders { 193.70.152.25; 193.70.192.25; 195.130.224.18; 195.130.225.129; }; }; // extra block for ndc to work in chroot jail - maybe redundant controls { unix "/var/run/ndc" perm 0600 owner 0 group 0; }; // reduce log verbosity on issues outside our control logging { category lame-servers { null; }; category cname { null; }; }; // prime the server with knowledge of the root servers zone "." { type hint; file "/etc/bind/db.root"; }; // be authoritative for the localhost forward and reverse zones, and for // broadcast zones as per RFC 1912 zone "localhost" { type master; file "/etc/bind/db.local"; }; zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127"; }; zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0"; }; zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255"; }; // local area network zone "mrshark.home" { type master; file "/etc/bind/mrshark.home"; }; zone "0.168.192.in-addr.arpa" { type master; file "/etc/bind/mrshark.home.rev"; }; Con questo, dopo aver riavviato, dovreste avere il vostro DNS funzionante in ambiente Chroot! Un ultimo consiglio: ogni tanto saltano fuori bug anche rilevanti in questo software, quindi vorrete sicuramente aggiornare all'ultima versione disponibile per risolverli. NON dovete rifare tutto da capo! Dovete seguire solo i passi per la modifica dei sorgenti di bind, la sua ricompilazione e la sua installazione/copia di file nell'ambiente Chroot. Il resto dei passaggi vanno fatti solo alla prima installazione! ;-) Per provare che tutto sia andato bene, controllate nei file di syslog ci siano le chiamate di avvio di named e dell'avvenuto chroot e cambio di UID/GID, e usate lsof per controllare che i socket relativi al DNS appartengono agli UID/GID del vostro named. Dovreste avere un output simile al seguente: Aug 17 07:46:12 pingu named[1066]: starting (/etc/named.conf). named 8.2.4-REL Thu Jul 12 16:14:49 CEST 2001 ^Iroot@pi ngu:/usr/local/src/bind-8.2.4/src/bin/named Aug 17 07:46:12 pingu named[1066]: hint zone "" (IN) loaded (serial 0) Aug 17 07:46:12 pingu named[1066]: master zone "localhost" (IN) loaded (serial 1) Aug 17 07:46:12 pingu named[1066]: master zone "127.in-addr.arpa" (IN) loaded (serial 1) Aug 17 07:46:12 pingu named[1066]: master zone "0.in-addr.arpa" (IN) loaded (serial 1) Aug 17 07:46:12 pingu named[1066]: master zone "255.in-addr.arpa" (IN) loaded (serial 1) Aug 17 07:46:12 pingu named[1066]: master zone "mrshark.home" (IN) loaded (serial 1) Aug 17 07:46:12 pingu named[1066]: master zone "0.168.192.in-addr.arpa" (IN) loaded (serial 1) Aug 17 07:46:12 pingu named[1066]: listening on [127.0.0.1].53 (lo) Aug 17 07:46:12 pingu named[1066]: listening on [192.168.0.1].53 (eth0) Aug 17 07:46:12 pingu named[1066]: listening on [151.26.33.74].53 (ppp0) Aug 17 07:46:12 pingu named[1066]: Forwarding source address is [0.0.0.0].1049 Aug 17 07:46:12 pingu named[1067]: chrooted to /chroot/named Aug 17 07:46:12 pingu named[1067]: group = named Aug 17 07:46:12 pingu named[1067]: user = named Aug 17 07:46:12 pingu named[1067]: Ready to answer queries. _________________________________________________________________________________________________________ Capitolo 11. Wwwoffle Wwwoffle è il demone che permette di implementare un cache proxy server sul vostro PC, utile per sfogliare offline le pagine che avete scaricato e per permettere agli altri vostri pc, se avete una rete locale, di accedere a internet, magari limitandone l'uso ad alcuni soli siti e impedendone altri. Tramite un'interfaccia di gestione in html e alcuni script, dispone di un comodo motore di ricerca all'interno della cache, permette di richiedere pagine anche quando si è offline (verranno scaricate quando si sarà online), di controllare i cambiamenti di pagine a intervalli predefiniti e riscaricarle, e inoltre mi sono anche preso la briga di tradurvi le pagine di interfaccia in italiano (sono disponibili dalla versione 2.5e in poi: prego, prego, non c'è di che, non c'è bisogno che mi ringraziate per la traduzione... E non dite che non vi voglio bene! ;-) ). Fate in modo che parta in automatico ad ogni avvio del PC (aggiungetelo con ntsysv o con chkconfig --add wwwoffled). Ricordate di impostare i vostri DNS e dominio in /etc/resolv.conf, anche se usate qualche programma che lo rigenera in automatico ogni volta, tipo kppp o wvdial. Fatelo prima di installarlo, altrimenti potrebbe darvi un errore di nslookup perché non riesce a trovare un Non-Authoritative Host. Rimedio spiccio nel caso ciò accada: DOPO aver stabilito la connessione, riavviate wwwoffle con l'opzione -config, oppure con /etc/rc.d/init.d/wwwoffled restart, oppure settate il file resolv.conf con i DNS fissi. Un rimedio più corretto si trova alla fine della sezione relativa al DNS del Quick&Easy Configuration HOWTO. Un esempio di file /etc/resolv.conf : === file: /etc/resolv.conf === domain libero.it nameserver 195.210.91.1 nameserver 195.210.91.2 Per default wwwoffle rimane in ascolto sulla porta 8080, quindi per usarlo dovete impostare il vostro browser affinche usi il proxy su questa porta (leggere la parte relativa a Junkbuster nel caso vogliate usarli insieme). Per Netscape cercate nel menu Edit --> Preferences --> Advanced --> Proxies --> Manual Proxy --> View e settate la voce HTTP Proxy su localhost e port 8080, mentre per Lynx inserite la riga seguente nel file .bash_profile nella vostra directory HOME: export http_proxy=http://localhost:8080 L'impostazione di base del file /etc/wwwoffle.conf va già bene, comunque potete cambiarla interattivamente puntando il vostro browser su http://localhost:8080, avrete una schermata in cui potrete settare i vari parametri e con le relative spiegazioni. Se avete una rete locale potete concedere l'accesso al proxy modificando la sezione AllowedConnectHosts, inserendo ad esempio per una rete di classe C: 192.168.0.*. Per usare wwwoffle, riavviate il pc o date da utente root il comando /etc/rc.d/init.d/wwwoffle start, o l'equivalente per la vostra distribuzione. Le opzioni base sono: * -online : attiva wwwoffle in modo che le richieste vengano esaudite immediatamente (da attivare appena si è stabilita una connessione); * -offline : mette wwwoffle in modalità offline, e ogni nuova richiesta di connessione viene immagazzinata fino alla successiva connessione; * -fetch : dopo che si è online, scarica le pagine che erano state richieste in assenza di connessione; * -config : rilegge il file di configurazione; * -purge : svuota la cache. Conviene inserire i comandi wwwoffle -online nel file /etc/ppp/ip-up, e wwwoffle -offline nel file /etc/ppp/ip-down, in modo da attivarlo e disattivarlo automaticamente non appena viene instaurata la connessione o la si conclude. _________________________________________________________________________________________________________ Capitolo 12. Junkbuster Junkbuster è un proxy server che filtra le richieste del browser impedendo che venga scaricata spazzatura (spam o junk), come banner e altre immagini inutili o cookie indesiderati (per entrambe le cose, banner e cookie, si può ampliare la lista a mano o scaricare periodicamente i file aggiornati - vedi più avanti). Una volta scaricato e installato da rpm o tar.gz, bisogna attivarlo con il comando: /etc/rc.d/init.d/junkbuster start (adattate alla vostra distribuzione), oltre che fare in modo che parta in automatico ad ogni avvio del PC (aggiungetelo con ntsysv o con chkconfig --add junkbuster). Se non avete altri proxy, la configurazione è già buona: al massimo potete modificare nel file /etc/junkbuster/config la chiamata tinygif impostandola a 2, cosicchè abbiate un riferimento per le immagini che non vengono scaricate, altrimenti verrà usata un'immagine trasparente di 1x1 pixel allargata alle dimensioni dell'immagine sostituita (un'altra possibilità è di avere una broken icon, cioè l'icona che il browser mette di default quando non trova un'immagine, impostando tinygif a 0). Dovete solo modificare le impostazioni del browser affinchè usi un proxy sulla porta 8000 di localhost Usate le istruzioni date nel capitolo di wwwoffle, sostituendo 8080 con 8000. Nota: Debian invece della 8000 usa la porta 5865, quindi o modificate di conseguenza, o cambiate la direttiva listen-address nel file /etc/junkbuster/config. Se invece avete un altro proxy (wwwoffle o squid), dovete impostare sempre il browser affinchè punti a junkbuster sulla porta 8000, e modificare il file /etc/junkbuster/config togliendo il segno di commento # dalla riga : forwardfile /etc/junkbuster/forward e inserendo alla fine del file /etc/junkbuster/forward la riga (nel caso di wwwoffle): * localhost:8080 . . Attenzione ATTENZIONE ai 2 punti finali - sostituite 8080 con 3128 per squid Questo secondo me è il metodo migliore, cioè browser <--> junkbuster <--> proxy <--> internet, al posto di browser <--> proxy <--> junkbuster <--> internet, perché nel primo caso le richieste fatte dal browser per contenuti junk vengono filtrate e non richieste per nulla al proxy e quindi ad internet, mentre nel secondo la cache del proxy si riempirebbe delle immagini fittizie generate da junkbuster, pur non scaricando ugualmente la spazzatura. Per aggiornare gli elenchi di url, immagini e cookie da bloccare, potete scaricarli via browser, alla pagina: http://www.waldherr.org/junkbuster/update.shtml, oppure usare gli script che trovate nella directory /usr/doc/junkbuster/. Si tratta dei file junkbuster.monthly e junkbuster.weekly : per usarli, copiateli rispettivamente in /etc/cron.monthly e /etc/cron.weekly. In questo modo avrete sempre i file aggiornati. Potete anche lanciarli manualmente da shell, naturalmente. Ricordate che usano il programma wget per scaricare, quindi dovete installarlo. Rimane solo da dire che se volete aggiungere vostri url, cookie o immagini da bloccare, dovete farlo nei file /etc/junkbuster/blocklist.local, /etc/junkbuster/cookiefile.local e /etc/junkbuster/imagelist.local, che verranno accodati dagli script di prima ai file appena scaricati. _________________________________________________________________________________________________________ Capitolo 13. Xinetd Xinetd è un sostituto "sicuro" di inetd, che unisce alle caratteristiche di "super-server" quest'ultimo anche quelle dei TCP-Wrappers, permettendo controlli sull'accesso, estese funzionalità di log, la possibilità di associare un servizio a specifiche interfacce di rete, limitazione di possibili attacchi DoS, redirezione di porte, e altro. Xinetd dopo aver letto il suo file di configurazione, si mette in ascolto sulle porte indicate, avviando il servizio richiesto, se vengono passati tutti i controlli e vi si ha diritto. L'unico suo difetto è che gestisce non (ancora) molto bene i servizi RPC come NFS, che dovranno quindi essere avviati col solito portmap o col vecchio inetd. Può essere compilato per l'uso dei TCP-Wrappers, ma visto che le stesse cose si possono fare direttamente con xinetd, non se ne sente il bisogno. _________________________________________________________________________________________________________ 13.1. Informazioni di base xinetd fornisce uno script per fare la conversione in automatico dalla vecchia configurazione di inetd alla nuova versione di file: questo script è xconv.pl, presente nella stessa directory di xinetd (altre distribuzioni, come Mandrake, forniscono un altro script, con risultati medesimi, chiamato inetdconvert). Si usano come segue: /usr/sbin/xconv.pl < /etc/inetd.conf > /tmp/xinetd.conf /usr/sbin/inetdconvert -c La differenza principale tra i due script è che quello standard di xinetd riunisce tutte le impostazioni dei servizi nel file xinetd.conf prodotto, mentre quello di Mandrake crea script separati per i singoli servizi nella directory /etc/xinetd.d, cosa che io preferisco, in quanto tutti i file presenti in questa directory vengono inclusi da xinetd tramite la direttiva includedir /etc/xinetd.d del file di configurazione xinetd.conf, e quindi per aggiungere nuovi servizi basta creare un nuovo file nella directory indicata e riavviare il super-demone, senza dover modificare sempre il suo file generale di configurazione. Se la pensate come me, ma non usate Mandrake, ecco quì di seguito lo script in questione: #!/usr/bin/perl # -*- Mode: cperl -*- #-------------------------------------------------------------------------------- # Copyright (C) 2000 by Chmouel Boudjnah , MandrakeSoft # Redistribution of this file is permitted under the terms of the GNU # Public License (GPL) #-------------------------------------------------------------------------------- ## description: # Update a system from inetd file to xinetd. use strict; my $inet_files = '/etc/inetd.conf'; my $dir = '/etc/xinetd.d/'; my $remain; my $choose; parse_options(@ARGV); $choose = shift; die "Need a service to convert\n" if not $choose and not $remain; system("/bin/mkdir " . "-p " . "$dir") unless -d $dir; local *F; open F, $inet_files; while () { next if /^#/; my @t = split; my ($service, $socket_type, $protocol, $attente, $user, $server) = split; my $programs; $programs .= "$t[$_] " for 6 .. $#t; next if -f "$dir/$service"; next if $service !~ /^$choose$/ and not $remain; select W; open W, ">$dir/$service"; print "# Converted by Linux-Mandrake_inetdconvert\n"; print "service $service\n{\n"; print "\tsocket_type\t\t= $socket_type\n"; print "\tprotocol\t\t= $protocol\n"; print "\twait\t\t\t= ", $attente =~ /yes/ ? "no" : "yes", "\n"; if ($user =~ /(\w+)\.(\w+)/) { print "\tuser\t\t\t= $1\n"; print "\tgroup\t\t\t= $2\n"; } else { print "\tuser\t\t\t= $user\n"; } print "\tserver\t\t\t= $server\n"; print "\tserver_args\t\t= ", $programs, "\n" if $programs; print "\tdisable\t\t\t= no\n}\n"; close W; } close F; sub usage { (my $n = $0) =~ s|.*/||g; print < /etc/xinetd.conf Lo script prevede che la configurazione di base di xinetd sia nel file /etc/xinetd.base, con la stringa PUBLIC_ADDRESS al posto dell'IP che dovrà essere sostituito. Richiamando questo script con il nome dell'interfaccia di rete come suo argomento, per esempio nello script "ifup-..." dell'interfaccia di rete, questa stringa viene sostituita con l'indirizzo IP effettivo e viene creato il file /etc/xinetd.conf, per cui basterà riavviare xinetd per avere la configurazione con l'indirizzo IP corretto. Certo che il tutto è molto più pratico e veloce se invece degli indirizzi IP usate i nomi delle interfacce di rete... _________________________________________________________________________________________________________ 13.3.2. Redirezione di porte xinetd può agire da transparent proxy, tramite la redirezione delle porte, che permette di inviare le richieste per un dato servizio su determinati host e porta, su un'altra porta e anche su un altro host, se necessario. service telnet { flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd only_from = 192.168.1.0/24 redirect = 192.168.1.15 23 } Siccome il meccanismo può essere utile ma pericoloso, è consigliato fare il log su entrambi i lati della connessione, oltre che usare un firewall. Suggerimento: Hint! Hint! Chissà se si può redirezionare un possibile contatto di un possibile attacker su una porta qualsiasi (dove non sia in funzione già un server reale) aperta all'uopo, direttamente su una porta dello stesso attacker... (uno squalo bastardo... ;-) ) _________________________________________________________________________________________________________ 13.3.3. Servizi interni xinetd fornisce e gestisce internamente 5 servizi base UNIX: "echo, time, daytime, chargen e discard". Inoltre fornisce altri 3 servizi, che pur essendo interni, se usati vanno contrassegnati anche come UNLISTED, non essendo riportati né in /etc/services né in /etc/rpc: "servers, services e xadmin". Il primo fornisce informazioni sui server in funzione, il secondo sui servizi disponibili, con protocolli e porte, il terzo è un'interfaccia di amministrazione del super-demone. Poiché questi servizi rendono il vostro sistema vulnerabile, si consiglia di usarli solo in fase di configurazione, non essendo protetti in alcun modo, p.e. da password. Poi per sicurezza si consiglia di disabilitarli nella sezione "defaults": defaults { ... disabled = servers services xadmin ... } Non mi dilungo oltre, in quanto il mio consiglio è di dimenticare che questi 3 servizi esistono! ;-) Inserite la riga "disabled" nella sezione "defaults" e lasciateli perdere. _________________________________________________________________________________________________________ 13.3.4. Chroot di un servizio Se avete configurato un servizio (p.e. FTP) in ambiente chroot e volete continuare a usarlo in questo modo, dovrete usare una sintassi simile alla seguente, con il comando chroot come opzione "server" e il server effettivo nell'opzione "server_args": service ftp { id = ftp socket_type = stream wait = no user = root server = /usr/sbin/chroot server_args = /var/servers/ftp /usr/sbin/in.ftpd -l } _________________________________________________________________________________________________________ Capitolo 14. Mutt Mutt è uno tra i migliori client email per console. Gestisce POP3, IMAP e mailbox/maildir/mh locali. Quì trovate la configurazione di Mutt per uso locale (quindi dovrete scaricare le email dai server POP3 usando fetchmail o simili). È fornito anche un elenco dei tasti principali. Ricordate di impostare la variabile d'ambiente EDITOR con quello che preferite (io uso vim, sezione Bash del Quick&Easy Configuration HOWTO), o impostatelo direttamente nel file di configurazione di Mutt. Create le directory $HOME/Mail/, $HOME/Mail/Lists/, $HOME/Mail/Friends/ e $HOME/Mail/.Mutt/. _________________________________________________________________________________________________________ 14.1. File di configurazione .muttrc ########################################################################## ## OPZIONI PERSONALI # elenco degli indirizzi personali (puo' essere un espressione regolare) set alternates = pippo@libero.it,pippo@tiscalinet.it,pippo.pluto@tin.it # attiva l'accodamento di @$hostname agli indirizzi locali set use_domain = yes # il from dei vostri messaggi (anche se verra' aggirato dai my_hdr...) set from = mrshark@libero.it # dominio da accodare agli indirizzi locali set hostname = "mrshark.home" # vero nome personale da usare nelle email set realname = "Antonio Fragola - MrShark" # non generare il campo From: (usa invece i my_hdr) set use_from = no # non generare il campo User_Agent: (usa invece i my_hdr) set user_agent = no # attiva l'uso degli header personali 'my_hdr' set hdrs = yes # header personali - potete crearne quanti ne volete - non esagerate! my_hdr From: Antonio Fragola - MrShark my_hdr Reply-To: mrshark@libero.it my_hdr X-Operating-System: Debian GNU/Linux 2.2 Potato - Kernel 2.2.18 my_hdr X-Disclaimer: Linux - The choice of a GNU generation! my_hdr X-Mailer: Mutt/1.3.20i http://www.mutt.org my_hdr X-Editor: Vim/5.7.19 http://www.vim.org my_hdr X-URL: http://www.mrshark.it http://cslug.linux.it #my_hdr X-Organization: Dark Half SoftWare my_hdr X-GPG-Keyserver: http://www.keyserver.net my_hdr X-GPG-Keynumber: 0x1503ADAB my_hdr X-GPG-Fingerprint: E4E0 8B1A CDB1 09FA 692E 3E7F F82A 612B 1503 ADAB # ordine di visualizzazione degli header unhdr_order * hdr_order Subject: From: Reply-To: Date: To: CC: BCC: Organization: \ X-Organization: X-Operating-System: X-Mailer: User-Agent: \ X-Disclaimer: # header da visualizzare ignore * unignore Subject: From: Date: To: Reply-To: CC: BCC: Organization: \ X-Organization: X-Operating-System: X-Mailer: User-Agent: \ X-Disclaimer: ########################################################################## ## DIRECTORY E MAILBOX # posizione della directory contenente le Mailbox. Un '+' o '=' all'inizio # di un nome di percorso, in seguito, verra' sostituito con questo valore set folder = $HOME/Mail # file principale dove arrivano le email set spoolfile = $HOME/Mail/inbox # maschera per l'elenco dei file nel browser-file (.* = tutti) set mask = ".*" # directory in cui verranno spostati dallo spool principale i messaggi letti # create la directory! set mbox = "+Read/read-`date +%m-%Y`" # non chiede conferma per creare una nuova mailbox set confirmcreate = no # chiede in uscita da una mailbox se si vogliono spostare i messaggi letti set move = ask-no # tipo di mailbox set mbox_type = mbox ########################################################################## ## OPZIONI PER GLI ALIAS # visualizza il nome reale dell'autore dell'email preso dai propri alias set reverse_alias = yes # file contenente gli alias - si DEVE fare il source del file # NdA: preferisco tenere i file accessori di configurazione nella maildir set alias_file = +.Mutt/mutt_aliases source +.Mutt/mutt_aliases # formato degli alias set alias_format = "%2n %t %-10a %r" # ordina gli alias in base all'alias (oppure address) set sort_alias = alias ########################################################################## ## OPZIONI GENERALI # indicazione del tipo di localizzazione set locale = "it_IT.ISO-8859-1" # insieme di caratteri ammessi set charset = iso-8859-1 # formato della data set date_format = "%d%m%y, %H:%M" # hook di default set default_hook = "~f %s !~P | (~P ~C %s)" # imposta la directory per i file temporanei (consiglio per la privacy: # impostare TMPDIR come indicato in .bash_profile nella sezione BASH del # Quick&Easy Configuration Howto e creare la directory: $HOME/.tmp) set tmpdir = $TMPDIR # disattiva il CTRL-Z per la sospensione di mutt set suspend = no ########################################################################## ## MENU PRINCIPALE # usa caratteri ASCII per indicare le relazioni tra messaggi set ascii_chars = yes # emetti un suono in caso di errori set beep = yes # emetti un suono all'arrivo di nuovi messaggi set beep_new = yes # attiva la visualizzazione della riga di aiuto set help = yes # attiva la visualizzazione di una 'O' di fianco ai vecchi messaggi non letti set mark_old = yes # formato dell'indice set index_format = "%3C %Z %{%b %d} %-25.25n (%3l) %s" # numero di secondi tra i controlli di arrivo nuovi messaggi set mail_check = 5 # chiede conferma prima di cancellare definitivamente i messaggi set delete = ask-yes # ordinamento primario in base ai thread set sort = threads # ordinamento secondario in base alla data di invio set sort_aux = date-sent # evita di dover premere ";" prima di applicare un comando a una serie di # messaggi gia' marcati. Se sono marcati in piu' di uno, applica a tutti set auto_tag = yes # non collassare i thread se contengono messaggi non letti set collapse_unread = no # formato della finestra dei folder set folder_format = "%2C %t %N %-25.25f %8s %d" ########################################################################## ## OPZIONI PER LA VISUALIZZAZIONE MESSAGGIO # attiva il ritorno a capo delle righe piu' lunghe dello schermo set smart_wrap = yes # attiva la visualizzazione di un '+' all'inizio delle righe mandate a capo set markers = yes # attiva la visualizzazione di una o piu' '~' alla fine del messaggio set tilde = yes # impedisce che PageDown porti al messaggio successivo quando si raggiunge # la fine di quello attuale set pager_stop = yes # numero di righe della pagina precedente da visualizzare durante lo scorrimento set pager_context = 2 # numero di voci di indice dei messaggi da visualizzare durante la lettura set pager_index_lines = 4 ########################################################################## ## OPZIONI DI COMPOSIZIONE # chiede se si vuole inserire un campo BCC per un nuovo messaggio set askbcc = no # chiede se si vuole inserire un campo CC per un nuovo messaggio set askcc = yes # inizia a creare o modificare un messaggio e POI visualizza il menu set autoedit = yes # imposta l'uso di '-- ' prima della firma set sig_dashes = yes # chiede se si vuole posporre un messaggio che non si vuole inviare subito set postpone = ask-yes # chiede se si vuole richiamare un messaggio posposto quando se ne crea uno set recall = ask-yes # imposta l'editor da usare (in questo caso preso da .bash_profile) #set editor=$EDITOR # io invece uso vim in questo modo: set editor = "vim -c 'set nobackup' -c '/^$/+1'" # modifica gli headers insieme al messaggio set edit_headers = yes # se deve aggiungere un campo bcc agli header set write_bcc = no # directory in cui conservare i messaggi posposti set postponed = +outbox # file contenente la firma set signature = $HOME/.signature ########################################################################## ## OPZIONI PER LE RISPOSTE # formato dell'attribuzione all'autore #set attribution = "* %d, %n scrive:" set attribution = "* %n <%a> [%d]:" # stringa da preporre al testo quotato set indent_string = "> " # chiede se includere il messaggio originale nelle risposte set include = ask-yes # chiede se si vuole usare il campo 'reply-to' del messaggio originale set reply_to = ask-yes # espressione regolare per riconoscere le risposte ai messaggi set reply_regexp = "^(([Rr]e?):[ \t]*)+" # espressione regolare per riconoscere il testo quotato nei messaggi set quote_regexp = "^([ \t]*[|>:}#])+" # attiva il list-reply (tasto "L") per rispondere a una mailing list set ignore_list_reply_to = yes # formato dei forward di messaggi set forward_format = "[(fwd): %s]" ########################################################################## ## OPZIONI PER L'INVIO # permette l'uso dell'insieme di caratteri a 8 bit set allow_8bit # disattivare l'uso di 'Delivered-To' se si usa postfix set bounce_delivered = no # salva una copia dei messaggi in uscita set copy = yes # mailbox in cui salvare una copia dei messaggi in uscita. In questo caso # sono file del tipo 'sent-aprile-2000' nella directory 'Sent' nella propria # maildir. (create la directory!) set record = "+Sent/sent-`date +%m-%Y`" # posizione di sendmail set sendmail = "/usr/sbin/sendmail -oem -oi" #posizione di mutt_dotlock set dotlock_program = "/usr/bin/mutt_dotlock" ########################################################################## ## MAILCAP E MIME # percorso del file 'mailcap' set mailcap_path = ~/.mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap ########################################################################## ## MAILING-LIST E MAILBOX # elenco delle mailing-list cui si partecipa # in questo caso sono contenute in $folder/Lists/ # L'elencare qui le ML frequentate permette di rispondere inviando # il messaggio alla ML tramite il tasto "L" (maiuscola) lists ML-vim ML-pluto-ildp ML-it-li-org # elenco delle mailbox che si vogliono controllare (gli apici sono inversi!). # Sarete quindi avvisati da Mutt se arriva posta in queste mailbox. # L'ultima e' una via breve per monitorare tutte le mailing-list mailboxes ! +Friends/pippo +IN.admin mailboxes `echo $HOME/Mail/Lists/*` # queste sono quelle che frequento io, quelle sottoscritte (subscribe) si # differenziano dalle altre dal fatto che permettono anche l'invio di # messaggi (quelle che non lo permettono si chiamano newsletter, di solito) lists cslug freshmeat html-it it-li-org softwarelibero lists pluto-ildp tubero ziobudda circolo annunci subscribe cslug it-li-org pluto-ildp tubero softwarelibero mailboxes +admin +inbox +mrshark +spam +Lists/softwarelibero +Lists/annunci mailboxes ! +Lists/cslug +Lists/freshmeat +Lists/html-it +Lists/it-li-org mailboxes +Lists/pluto-ildp +Lists/tubero +Lists/ziobudda +Lists/circolo ########################################################################## ## OPZIONI DI STAMPA # comando di stampa (io uso muttprint, presente su http://freshmeat.net) set print_command = "muttprint" # chiede conferma prima di stampare set print = ask-no # invia i messaggi separatamente al filtro set print_split = yes ######################################################################## ## ASSOCIAZIONI DI TASTI bind index previous-entry bind index next-entry bind pager previous-line bind pager next-line bind pager previous-entry bind pager next-entry # macro personali macro index \ek "| formail -x From: | addysort >> ~/Mail/.Pm/black.lst\n" macro pager \ek "| formail -x From: | addysort >> ~/Mail/.Pm/black.lst\n" ######################################################################## ## CONFIGURAZIONE GnuPG # decommentare la riga seguente se si usa mutt con versione < 1.3.x #set pgp_sign_micalg=pgp-sha1 # default for DSS keys set pgp_decode_command="gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f" set pgp_verify_command="gpg --no-verbose --batch --output - --verify %s %f" set pgp_decrypt_command="gpg --passphrase-fd 0 --no-verbose --batch --output - %f" set pgp_sign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor \ --detach-sign --textmode %?a?-u %a? %f" set pgp_clearsign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 \ --armor --textmode --clearsign %?a?-u %a? %f" set pgp_encrypt_only_command="/usr/lib/mutt/pgpewrap gpg -v --batch --output - \ --encrypt --textmode --armor --always-trust -- -r %r -- %f" set pgp_encrypt_sign_command="/usr/lib/mutt/pgpewrap gpg --passphrase-fd 0 -v --batch \ --output - --encrypt --sign %?a?-u %a? --armor --always-trust -- -r %r -- %f" set pgp_import_command="gpg --no-verbose --import -v %f" set pgp_export_command="gpg --no-verbose --export --armor %r" set pgp_verify_key_command="gpg --no-verbose --batch --fingerprint --check-sigs %r" set pgp_list_pubring_command="gpg --no-verbose --batch --with-colons --list-keys %r" set pgp_list_secring_command="gpg --no-verbose --batch --with-colons --list-secret-keys %r" set pgp_getkeys_command="" ######################################################################## ## COMBINAZIONI DI COLORI # schermi in bianco e nero mono normal none # testo normale mono indicator reverse # messaggio attuale mono tree none # frecce dei thread mono status reverse # riga di stato mono error bold # errori mono message none # messaggi di informazione mono quoted bold # testo quotato mono signature none # firma mono attachment underline # allegati MIME mono search reverse # ricerche mono tilde none # ~ alla fine dei messaggi mono markers bold # + all'inizio delle righe mandate a capo mono hdrdefault none # righe degli header mono bold bold # evidenziazione in grassetto nei body mono underline underline # evidenziazione sottolineato nei body mono header bold "^(from|subject):" mono body underline "((ftp|http|https)://|(file|mailto|news):|www\\.)[-a-zA-Z0-9_.:]\ *[a-zA-Z0-9](/[^][{} \t\n\r\"<>()]*[^][{} \t\n\r\"<>().,:!])?/?" mono body underline "[-a-zA-Z_0-9.]+@[-a-zA-Z_0-9.]+" mono body bold "(^| )\\*[-a-zA-Z0-9äöüß*]+\\*[,.?]?[ \n]" mono body underline "(^| )_[-a-zA-Z0-9äöüß_]+_[,.?]?[ \n]" # schermi a colori color normal brightwhite black # testo normale color indicator brightcyan blue # messaggio attuale color tree brightred black # frecce dei thread color status brightyellow blue # riga di stato color error brightred black # errori color message brightyellow black # messaggi di informazione color signature red black # firma color attachment blue cyan # allegati MIME color search brightyellow red # ricerche color tilde blue black # ~ alla fine dei messaggi color markers brightred black # + all'inizio delle righe mandate a capo color hdrdefault blue black # righe degli header color bold green black # evidenziazione in grassetto nei body color underline yellow black # evidenziazione sottolineato nei body color quoted cyan black # testo quotato color quoted1 yellow black color quoted2 magenta black color quoted3 red black color quoted4 red black color quoted5 red black color quoted6 red black color quoted7 red black color quoted8 red black color quoted9 red black color header brightyellow black "^(from|subject):" color body brightgreen black "((ftp|http|https)://|(file|mailto|news):|www\\.)[-a-zA-Z0-9_.:]\ *[a-zA-z0-9](/[^][{} \t\n\r\"<>()]*[^][{} \t\n\r\"<>().,:!])?/?" color body brightred black "[-a-zA-Z_0-9.+]+@[-a-zA-Z_0-9.]+" color body red black "(^| )\\*[-a-zA-Z0-9äöüß*]+\\*[,.?]?[ \n]" color body green black "(^| )_[-a-zA-Z0-9äöüß_]+_[,.?]?[ \n]" color index blue black ~F # impostato color index brightgreen black ~N # nuovo color index magenta black ~T # segnato color index cyan black ~D # cancellato # URL #color body cyan black "(finger|ftp|http|news|telnet)://[^ >]*" # generica #color body cyan black "" # generica #color body white blue "https://[^ >]*" # https #color body cyan black "ftp://[^ ]*" # ftp #color body green black "[[:alnum:]][-+.#_[:alnum:]]*@[-+.[:alnum:]]*[[:alnum:]]" # http #color body brightred black "mailto: *[^ ]+\(\\?subject=[^ ]+\)?" # mailto # Percorsi, nomi file e variabili #color body brightgreen black "\\~?\(/[-_.,a-zA-Z0-9{}]+\)+" # nomi file #color body brightgreen black "[a-z]:[-_.a-zA-Z0-9\]+" # nomi file DOS/WIN #color body brightred black "\(/[-_.a-zA-Z0-9]+\)+/" # percorsi #color body brightmagenta black "\\$[a-zA-Z][-_a-zA-Z]+" # variabili # Varie #color body red black "^[*] .*:$" # riga attribution #color body brightred black "[*/_]+ *[- &[:alnum:]]+ *[*/_]+" # testo enfatizzato #color body yellow black "[;:8]-?[)/(|PpDO]" # smilies vari :-) #color body blue red "<[Vv]?[Bb]?[Ee]?[Gg]>" # grin vari #color body green black "\( *[-+=#*~_]\){4,}" # righe di bordo #color body red white "[!?]{3,}" # esclamazioni ripet ute #color body brightgreen black "[.0-9]+ ?%" # percentuali #color body white blue "[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}" # indirizzi IP ######################################################################## ## ALTRO # aliases MUAs corrotti charset-hook US-ASCII ISO-8859-1 charset-hook x-unknown ISO-8859-1 charset-hook windows-1250 CP1250 charset-hook windows-1251 CP1251 charset-hook windows-1252 CP1252 charset-hook windows-1253 CP1253 charset-hook windows-1254 CP1254 charset-hook windows-1255 CP1255 charset-hook windows-1256 CP1256 charset-hook windows-1257 CP1257 charset-hook windows-1258 CP1258 # auto_view configuration # richiede la configurazione del mailcap, guardare nell'howto! auto_view text/html application/msword Per quanto riguarda l'ultimissima parte, l'auto_view permette di vedere direttamente dentro mutt gli allegati per i quali esista un convertitore dal loro formato nativo in formato testo puro (anche in più passaggi, questo è il bello delle pipe! ;-) ). Io ho impostato solo HTML e WORD quì, ma voi potete aggiungerne quanti volete. Nella direttiva auto_view dovete specificare tutti i tipi MIME per i quali volete sia attiva la decodifica automatica degli allegati. Questi tipi MIME devono esistere nel vostro file /etc/mime.types, e se non presenti, create il file .mime.types seguendo il file principale come esempio e aggiungeteli voi (devono comunque essere tipi MIME accettabili, cioè standard!). Infine, create o modificate il file .mailcap, aggiungendo in fondo le righe seguenti (links e antiword devono essere installati nel sistema, lynx è analogo ma rende molto meno bene le tabelle - vecchie versioni di links non supportano il "-dump"!): text/html; links -dump %s; copiousoutput application/msword; antiword %s; copiousoutput Fatto questo, vedrete i file HTML e WORD direttamente come testo dentro mutt. Se non vi piace come li visualizza, potete sempre premere "v" per passare al menu degli allegati, salvarli e vederli con altri programmi. Per usare GnuPG da dentro mutt, dovete aver generato la vostra coppia di chiavi pubblica e privata con il comando: gpg --gen-key (seguite le istruzioni, e consultate qualche howto apposito, ma se volete usarlo, saprete già a cosa serve, spero...). Per accedere al semplice menu per l'uso di GPG sui vostri messaggi, premete p SUBITO PRIMA di premere y per inviarlo! Potrete quindi scegliere di codificare o firmare il messaggio (anche entrambe le cose), e altro. _________________________________________________________________________________________________________ 14.2. Mutt e gli Hooks Nota: Questa sezione nasce da una serie di scambi di email con Franco Vite (Caparossa, del LUG di Firenze), cui va il merito della parte della descrizione seguente relativa ai "send-hook", anche se rielaborata in alcuni punti. Grazie mille quindi a Caparossa! ;-) Gli "hooks" (uncini) sono il metodo usato all'interno di mutt per impostare delle opzioni specifiche per un dato folder/header/email/altro, scavalcando le impostazioni predefinite nel file di configurazione. Ne esistono diversi tipi: * folder-hook [!]regexp comando [; altro-comando] dove regexp è un'espressione regolare per identificare la mailbox o comunque l'oggetto su cui applicare il comando successivo (il ! nega la regexp). folder-hook permette di definire impostazioni in base al singolo folder (ad esempio un diverso ordinamento per la mailbox mutt, ottenibile con folder-hook mutt set sort=threads). Ricordate però che non viene ripristinato il precedente valore quando si cambia mailbox, ma si continua ad usare l'ultimo valore assegnato, quindi si deve definire un comportamento di default, tramite un comando simile a: folder-hook . set sort=date-sent. Se dovete specificare più di un comando da eseguire su uno stesso folder, potete specificarli separandoli con ;. Se la vostra regexp contiene spazi, racchiudetela tra virgolette. * mbox-hook [!]regexp mailbox mbox-hook permette di definire una mailbox in cui spostare i messaggi letti da una mailbox (che soddisfa la regexp) in un altra mailbox, automaticamente al cambio di folder o all'uscita del programma. Serve ad aggirare l'mbox predefinita, specificata nel file di configurazione. Infatti, viene usato il primo mbox-hook che si trova (in ordine di apparizione) e di cui viene soddisfatta la regexp, e se non ne può soddisfare nessuno, si usa l'mbox predefinita. Questo comando agisce su intere mailbox, non su singoli messaggi! Quindi TUTTI i messaggi della mailbox che soddisfa la regexp finiscono nella seconda mailbox, non è possibile spostare alcuni messaggi in una mailbox e altri in un'altra (ho chiesto sulla ML il perché di questo comportamento e se è possibile fare qualcosa che funzioni sul SINGOLO messaggio invece dell'intera mailbox, appena ne so di più, modificherò questa parte...). Se la vostra regexp contiene spazi, racchiudetela tra virgolette. * save-hook [!]regexp nomefile save-hook serve a specificare il nome del file predefinito in cui salvare i messaggi che soddisfano la regexp. Il salvataggio, a differenza degli altri hook, è un'azione da fare esplicitamente: mentre un mbox-hook avviene ad esempio in automatico, voi dovete specificare esplicitamente che volete salvare un messaggio in un file (per backup o per altro motivo), e ciò non influenza comunque lo stato della mailbox, i cui messaggi non vengono alterati. Per default, l'hook si attiva se il campo From: di un messaggio soddisfa la regexp, o se il messaggio ha voi come mittente e il destinatario soddisfa la regexp in uno dei campi To: o Cc:. Se la vostra regexp contiene spazi, racchiudetela tra virgolette. Gli specificatori ~X sono spiegati di seguito in questa sezione. * fcc-hook [!]regexp mailbox fcc-hook permette di specificare una mailbox alternativa a quella definita nel file di configurazione, nella direttiva $record, in cui salvare in automatico una copia dei messaggi in uscita. Vengono controllati in ordine i vari fcc-hook, e se non se ne trovano di soddisfacenti, viene usata la mailbox definita in $record. Se la vostra regexp contiene spazi, racchiudetela tra virgolette. Gli specificatori ~X sono spiegati di seguito in questa sezione. * send-hook [!]regexp comando [; altro-comando] send-hook permette di rispondere ad un dato indirizzo email (spesso mailing List) impostando comandi di configurazione specifici per quell'indirizzo (di solito si personalizza il campo From: e la firma da apporre in coda). Per esempio: 1. Di default sono paperino@paperino.it, con la firma: ~/.signature 2. ma sono anche pippo@pippo.it e con questo indirizzo uso la firma ~/.signature.pippo 3. ma ho anche pluto@pluto.it, a cui vi associo la firma: ~/.signature.pluto Poniamo che nel secondo caso sia iscritto alla ML linux@linux.it, mentre nel terzo caso sia iscritto alla ML linux@siena.it. Mutt permette di usare l'indirizzo e la firma del secondo esempio per linux@linux.it, e quelli del terzo esempio per linux@siena.it, e le impostazioni di default per tutti gli altri casi, impostando i seguenti send-hook: send-hook . "set signature=~/.signature ; \ my_hdr From: Paperino " send-hook linux@linux.it "set signature=~/.signature.pippo ; \ my_hdr From: Pippo " send-hook linux@siena.it "set signature=~/.signature.pluto ; \ my_hdr From: Pluto " La prima riga, fondamentale, dice a mutt di tornare alle impostazioni di default tutte le volte che non è stata usata una regola send-hook. Altrimenti viene usata sempre l'ultima regola applicata. Nel secondo caso, tutte le volte che facciamo un reply o un post alla lista linux@linux.it, alla quale, come abbiamo detto prima, siamo iscritti con l'indirizzo pippo@pippo.it, viene usato quest'ultimo indirizzo e come firma quella inerente all'utente pippo. Nel caso scrivessimo alla lista bsd@bsd.it, verrebbero usati indirizzo e firma di default (paperino, nel nostro esempio). Nel terzo caso, per concludere, essendo iscritti alla lista linux@siena.it con l'indirizzo pluto@pluto.it, facciamo sì che mutt usi indirizzo e firma adeguati per post e reply. Come sempre, se la vostra regexp contiene spazi, racchiudetela tra virgolette. Gli specificatori ~X sono spiegati di seguito in questa sezione. * message-hook [!]regexp comando [; altro-comando] message-hook permette di impostare dei comandi specifici prima di visualizzare o formattare un messaggio. Se la vostra regexp contiene spazi, racchiudetela tra virgolette. Gli specificatori ~X sono spiegati di seguito in questa sezione. * e altri meno usati, come pgp-hook, charset-hook, iconv-hook, account-hook, fcc-save-hook. L'ultimo è una forma breve per unire un fcc-hook e un save-hook. Tutte le regexp sottintendono un hook di default (appunto default_hook, impostato col comando set default_hook = "..." del file di configurazione e che ha come valore predefinito "~f %s !~P | (~P ~C %s)", che "matcha" messaggi con mittente %s ma non creati da te oppure messaggi creati da te e inviati a %s in To: o Cc:). Dovunque si possa specificare un pattern (dove lecito e logico...) si possono usare i seguenti specificatori per restringere la ricerca a ciò che si vuole: ~A tutti i messaggi ~b EXPR messaggi contenenti EXPR nel corpo del messaggio ~B EXPR messaggi contenenti EXPR nell'intero messaggio ~c USER messaggi inviati in Cc all'USER ~C EXPR messaggi inviati a EXPR in To: o Cc: ~D messaggi cancellati ~d [MIN]-[MAX] messaggi con ``date-sent'' nell'intervallo indicato ~E messaggi scaduti (spirati...) ~e EXPR messaggi contenenti EXPR nel campo ``Sender'' ~F messaggi con il FLAG impostato ~f USER messaggi con mittente USER ~g messaggi segnati con PGP ~G messaggi codificati con PGP ~h EXPR messages contenenti EXPR negli header del messaggio ~k messaggi contenenti una chiave PGP ~i ID messaggi con ID nel campo ``Message-ID'' ~L EXPR messaggi originato o ricevuto da EXPR ~l messaggi indirizzati a una mailing list conosciuta ~m [MIN]-[MAX] messaggi nell'intervallo MIN-MAX *) ~n [MIN]-[MAX] messages con un punteggio nell'intervallo MIN-MAX *) ~N messaggi nuovi ~O messaggi vecchi ~p messaggi indirizzati a te (consulta $alternates) ~P messaggi creati da te (consulta $alternates) ~Q messaggi cui si è risposto ~R messaggi letti ~r [MIN]-[MAX] messaggi con ``date-received'' nell'intervallo indicato ~S messaggi supersede (eliminati dal server...) ~s SUBJECT messaggi con SUBJECT nel campo ``Subject'' ~T messaggi con un tag ~t USER messaggi indirizzati all'USER ~U messaggi non letti ~v messaggio parte di un thread collassato ~x EXPR messaggi contenenti EXPR nel campo ``References'' ~y EXPR messaggi contenenti EXPR nel campo ``X-Label'' ~z [MIN]-[MAX] messaggi con dimensione nell'intervallo MIN-MAX *) *) Sono permesse anche le forme <[MAX], >[MIN], [MIN]- e -[MAX]. Si possono concatenare più pattern in successione, che funzioneranno in AND logico ("~t mutt ~f elkins" selezionerà i messaggi inviati a "mutt" da "elkins"). Gli altri operatori logici sono: ! (NOT), | (OR), e le parentesi tonde () per raggruppare ("!(~t mutt|~c mutt) ~f elkins" selezionerà i messaggi che non hanno "mutt" nei campi To: o Cc: e creati da "elkins"). Le ricerche per data DEVONO essere nel formato GG/MM/AA (mese e anno sono opzionali, e assumono come valori predefiniti quelli del mese e anno correnti). Ad esempio: "~d 20/1/95-31/10". Se ometti la prima data (MIN), indicando solo ``-GG/MM/AA'', verranno selezionati tutti i messaggi prima di quella data. Se ometti la seconda data (MAX), e specifichi solo ``DD/MM/YY-'', verranno selezionati tutti i messaggi dopo quella data. Se indichi solo una singola data senza il trattino (``-''), verranno selezionati solo i messaggi di quella specifica data. Altre info nel manuale ufficiale. _________________________________________________________________________________________________________ 14.3. Tasti principali Note: 1. I cursori funzionano in maniera diversa dal default, modificato per consentire di scorrere la lista dei messaggi anche durante la lettura. 2. ^ sta per CTRL, sta per il tasto indicato 3. I comandi sono case-sensitive, maiuscole e minuscole sono diverse. Movimenti: (NELL'INDICE) spostati alla voce precedente (NELL'INDICE) spostati alla voce successiva (DURANTE LA LETTURA MESSAGGI) spostati alla voce precedente (DURANTE LA LETTURA MESSAGGI) spostati alla voce successiva (DURANTE LA LETTURA MESSAGGI) spostati al messaggio precedente (DURANTE LA LETTURA MESSAGGI) spostati al messaggio successivo spostati alla pagina precedente spostati alla pagina successiva salta al successivo messaggio nuovo salta al precedente messaggio nuovo ^N salta al thread successivo ^P salta al thread precedente = spostati alla prima voce * spostati all'ultima voce Modifiche: o ordina i messaggi O ordina i messaggi in ordine inverso c apri un altro folder d cancella la voce corrente u de-cancella la voce corrente D cancella i messaggi corrispondenti al modello U de-cancella i messaggi corrispondenti al modello ^D cancella tutti i messaggi nel thread ^U de-cancella tutti i messaggi nel thread w imposta un flag di stato su un messaggio W cancella il flag di stato da un messaggio t (de)segna la voce corrente T segna i messaggi corrispondenti al modello ^T togli il segno ai messaggi corrispondenti al modello l mostra solo i messaggi corrispondenti al modello ^R segna il thread corrente come gia` letto t segna il thread corrente F (dis)attiva il flag 'importante' del messaggio N (dis)attiva il flag 'nuovo' di un messaggio ; applica la prossima funzione ai messaggi segnati Ricerche: b cerca all'interno dei Body dei messaggi b (ELIMINANDO ~b ) cerca nei subject dei messaggi / cerca una espressione regolare / cerca all'indietro una espressione regolare n cerca la prossima corrispondenza Messaggi: visualizza un messaggio visualizza un messaggio @ visualizza l'indirizzo completo del mittente h visualizza il messaggio con gli header completi m componi un nuovo messaggio r rispondi a un messaggio L rispondi alla mailing list indicata g rispondi a tutti i destinatari b rispedisci un messaggio a un altro utente f inoltra un messaggio con i commenti R richiama un messaggio rimandato e modifica il messaggio corrente per rispedirlo v mostra gli allegati MIME C fai una copia decodificata (text/plain) C copia un messaggio in un file/mailbox s salva in un file un messaggio/allegato a crea un alias dal mittente del messaggio permette di accedere all'elenco degli alias durante la composizione quando viene richiesto di inserire il destinatario, il cc o il bcc Varie: mostra la documentazione di Mutt ? aiuto sui tasti salta a un al messaggio NUM p stampa la voce corrente $ salva i cambiamenti alla mailbox q salva i cambiamenti alla mailbox ed esci x esci da questo menu ^L cancella e ridisegna lo schermo : inserisci un comando di muttrc | manda un messaggio/allegato a un comando della shell con una pipe ^B richiama URLVIEW per estrarre le URL dal messaggio V mostra il numero di versione e la data di Mutt k inserisce il mittente nella Black List (per procmail) E ora divertitevi ad usarlo! _________________________________________________________________________________________________________ 14.4. Grepmail e Mutt Grepmail è uno script in perl che permette di fare ricerche molto velocemente nelle vostre mailbox. Ne parlo quì perché esiste uno script di shell ("grepm", in coda a questa sezione), che fa da wrapper ad esso, richiamando direttamente mutt sul risultato. Le sue particolarità sono le seguenti: * ritorna come risultato delle mailbox contenenti tutti i messaggi che soddisfano i criteri di ricerca, non solo le righe che contengono ciò che cercate * può cercare nel corpo o tra gli header dei messaggi * può eseguire ricerche anche su mailbox compresse in vari formati, tra cui bzip2 e gzip Se non trovate il pacchetto già pronto per la vostra distribuzione preferita, scaricate i sorgenti di grepmail dal sito: http://grepmail.sourceforge.net. Per prima cosa, se non li avete già nel vostro sistema, installate i due moduli perl Date::Parse e Date::Manip con i comandi seguenti: perl -MCPAN -e 'install Date::Parse' perl -MCPAN -e 'install Date::Manip' quindi compilate come segue (rispondendo eventualmente y alla domanda sull'installazione del modulo Mail::Folder::FastReader, per velocizzare di un 10/20% le ricerche), X.YZ è la versione del programma: cd /usr/local/src tar xvzf /percorso/verso/file/coi/sorgenti/grepmail-X.YZ.tar.gz cd grepmail-X.YZ perl Makefile.PL make make test make install Se make test segnala qualche errore, usate make testfunc per vedere nello specifico l'errore (a me ne dava uno sulle mailbox tzipped, ma visto che non le uso, non me ne sono preoccupato). Per default la ricerca avviene sia sugli header che nel corpo del messaggio. L'output può essere inviato su un file (otterrete una mailbox standard), o direttamente in pipe di nuovo a grepmail per un ulteriore raffinamento della ricerca. Queste le opzioni per l'uso di grepmail da shell: grepmail [-abDhilmrRuv] [-s size] [-d "datespec"] [[-e] ] -b cerca nel corpo dei messaggi -d specifica un intervallo di date (*) -a usa la data di ricezione invece di quella di invio per le ricerche -d -D modo debug -e dichiara esplicitamente che la seguente è l'espressione da cercare (utile per ricerche su stringhe che iniziano con "-") -h cerca negli header dei messaggi -H stampa solo gli header ma non i corpi delle email trovate -i ignora maiuscole e minuscole nell'espressione -l visualizza un elenco dei file che contengono l'espressione cercata -M non cercare negli allegati MIME non testuali -m appende "X-Mailfolder: " agli header per indicare in quale folder è avvenuto il match con l'espressione cercata -n visualizza i numeri di riga (e il nome del file se necessario) delle email (lo script "grepm" non funzionerà...) -q modo silenzioso -- non visualizza gli avvertimenti -r visualizza i nomi dei file e il numero di email che soddisfano l'espressione -R ridiscende un albero di directory ricorsivamente -s restringe il risultato alle email inferiori ad una certa dimensione (in bytes) -u assicura che non ci siano email diplicate nell'output -v visualizza le email che NON soddisfano l'espressione -V visualizza il numero di versione -Z non usare Mail::Folder::FastReader anche se presente nel sistema (*) Le date devono essere in uno dei formati seguenti: una data come "today", "1st thursday in June 1992" (richiede Date::Manip), "05/18/93", "12:30 Dec 12th 1880", "8:00pm december tenth", oppure "before", "after", o "since", seguito da una data come specificata sopra, oppure "between and ", dove è definita come sopra. Seguono alcuni esempi, presi dalla manpage: # conta il numero di email ("." "matcha" tutte le email.) grepmail -r . sent-mail # trova tutte le email maggiori a 2000 byte sui "books" grepmail books -s 2000 sent-mail # trova tutte le email inviate ieri grepmail -d yesterday sent-mail # trova tutte le email contenenti "research" inviate prima del primo # giovedì di giugno 1998 (richiede il modulo Date::Manip) grepmail research -d "before 1st thursday in June 1992" sent-mail # trova tutte le email contenenti "research" inviate prima del # primo giugno 1998 grepmail research -d "before 6/1/92" sent-mail # trova tutte le email ricevute dal 8/20/98 che non riguardano # "research" o "job", ignorando maiuscole e minuscole grepmail -iv "(research|job)" -d "since 8/20/98" saved-mail # trova tutte le email su "mime" ma non su "Netscape". Limita la # ricerca al solo corpo (molte email contengono "mime" negli header) grepmail -b mime saved-mail | grepmail Netscape -v # visualizza un elenco delle mailbox contenenti messaggi da "Rodney". # Limita la ricerca ai soli header, poiché il testo quotato # delle email potrebbe contenere il pattern grepmail -hl "^From.*Rodney" saved-mail* # trova tutte le email con il testo "Pilot" sia negli header # che nel corpo del messaggio grepmail -hb "Pilot" saved-mail* # conta il numero di messaggi su "grepmail" in tutte le mailbox # "saved-mail" grepmail -br grepmail saved-mail* # rimuove qualsiasi duplicato in una mailbox grepmail -u saved-mail # converte una mailbox Gnus in formato mbox grepmail . gnus-mailbox-dir/* > mbox grepm è un wrapper per grepmail che invia l'output direttamente a mutt (si usa esternamente ad esso, direttamente da riga di comando, e lo richiama in automatico sul risultato). Si usa esattamente come il tool originale, con le stesse opzioni (visto che è un wrapper, e quindi passa tutto a grepmail). Segue lo script (gli eventuali aggiornamenti su http://privat.schlund.de/barsnick), copiatelo in qualche directory contenuta nel vostro PATH e rendetelo eseguibile con chmod 755 grepm. #!/bin/sh # grepm - a wrapper for grepmail utilizing mutt # grepm-0.6 # written 1998-11-xx by Moritz Barsnick # updated 1998-12-22: added "-m" option for grepmail # added "exit 1" to trap # updated 1999-01-04: added check for empty "mailbox" (don't open mutt) # added messages # added umask (to keep others from reading your messages) # updated 1999-01-19: added trap for SIGPIPE (any other suggestions?) # updated 1999-07-05: added $TMPDIR; we're still subject to races ($TMPFILE # might exist) # updated 1999-11-29: have mutt open the temporary mailbox read-only - # there's no use in editing it anyway PROGNAME=`basename "$0"` TMPDIR=${TMPDIR-/tmp} umask 077 if [ $# -lt 1 ]; then echo 1>&2 "Usage: ${PROGNAME} arguments" exit 1 fi TMPFILE="${TMPDIR}/grepmail-output.$$" # I _would_ check this with "-e", but not all /bin/sh's understand it # so this is just a kludge if [ -f ${TMPFILE} -o -d ${TMPFILE} -o -w ${TMPFILE} ]; then echo 1>&2 "Temporary file ${TMPFILE} exists for some reason! Aborting." exit 1 fi trap "rm -f ${TMPFILE}; exit 1" 1 2 3 13 15 grepmail -m "$@" > "${TMPFILE}" if [ `wc -c "${TMPFILE}" | awk '{print $1}'` -gt 0 ]; then echo 1>&2 "Calling mutt on results file (${TMPFILE})." mutt -R -f "${TMPFILE}" else echo 1>&2 "No matches." fi rm -f "${TMPFILE}" && echo 1>&2 "Deleted results file (${TMPFILE})." _________________________________________________________________________________________________________ Capitolo 15. Slrn 15.1. Introduzione In questa sezione trovate il file di configurazione, ampiamente commentato, e i tasti principali di Slrn (ATTENZIONE, l'HOWTO è stato aggiornato alla versione 0.9.7.1! Quindi se avete qualche problema ad usarlo con versioni precedenti, controllate che non stiate usando opzioni troppo recenti o con una sintassi cambiata, tipo un "set..." davanti). Slrn è un news-reader (un programma capace di collegarsi ad un news-server) che permette di leggere ONLINE i newsgroup. Per questo motivo dovete avere installato un news-server locale (guardate la sezione Leafnode del Quick&Easy Configuration HOWTO per un esempio), in modo da non dover stare collegati a internet tutto il tempo in cui userete i newsgroup: infatti il news-server locale scaricherà le nuove news da quello remoto, e voi usarete il news-reader collegandovi in locale (quindi per usare un news-reader online dovete avere IN FUNZIONE in locale il news-server, anche quando non siete collegati a internet). Per indicare a slrn il server e l'editor da usare, dovrete inserire nel file $HOME/.bash_profile le seguenti righe (sezione Bash del Quick&Easy Configuration HOWTO): NNTPSERVER='127.0.0.1' SLANG_EDITOR='mcedit %s' Slrn ha tre modalità di funzionamento: 1. selezione newsgroup - permette di vedere la lista dei newsgroup presenti sul server (magari visualizzandone solo una parte, tramite wildcard), sottoscrivere o annullare la sottoscrizione ad essi e selezionare quello da consultare 2. selezione articolo/thread - selezionando un newsgroup entrerete in questa modalità, che permette di scegliere gli articoli da salvare, marcarli come letti o meno, inviare un nuovo articolo, oppure rispondere ad uno già presente con un followup (sul newsgroup) o un reply (per email) 3. lettura articolo - selezionando un articolo per la lettura, è poi possibile leggerlo, rispondere per email (tasto r) o sul newsgroup (tasto f), salvarlo (tasto o) o inviarne uno nuovo (tasto P), o ancora stamparlo (tasto y). Il tasto ? permette di avere sempre un aiuto, qualunque sia la modalità selezionata. q permette di ritornare alla modalità precedente o di uscire se si è in quella di selezione newsgroup. La prima volta che userete slrn, dovrete farlo con l'opzione -create, che genera, nella directory indicata nel file di configurazione, altre sottodirectory e il file che contiene la copia locale dei newsgroup presenti sul server (nel caso ciò non avvenga, create le directory $HOME/News/, $HOME/News/decoded/, $HOME/News/other/ e $HOME/News/postponed/, oltre a $HOME/News/.Slrn/). In seguito basterà lanciare in comando slrn da solo, senza opzioni. In genere al primo avvio vi ritroverete con già sottoscritti alcuni newsgroup cui forse non siete interessati, e avete due possibilità: o scorrere la lista a mano e deselezionare i newsgroup uno ad uno con il tasto u, oppure uscire e dare i seguenti comandi nella directory $HOME/News/: tr \: \! < .newsrc > .newsrc.new rm .newsrc mv .newsrc.new .newsrc Per effettuare le sottoscrizioni, premere L e inserire una parte del nome del newsgroup, tipo: *.comp.os.*, poi spostatevi sui newsgroup da sottoscrivere e premere s, infine premete ancora L per visualizzare solo i newsgroup sottoscritti. A volte può capitare di voler rileggere un articolo o un thread già letto e per questo non più visualizzato da slrn: si può farlo con la sequenza 1 o con 1p. La prima riscarica dal server tutti gli articoli già letti (riconoscibili da una D all'inizio della riga), mentre la seconda riconstruisce solo il thread corrente. Per applicare uno stesso comando a più articoli (ad esempio per salvare un intero thread), selezionateli prima con ; o #, e poi applicate il comando normalmente. I file generati da slrn quando si salva un articolo o un thread sono in formato standard mailbox, quindi per aprirli usate l'opzione adatta del vostro mail-reader (per esempio per Mutt usate: mutt -f /path/del/file/salvato). Una caratteristica molto utile di slrn è il cosiddetto scoring: esso permette di assegnare un punteggio agli articoli in base ad alcuni criteri. Questo permette ad esempio di marcare come già letti gli articoli con subject che non vi interessano (killing, da cui killfile, sinonimo di scorefile), oppure di assegnare punteggi alti ad articoli contenenti determinati subject o provenienti da determinate persone, così come di assegnarne di bassi ad altri, facendo in modo da avere nell'elenco degli articoli per primi quelli più interessanti, e via di seguito gli altri. Premendo il tasto K su un articolo e rispondendo ad alcune semplici domande, si genera una voce all'interno dello scorefile, che è possibile visionare o modificare con la sequenza di tasti 1 K. In genere dovrete usare delle espressioni regolari, potete vederne la sintassi nella sezione di Procmail del Quick&Easy Configuration HOWTO. Se volete evitare di scaricare del tutto gli articoli che non vi interessano, dovete impostare di conseguenza il news-server, non il news-reader (guardate la parte apposita nella sezione di Leafnode del Quick&Easy Configuration HOWTO). Altri comandi e consigli sono di seguito, nella descrizione dei tasti principali di slrn, mentre molte altre informazioni e macro possono essere trovate nell'ottimo Slrn-Slrnpull-HOWTO di Alessandro Airaghi, oppure nel manuale ufficiale di Slrn, che mi sono smadonnato a tradurre in italiano per voi! ;-) Lo trovate in vare versioni nell'area "Download" del mio sito: http://www.mrshark.it. _________________________________________________________________________________________________________ 15.2. File di configurazione .slrnrc % server da cui scaricare le News e file apposito % NdA: preferisco tenere i file accessori di configurazione nella newsdir server "127.0.0.1" "News/.Slrn/jnewrc" % nome utente (parte a sinistra di '@') del proprio indirizzo email set username "mrshark" % nome dell'host (parte a destra di '@') del proprio indirizzo email set hostname "ELIMINAMI.libero.it" % nome reale set realname "MrShark - Antonio Fragola" % indirizzo per le risposte (viene usato anche un banale antispam) set replyto "mrshark@ELIMINAMI.libero.it" % file contenente la firma da usare set signature ".signature" % stringa da preporre al testo quotato set quote_string ">" % Se non zero, viene aggiunto uno spazio tra la quote_string e le % righe che non sono gia' quotate, rendendole piu' leggibili set smart_quote 1 % se diverso da 0, la firma non verra' inclusa nel testo quotato dei followup set followup_strip_signature 0 % se impostato ad 1, slrn non permette di inviare articoli con righe non % quotate più lunghe di 80 caratteri. Se impostato a 2 verrà solo mostrato % un avvertimento set reject_long_lines 2 % espressione regolare per riconoscere il testo quotato % questa e' quella che uso io (ne seguono altre di altre persone): ignore_quotes "^ ? ?[><:=|\-]" % ignore_quotes "^[>|#:][>|#: ]" % Sven Guckes : % Extensive setup allowing quoting with "names": % ignore_quotes "^ ? ?[A-Za-z0-9]*[]-|>#:)}=+%>]" % Not so extensive quoting: % ignore_quotes "^ ? ?[]-|>#:)}=+%>]" % Some other things I have tried - but did not like. ;-) % ignore_quotes "^ ? ?[>#:%|)}}=+-]" "^[ \t]*[A-Za-z]+>" % ignore_quotes "^[ \t]+[a-zA-Z]+>" "^ ? ?[]>#:|)}}=+-]+" % ignore_quotes "^[ \t]*[a-zA-Z]+>" % John E. Davis : % Yes, he is the author of SLRN! :-) % ignore_quotes "^\t? \\{0,5\\}[]{}><:=|+\xBB!]" "^[\t ]*[A-Za-z]+>" % Heikki "Hezu" Kantola : % ignore_quotes "^[ ]*[>^<:|&;%]" "^[ ]*[a-zA-Z-]*>" "^()" "^[-=]+>" "^\+\+" % Felix von Leitner % ignore_quotes "^ ? ?[>:)=-]" % ignore_quotes "^ ? ?[-=]?[>:]" % stringhe da preporre in follow-up e reply set followup_date_format "%d%m%y %H:%M" set followup_string "* %r <%f> [%D]:" set reply_string "In '%n', nell'articolo '%s', hai scritto:" % Header personalizzati da inserire nei nuovi articoli % consiglio di eliminare l'ultima '\' dalle righe seguenti % e di inserire le direttive su un'unica riga set custom_headers "X-Operating-System: Debian GNU/Linux 2.2 Potato \ - Kernel 2.2.18\nX-Disclaimer: Linux - The choice of a GNU generation!\nX-Editor: \ Vim/5.7.19 http://www.vim.org\nX-URL: http://www.mrshark.it \ http://cslug.linux.it\nX-GPG-Keyserver: http://www.keyserver.net\nX-GPG-Keynumber: \ 0x1503ADAB\nX-GPG-Fingerprint: E4E0 8B1A CDB1 09FA 692E 3E7F F82A 612B 1503 ADAB" set followup_custom_headers "X-Operating-System: Debian GNU/Linux 2.2 Potato \ - Kernel 2.2.18\nX-Disclaimer: Linux - The choice of a GNU generation!\nX-Editor: \ Vim/5.7.19 http://www.vim.org\nX-URL: http://www.mrshark.it \ http://cslug.linux.it\nX-GPG-Keyserver: http://www.keyserver.net\nX-GPG-Keynumber: \ 0x1503ADAB\nX-GPG-Fingerprint: E4E0 8B1A CDB1 09FA 692E 3E7F F82A 612B 1503 ADAB" set reply_custom_headers "X-Operating-System: Debian GNU/Linux 2.2 Potato \ - Kernel 2.2.18\nX-Disclaimer: Linux - The choice of a GNU generation!\nX-Editor: \ Vim/5.7.19 http://www.vim.org\nX-URL: http://www.mrshark.it \ http://cslug.linux.it\nX-GPG-Keyserver: http://www.keyserver.net\nX-GPG-Keynumber: \ 0x1503ADAB\nX-GPG-Fingerprint: E4E0 8B1A CDB1 09FA 692E 3E7F F82A 612B 1503 ADAB" % Header da mostrare quando si legge un articolo % consiglio di eliminare l'ultima '\' dalle righe seguenti % e di inserire la direttiva visible_headers su un'unica riga visible_headers "From,Subject:,Newsgroups:,Date:,Followup-To:,Mail-Copies-To:,\ Reply-To:,X-Operating-System:,X-Disclaimer:,Organization:,X-Organization:,\ User-Agent:,X-Mailer,X-Newsreader:,X-Posting-Agent:,X-Http-User-Agent:" % WWW browser da usare se si e' o no in X, in seguito alla pressione di 'U' set non_Xbrowser "lynx '%s'" %set non_Xbrowser "links '%s'" %set non_Xbrowser "links file://'%s'" set Xbrowser "netscape -remote 'openURL (%s)' &" %set Xbrowser "netscape '%s' &" %set Xbrowser "~/.bin/url_handler.sh" % se diverso da 0, mostra il primo articolo quando si passa alla modalità articolo set show_article 0 % se diverso da 0, non vengono effettuati backup del file newsrc set no_backups 0 % segnala sia con un beep che visivamente set beep 2 % se diverso da 0, annulla automaticamente le sottoscrizioni ai nuovi gruppi set unsubscribe_new_groups 1 % se posto a 0, previene la ricerca di nuovi newsgroup set check_new_groups 0 % se 0, visualizza il titolo solo nel primo articolo di un thread set show_thread_subject 0 % usa caratteri ASCII per indicare le relazioni tra messaggi set simulate_graphic_chars 1 % abilita supporto per il mouse in xterm set mouse 0 % usa barra colorata come cursore invece di '->' set display_cursor_bar 1 % se impostato ad 1, un articolo viene segnato come letto se visualizzato % se imposatato a 0, deve essere l'utente a segnarlo esplicitamente come letto set auto_mark_article_as_read 0 % se impostati a 0, ci si sposta al prossimo articolo/gruppo automaticamente set query_next_article 1 set query_next_group 1 % se impostato a 0, non viene chiesta conferma per follow-up, reply, quit, ecc... set confirm_actions 0 % se 0, salva tutti i gruppi durante il salvataggio del file newsrc % se 1, non salva i gruppi non sottoscritti % se 2, non salva i gruppi non sottoscritti o non letti set write_newsrc_flags 0 % visualizza '~' alla fine di un articolo set use_tilde 1 % nome dei file che conterranno i propri Post e Reply % (N.B.: la propria HOME e' sottintesa) set save_posts "News/My_Posts" set save_replies "News/My_Replies" % file che conterra' i Post falliti. "" per disabilitare set failed_posts_file "News/Failed_Posts" % nome del file dei punteggi (score). (N.B.: la propria HOME e' sottintesa) % l'ho chiamato con estensione .score cosi' VIM colora la sintassi ;-) set scorefile "News/killfile.score" % articoli con punteggi superiori a min_high_score vengono posti in cima % articoli con punteggi inferiori a max_low_score vengono posti alla fine % articoli con punteggi inferiori a below kill_score vengono eliminati set min_high_score 1 set max_low_score 0 set kill_score -666 % nome della directory in cui vengono posti i file decodificati % (N.B.: la propria HOME e' sottintesa - assicurarsi che esista) set decode_directory "News/decoded" % directory dove vengono salvati tutti gli altri file % (N.B.: la propria HOME e' sottintesa - assicurarsi che esista) set save_directory "News/other" % directory dove verranno posti gli articoli posposti % (N.B.: la propria HOME e' sottintesa - assicurarsi che esista) set postpone_directory "News/postponed" % usa la directory TMPDIR per i file temporanei (consiglio per la privacy: % impostare TMPDIR come indicato in .bash_profile nella sezione BASH del % Quick&Easy Configuration Howto e creare la directory: $HOME/.tmp) set use_tmpdir 1 % ordina per thread, poi per data con i piu' recenti prima set sorting_method 9 % un header con un nuovo subject inizia un nuovo thread set new_subject_breaks_threads 0 % espandi i thread set uncollapse_threads 1 % legge l'active file in avvio set read_active 1 % manda a capo solo il body, non gli header o il testo quotato set wrap_flags 4 % stampante set printer_name "muttprint" % editor set editor_command "vim -c 'set nobackup' +%d '%s'" set mail_editor_command "mutt -H '%s'" % evidenziazioni set emphasized_text_mode 3 set emphasized_text_mask 3 set process_verbatim_marks 1 set hide_verbatim_marks 0 set hide_signature 0 % non postare articoli non modificati set abort_unmodified_edits 1 % Impostazioni per il formato della finestra degli header set overview_date_format " %d%m%y %H:%M" header_display_format 0 "%F%-5S%-5l:[%25r%D] %T%s" header_display_format 1 "%F%-5S%G%-5l:[%12r]%t%s" header_display_format 2 "%F%G%-5l:[%12r]%t%s" header_display_format 3 "%F%-5l:%t%s" header_display_format 4 "%F%-5S%-5l:%t%50s %r" header_display_format 5 "%F%-5S [%10r]:%t%49s %-19g[%17d]" group_display_format 0 " %F [%-5u|%-6t] %n%45g%d" group_display_format 1 " %F%-5u %n%45g%d" group_display_format 2 " %F%-5u %n%50g%-8l-%h" group_display_format 3 " %F%-5u [%-6t] %n" % avvisa se non si rispettano alcune regole di netiquette set netiquette_warnings 0 %--------------------------------------------------------------------------- % Supporto Mime %--------------------------------------------------------------------------- set use_mime 1 set mime_charset "iso-8859-1" set use_metamail 0 set metamail_command "metamail" % visualizza i numeri di fianco agli articoli, per selezioni veloci set use_header_numbers 1 % carattere per nascondere il testo spoiler: set spoiler_char '*' % quando viene svelato uno spoiler, inizia una nuova pagina set spoiler_display_mode 1 % non controllare gli articoli in base agli overview files set spool_check_up_on_nov 0 % macro utili interpret "News/.Slrn/color.sl" setkey article edit_colors "\eec" interpret "News/.Slrn/new-search.sl" setkey article NewSearch->search_first "$" setkey article NewSearch->search_next "&" interpret "News/.Slrn/onekey-score.sl" setkey article OneKeyScore->ignore_subthread "^K" setkey article OneKeyScore->watch_subthread "^W" interpret "News/.Slrn/preferences.sl" interpret "News/.Slrn/screen-resize.sl" set warn_followup_to 2 %--------------------------------------------------------------------------- % Colors %--------------------------------------------------------------------------- set highlight_unread_subjects 1 set color_by_score 3 color article "white" "black" color author "yellow" "black" color boldtext "brightblue" "black" color box "black" "white" color cursor "brightcyan" "blue" color date "lightgray" "black" color description "brightred" "black" color error "brightred" "black" color frame "yellow" "blue" color from_myself "brightmagenta" "black" color group "brightgreen" "black" color grouplens_display "lightgray" "black" color header_name "brightgreen" "black" color header_number "brightgreen" "black" color headers "yellow" "black" color high_score "brightred" "black" color italicstext "magenta" "black" color menu_press "blue" "yellow" color menu "yellow" "blue" color neg_score "green" "black" color normal "white" "black" color pgpsignature "lightgray" "black" color pos_score "blue" "black" color quotes1 "yellow" "black" color quotes2 "magenta" "black" color quotes3 "red" "black" color quotes4 "blue" "black" color quotes5 "green" "black" color quotes6 "white" "black" color quotes7 "cyan" "black" color quotes "cyan" "black" color response_char "cyan" "black" color selection "yellow" "blue" color signature "red" "black" color status "yellow" "blue" color subject "brightgreen" "black" color thread_number "brightblue" "black" color tilde "brightgreen" "black" color tree "brightred" "black" color underlinetext "cyan" "black" color verbatim "green" "black" %----------------------------------------------------- % Monochrome attributes for monochrom terminals. One or more attributes % may be specified. %----------------------------------------------------- mono article "none" mono author "none" mono boldtext "bold" mono cursor "bold" "reverse" mono date "none" mono description "none" mono error "blink" "bold" mono frame "reverse" mono from_myself "bold" mono group "bold" mono grouplens_display "none" mono header_number "none" mono headers "bold" mono high_score "bold" mono italicstext "bold" mono menu_press "none" mono menu "reverse" mono normal "none" mono pgpsignature "none" mono quotes1 "underline" mono quotes2 "underline" mono quotes3 "underline" mono quotes4 "underline" mono quotes5 "underline" mono quotes6 "underline" mono quotes7 "underline" mono quotes "underline" mono response_char "bold" mono selection "bold" mono signature "none" mono status "reverse" mono subject "none" mono thread_number "bold" mono tree "bold" mono underlinetext "underline" mono verbatim "none" _________________________________________________________________________________________________________ 15.3. Tasti principali Note: 1. ^ sta per CTRL, sta per il tasto indicato 2. I comandi sono case-sensitive, maiuscole e minuscole sono diverse. 3. Per attivare i tasti '$' e '&' per fare le ricerche all'interno dei messaggi, dovete inserire nel vostro .slrnrc una riga tipo: interpret "News/.Slrn/new-search.sl" dove 'new-search.sl' è presente alla fine di questa sezione dell'Howto 4. I tasti ^K e ^W (Kill e Watch) fanno parte della macro 'onekey-score.sl', e permettono di imitare gli "occhialini" di Agent, applicando un punteggio temporaneo (dovrete poi rimuoverlo a mano dal killfile... finché non aggiungo un'altra macro che lo fa in automatico, cercatela per ora sul sito di SLRN) che vi permette di tenere sott'occhio o ignorare un thread con una sola combinazione di tasti. 5. e c vi permette di configurare i colori in modo interattivo ;-) Comandi attivi sui gruppi: P invia un articolo nel newsgroup corrente P invia o modifica un articolo posposto seleziona il newsgroup corrente seleziona il newsgroup corrente s sottoscrivi il newsgroup corrente 1 s sottoscrivi i newsgroup che corrispondono al pattern... u annulla la sottoscrizione al newsgroup 1 u annulla la sottoscrizione ai newsgroup corrispondondenti al pattern... c segna tutti gli articoli come letti (catchup) u segna tutti gli articoli come non letti Movimenti: < spostati in cima all'elenco > spostati in coda all'elenco spostati alla pagina precedente spostati alla pagina successiva spostati al gruppo precedente spostati al gruppo successivo Varie: a aggiungi un nuovo newsgroup ^L cancella e ridisegna lo schermo l (dis)attiva la visualizzazione dei gruppi che non hanno articoli non letti L (dis)attiva l'elenco dei gruppi non sottoscritti 1 L nasconde i gruppi non sottoscritti / ricerca una parola nei gruppi ('l' per visualizzare quelli non sottoscritti) q esci dal newsreader G preleva i nuovi articoli K (dis)attiva la modalità punteggi (score) X forza il salvataggio del file newsrc a (dis)attiva la visualizzazione della descrizione del newsgroup . ripeti l'ultima sequenza di tasti Comandi attivi sugli articoli: Movimenti: seleziona l'articolo o scorri di una pagina scorri l'articolo indietro di una pagina b scorri l'articolo indietro di una pagina scorri l'articolo indietro di una riga scorri l'articolo avanti di una riga sposta la visualizzazione articolo a sinistra sposta la visualizzazione articolo a destra Articoli: P componi un nuovo articolo (NON un follow-up) f componi un follow-up all'articolo corrente 1 f componi un follow-up all'articolo corrente inserendo tutti gli header 2 f componi un follow-up all'articolo corrente non quotando l'originale P invia o modifica un articolo posposto F reinvia (forward) l'articolo a qualcuno r rispondi via email all'autore Ricerche: / cerca in avanti nell'articolo a cerca in avanti un autore A cerca all'indietro un autore s cerca in avanti un Subject S cerca all'indietro un Subject $ cerca negli articoli (guarda nota N.3) = salta al prossimo articolo con il Subject indicato ! salta al prossimo articolo con il punteggio più alto Varie: W (dis)attiva ritorno a capo t (dis)attiva la visualizione completa degli header T (dis)attiva la visualizione delle righe quotate h nascondi la finestra dell'articolo salta il testo quotato ^C cancella l'articolo (solo se si è l'autore) y stampa l'articolo o accoda l'articolo, il thread, o gli articoli segnati ad un file | manda un articolo a un comando della shell con una pipe Comandi attivi nella finestra degli header: Movimenti: < spostati in cima all'elenco degli header > spostati in coda all'elenco degli header p spostati al precedente articolo non letto n spostati al successivo articolo non letto o gruppo se è raggiunta la fine L torna all'ultimo articolo letto N salta al newsgroup successivo spostati all'articolo precedente spostati all'articolo successivo , torna al precedente articolo segnato Gestione: d segna un articolo come letto e spostati al successivo non letto d segna un thread come letto e spostati al successivo non letto u segna un articolo come non letto ; segna l'articolo nella posizione corrente c segna tutti gli articoli come letti (catchup) u segna tutti gli articoli come non letti C segna tutti gli articoli fino alla posizione corrente come letti U segna tutti gli articoli fino alla posizione corrente come non letti Varie: t (dis)attiva il raggruppamento del thread a modifica il formato di visualizzazione degli header s seleziona il tipo di ordinamento p cerca l'header genitore, scaricandolo dal server se necessario 1p ricostruisci il thread, scaricandolo dal server se necessario ^P cerca tutti gli header figli di quello corrente (chiedendo al server) K crea una nuova voce di punteggio (score) in base all'header corrente 1 K modifica il file dei punteggi (score) * segna l'articolo affinchè non sia affetto dai comandi di catchup 1 * elimina i segni '*' da tutti gli articoli marcati x rimuovi tutti gli articoli letti dall'elenco . ripeti l'ultima sequenza di tasti ^W marca con punteggio positivo un thread o articolo ^K marca con punteggio negativo un thread o articolo e c modifica interattiva dei colori di SLRN U cerca l'URL e seguila q esci dalla modalità gruppo _________________________________________________________________________________________________________ 15.4. Varie macro per SLRN 15.4.1. macro: "color.sl" % This file implements a function called 'edit_colors' that may be used for % designing a color scheme interactively. You can define a keybinding for it % (e.g. "ESC e c") by putting a line like this in your slrnrc file: % % setkey article edit_colors "\eec" % % The macro illustrates several things: % % * How to create and use a linked list in the S-Lang language % * Interaction with files % * The slrn select_list_box function variable Color_List_Root = NULL; define color_save_colors_to_file () { variable file; variable fp; variable x; if (Color_List_Root == NULL) return; #ifdef UNIX file = ".slrnrc"; #else file = "slrn.rc"; #endif if (1 != get_yes_no_cancel ("Save colors")) return; file = make_home_filename (file); file = read_mini ("Save colors to", "", file); !if (strlen (file)) return; fp = fopen (file, "a"); if (fp == NULL) verror ("Unable to open %s", file); x = Color_List_Root; while (x != NULL) { if ((x.fg != NULL) and (x.bg != NULL)) () = fputs (sprintf ("color\t%s\t%s\t%s\n", x.obj, x.fg, x.bg), fp); x = x.next; } () = fclose (fp); } define color_store_color (obj, fg, bg) { variable x; x = Color_List_Root; while (x != NULL) { if (x.obj == obj) break; x = x.next; } if (x == NULL) { x = struct { obj, fg, bg, next }; x.next = Color_List_Root; Color_List_Root = x; x.obj = obj; } x.fg = fg; x.bg = bg; } define color_get_color_for_object (title) { variable n; n = _stkdepth (); return select_list_box (title, "black", "red", "green", "brown", "blue", "magenta", "cyan", "lightgray", "gray", "brightred", "brightgreen", "yellow", "brightblue", "brightmagenta", "brightcyan", "white", "default", _stkdepth () - n - 1, 0); } define edit_colors () { variable n, fg, bg; variable obj; forever { n = _stkdepth (); obj = select_list_box ("Object", % title "EXIT", "article", "author", "boldtext", "box", "cursor", "date", "description", "error", "frame", "from_myself", "group", "grouplens_display", "header_name", "header_number", "headers", "high_score", "italicstext", "menu", "menu_press", "neg_score", "normal", "pgpsignature", "pos_score", "quotes", "quotes1", "quotes2", "quotes3", "quotes4", "quotes5", "quotes6", "quotes7", "response_char", "selection", "signature", "status", "subject", "thread_number", "tilde", "tree", "underlinetext", "unread_subject", "url", "verbatim", _stkdepth () - n - 1, 0); if ((obj == "EXIT") or (obj == "")) break; fg = color_get_color_for_object ("Foreground color for " + obj); if (fg == "") break; bg = color_get_color_for_object ("Background color for " + obj); if (bg == "") break; set_color (obj, fg, bg); color_store_color (obj, fg, bg); call ("redraw"); } color_save_colors_to_file (); } _________________________________________________________________________________________________________ 15.4.2. macro: "new-search.sl" % -*- mode: slang; mode: fold -*- % new-search.sl - a replacement for search.sl that comes with slrn % Copyright (C) 2000, 2001 Thomas Schultz % set_preference() mechanism borrowed from J.B. Nicholson-Owens % % This file may be redistributed and / or modified under the terms of the % GNU General Public License, version 2, as published by the Free Software % Foundation. #iffalse % Documentation %{{{ Description: This file is meant as a replacement for the file search.sl that comes with slrn. It also searches through the articles in the current newsgroup, but has nicer features: It leaves threads in their collapsed / uncollapsed status, optionally starts the search at the beginning of the buffer or wraps around the end of the article list. Installation: The interface consists of two functions: search_first() starts a new search, search_next() finds subsequent matches of the same regexp. You can bind them in your slrnrc like this: setkey article NewSearch->search_first "$" setkey article NewSearch->search_next "&" Preferences: You can use the set_preference() function to customize the behaviour of the macro. To do this, put calls to this function in a file and load it after this file is loaded. The following examples show the default values: NewSearch->set_preference("start_at_bob", 0); If set to a non-zero value, start the search at the beginning of the buffer, not at the current article. NewSearch->set_preference("wrap_search", 0); If set to a non-zero value, the search will wrap around the end of the article list. #endif %}}} implements ("NewSearch"); private variable Prev_Search_Str = "", Starting_Point = "", Prefs = Assoc_Type []; % Set preferences %{{{ Prefs["start_at_bob"] = 0; Prefs["wrap_search"] = 0; %}}} static define set_preference (preference, value) %{{{ { !if (assoc_key_exists (Prefs, preference)) error ("Preference does not exist: " + string (preference)); variable desired_type = typeof (Prefs[preference]); if (typeof (value) != desired_type) verror ("Wrong type for %s: This preference wants %s not %s", string (preference), string (desired_type), string (typeof (value))); Prefs[preference] = value; } %}}} private define search_here(search_str, wrapped) %{{{ { if (wrapped) if (Starting_Point == extract_article_header("Message-Id")) error ("Not found."); variable flags = get_header_flags (); if (re_search_article(search_str)) { pop (); return 1; } set_header_flags(flags); call ("hide_article"); return 0; }%}}} private define is_at_end_of_thread ()%{{{ { variable starting_point = extract_article_header ("Message-Id"); EXIT_BLOCK { () = locate_header_by_msgid (starting_point, 0); } collapse_thread (); % goes to the first article in the thread uncollapse_thread (); () = header_down (thread_size () - 1); return (extract_article_header ("Message-ID") == starting_point); }%}}} private define search_articles(search_str, wrapped) %{{{ { variable was_thread_collapsed = is_thread_collapsed(), was_metamail = get_variable_value("use_metamail"); set_integer_variable("use_metamail", 0); % Turn off metamail while searching ERROR_BLOCK { () = locate_header_by_msgid(Starting_Point, 0); } EXIT_BLOCK { set_integer_variable("use_metamail", was_metamail); } if (search_here(search_str, wrapped)) % Is the next match right here? return(0); !if (_is_article_visible() & 2) { call ("article_line_up"); if (search_here(search_str, wrapped)) return(0); } forever % loop through articles { loop (thread_size () - 1) { () = header_down(1); if (search_here(search_str, wrapped)) return(0); } if (is_at_end_of_thread()) { if (was_thread_collapsed) collapse_thread(); !if (header_down(1)) break; was_thread_collapsed = is_thread_collapsed (); if (search_here(search_str, wrapped)) return(0); } else { !if (header_down(1)) break; if (search_here(search_str, wrapped)) return(0); } } EXECUTE_ERROR_BLOCK; return(-1); }%}}} private define perform_search(search_str) %{{{ { Starting_Point = extract_article_header("Message-Id"); if (search_articles(search_str, 0) == -1) { if (Prefs["wrap_search"]) { call("header_bob"); if (search_articles(search_str, 1) == -1) error("Not found."); } else error("Not found."); } }%}}} static define search_first() %{{{ { if (is_group_mode ()) error (_function_name () + " doesn\'t work in group mode!"); variable search_str = read_mini ("Search for regexp", Prev_Search_Str, ""); if (search_str == "") return; Prev_Search_Str = search_str; if (Prefs["start_at_bob"]) call("header_bob"); perform_search(search_str); }%}}} static define search_next() %{{{ { if (is_group_mode ()) error (_function_name () + " doesn\'t work in group mode!"); if (Prev_Search_Str == "") search_first(); else perform_search(Prev_Search_Str); }%}}} _________________________________________________________________________________________________________ 15.4.3. macro: "onekey-score.sl" % -*- mode: slang; mode: fold -*- % onekey-score.sl - create scorefile entries by pressing one single key % Copyright (C) 1999-2000 Thomas Schultz % set_preference() mechanism borrowed from J.B. Nicholson-Owens % % This file may be redistributed and / or modified under the terms of the % GNU General Public License, version 2, as published by the Free Software % Foundation. #iffalse % Documentation %{{{ Description: This file contains macros that allow you to create scorefile entries based one the current article via a single function call / keystroke. Two interfaces are available - the first is very simple and can be used to watch or ignore subthreads. The second is more complex, but also more versatile: It can put a score on subjects, "From:" lines or references. If you regularly use these functions, your scorefile will become quite large, so I recommend the perl-script cleanscore that can automatically remove expired entries. You may also want to use the patch that makes slrn generate scorefile marks, so cleanscore can tell easier which comments belong to which entry. Installation: To use the simple interface, bind the functions watch_subthread() and/or ignore_subthread() to whatever keys you prefer. The corresponding lines in your slrnrc file should look like this: setkey article OneKeyScore->ignore_subthread "^K" setkey article OneKeyScore->watch_subthread "^W" If you do not only want to watch or ignore a subthread, you can use the more complex interface by calling create_score() directly (the two simpler functions are really wrappers around it). An example would be: setkey article "OneKeyScore->create_score('f', -100, 't', 30, 1);" "^X" Please note that it is important to quote the second argument of setkey in this case. You can pass the following options to create_score(): 1. score type - can be 's' for "Subject", 'f' for "From" or 'r' for "References" 2. score value - the score for the entry 3. scope - 't' if the entry should apply to the current ("This") group, 'a' if it should have an effect in all groups. 4. date of expiry - can either be a date string (in format MM/DD/YYYY or DD-MM-YYYY) or an integer. If it is an integer, it will be interpreted as how long from now (in days) the entry should remain valid; if it is zero (or negative), the entry will never expire. 5. apply immediately - if non-zero, the scorefile is reloaded, so the new entry is applied immediately. Thus, the example above would put a score of -100 on the author of the current article for 30 days from now, but only in the current group; the new entry would be applied immediately. Preferences: You can use the set_preference() function to customize the behaviour of the simple interface. To do this, put calls to this function in a file and load it after this file is loaded. The following examples show the default values: OneKeyScore->set_preference("ignore_value", -1000); OneKeyScore->set_preference("watch_value", 250); The score ignore_subthread() and watch_subthread() will assign to the current subthread when they are called. OneKeyScore->set_preference("ignore_expiry", 14); OneKeyScore->set_preference("watch_expiry", 21); How long (in days from date of creation) the new scorefile entries will be active. OneKeyScore->set_preference("ignore_immediately", 0); OneKeyScore->set_preference("watch_immediately", 0); If set to a non-zero value, the scorefile will be applied immediately when a new entry was created. #endif %}}} implements ("OneKeyScore"); private variable Prefs = Assoc_Type []; % Set preferences %{{{ Prefs["ignore_value"] = -1000; Prefs["watch_value"] = 250; Prefs["ignore_expiry"] = 14; Prefs["watch_expiry"] = 21; Prefs["ignore_immediately"] = 0; Prefs["watch_immediately"] = 0; %}}} static define set_preference (preference, value) %{{{ { !if (assoc_key_exists (Prefs, preference)) error ("Preference does not exist: " + string (preference)); variable desired_type = typeof (Prefs[preference]); if (typeof (value) != desired_type) verror ("Wrong type for %s: This preference wants %s not %s", string (preference), string (desired_type), string (typeof (value))); Prefs[preference] = value; } %}}} static define create_score (type, score, scope, expiry, apply) %{{{ { if (is_group_mode ()) error (_function_name () + " doesn\'t work in group mode!"); % Some basic sanity checks... if (typeof(type) == UChar_Type) type = sprintf("%c", type); if (typeof(scope) == UChar_Type) scope = sprintf("%c", scope); type = typecast(type, String_Type); !if (is_substr("sfr",strlow(type))) error ("Unknown score type: " + type); !if (is_substr("ta",scope)) error ("Unknown score scope: " + scope); if (apply) apply = "y"; else apply = "n"; if (typeof(expiry) == Integer_Type) { if (expiry > 0) { variable expiry_date = localtime(_time() + expiry * 24 * 3600); expiry = string(expiry_date.tm_mon+1)+"/"+ string(expiry_date.tm_mday)+"/"+ string(expiry_date.tm_year+1900); } else expiry = ""; } set_input_string (string(score) + "\n" + expiry); set_input_chars (type + scope + apply); call ("create_score"); message_now(""); }%}}} static define ignore_subthread () %{{{ { create_score("r", Prefs["ignore_value"], "t", Prefs["ignore_expiry"], Prefs["ignore_immediately"]); }%}}} static define watch_subthread () %{{{ { create_score("r", Prefs["watch_value"], "t", Prefs["watch_expiry"], Prefs["watch_immediately"]); }%}}} _________________________________________________________________________________________________________ 15.4.4. macro: "preferences.sl" NewSearch->set_preference("start_at_bob", 1); OneKeyScore->set_preference("ignore_value", -100); OneKeyScore->set_preference("watch_value", 100); OneKeyScore->set_preference("ignore_expiry", 30); OneKeyScore->set_preference("watch_expiry", 45); OneKeyScore->set_preference("ignore_immediately", 1); OneKeyScore->set_preference("watch_immediately", 1); _________________________________________________________________________________________________________ 15.4.5. macro: "screen-resize.sl" % Redefines header_window size. % Change int number for better suiting your needs. define resize_screen_hook () { set_article_window_size (SCREEN_HEIGHT - 20); } Siete pronti per il mondo di Usenet, ma prima leggetevi qualche documento sulla Netiquette! _________________________________________________________________________________________________________ Capitolo 16. Masterizzazione Nota: Sezione a cura di Roberto Vallone _________________________________________________________________________________________________________ 16.1. Introduzione In Linux il processo di masterizzazione di CD-R/RW avviene attraverso due fasi ben distinte che spesso su altri sistemi operativi avvengono con l'uso di un unico software. Le due fasi sono: la creazione dell'immagine ISO9660 (il filesystem con il quale i normali cd dati sono organizzati), più le eventuali estensioni, ed il processo di scrittura vera e propria sul cd. Per la realizzazione delle immagini ci si avvale quasi universalmente di mkisofs, mentre per il burning i programmi sono cdrecord e cdrdao. Sono tutti e tre programmi sotto licenza GPL che lavorano a linea di comando e contemplano una quantità di opzioni che ne fa degli strumenti di una difficoltà (solo iniziale però) ed una versatilità veramente notevoli. Ciò non vuol dire che non si possano usare interfacce grafiche varie, ma queste sono _sempre_ front-ends di questi tre programmi (a volte anche di altri meno usati). In questo capitolo tratterò dell'uso di cdrecord+mkisofs. cdrdao è, a detta di molti, un programma altrettanto valido (se non di più per alcuni aspetti, tipo la copia al volo di cd-audio), ma non lo conosco (verrà aggiunto in una prossima revisione del Quick&Easy Configuration HOWTO). Spero di colmare questa lacuna il più presto possibile, e, se nel frattempo, qualcuno vuole contribuire all'howto aggiungendo una sezione su cdrdao eviterò in tutti i modi di offendermi... ;-) Attenzione Tutti i comandi che citerò in cui è incluso cdrecord dovranno essere dati come utente root, dato che cdrecord manda comandi privilegiati attraverso l'interfaccia SCSI. Impostare il setuid per cdrecord in modo da poter masterizzare come utente qualunque non è una buona idea per la sicurezza del sistema. Personalmente preferisco "essere root", poi ognuno può fare come vuole, quindi quelli che seguono sono i comandi per "setuidare" cdrecord. # chown root.root /usr/bin/cdrecord # chmod 4111 /usr/bin/cdrecord Il processo di cd-burning in Linux consta di solito di tre fasi: 1. facciamo riconoscere al nostro pinguino il masterizzatore 2. spappoliamo alcuni cd tanto per gradire (ottimi sottobicchieri, ma devono essere di un numero multiplo di 6) 3. una volta capito bene il funzionamento delle cose ci dimenticheremo di cosa sia un buffer underrun (a meno di non cercarcelo proprio) Alcune precisazioni a quanto detto: * con un po' di attenzione la fase 3 può essere saltata * la necessità di creare precedentemente un'immagine dei dati presume che si abbia sull'hard-disk uno spazio libero equivalente all'immagine che deve essere creata (650-700 Mbyte) * con una macchina abbastanza potente (diciamo un PII 350 o superiore, ed equivalenti) possiamo anche "saltare" la fase di creazione dell'immagine su hard-disk e passare i dati di mkisofs direttamente a cdrecord * coi cd bruciati nella fase 2, oltre a dei sottobicchieri, si possono ricavare dei simpatici ed originali orologi a muro ;-) _________________________________________________________________________________________________________ 16.2. Compilazione del kernel per il riconoscimento del masterizzatore Questa sezione non vuole essere esaustiva. Per maggiori informazioni rimando all'ottimo CD-Writing HOWTO di Winfried Trümper. Sotto Linux sono supportati masterizzatori SCSI, EIDE e per porta parallela (PP nel seguito). Non sono ancora supportati gli USB, per questi si comincerà a vedere qualcosa *forse* con i kernel 2.4.*. La prossima tabella la copio sfacciatamente dall'howto sopra-citato: * con Y si intende che l'abilitazione deve far parte integrante del kernel * con M si intende che l'abilitazione deve avvenire come modulo * con Y/M si intende che si può scegliere indifferentemente un modo o l'altro Sez. Descrizione Modulo SCSI IDE PP ------------------------------------------------------------ BLOCK Enhanced IDE/MFM/RLL... Y BLOCK IDE/ATAPI CDROM ide-cd M *** NOTA BLOCK SCSI hostadaptor emulation ide-scsi M *** NOTA BLOCK Loopback device loop M M M PARIDE Parallel port IDE device paride Y/M PARIDE Parallel port ATAPI CD-ROMs M PARIDE Parallel port generic ATAPI M PARIDE (select a low-level driver) Y SCSI SCSI support scsi_mod Y/M Y/M *** NOTA SCSI SCSI CD-ROM support sr_mod Y/M Y/M *** NOTA SCSI Enable vendor-specific Y Y SCSI SCSI generic support sg Y/M Y/M *** NOTA SCSI (select a low-level driver) Y FS ISO 9660 CDROM filesystem iso9660 Y/M Y/M Y/M FS Microsoft Joliet cdrom... joliet Y Y Y Se tutto va bene, al successivo riavvio, con un dmesg | less potrete vedere che il kernel ha riconosciuto la periferica... e comincia l'avventura! Nota: Per chi usa un masterizzatore EIDE: 1. se si opta per l'uso dei moduli è importante aggiungere i seguenti parametri nel vostro /etc/lilo.conf ... image=/boot/vmlinuz-2.2.18 label=2.2.18 read-only root=/dev/hda3 append="hdc=ide-scsi hdd=ide-scsi" <--------questo ... in modo da indicare a linux che quelle periferiche devono essere "viste" attraverso il modulo ide-scsi. Naturalmente, adattate il codice al vostro caso. Ricordatevi poi di reinstallare lilo, con: # /sbin/lilo 2. se qualcosa non funziona usando i moduli provate ad accorpare nel kernel le voci una per una, a cominciare dalla voce IDE/SCSI, altrimenti detta "Emulazione SCSI". L'emulazione SCSI con i kernel della serie 2.2.* e superiori impone necessariamente che anche gli eventuali lettori cd rom eide presenti sulla macchina siano visti come periferiche SCSI, è quindi inutile (e talvolta produce errori) abilitare nel kernel il modulo ide-cd. Generalmente le periferiche SCSI, oltre alla maggiore affidabilità caratteristica di questa tecnologia, danno minori problemi di riconoscimento/compatibilità col pinguino, se quindi potete permettervelo, un masterizzatore SCSI è la scelta migliore. Nota: Ultima precisazione: qualche volta (è successo a me) un masterizzatore EIDE non ne vuole sapere di andare se non è il master del suo canale, ergo, se non funziona come slave provate ad impostarlo come master. L'impostazione migliore pare essere quella di lasciare i drive sorgenti (hard-disk che ospiterà le immagini ISO9660 e lettore cd-rom) come unità rispettivamente master e slave sul canale primario EIDE, e il masterizzatore come unità master sul canale secondario EIDE, cui nel caso affiancare un eventuale secondo hard-disk. Questo garantisce che le unità funzionino al massimo delle loro possibilità. Utile anche attivare sugli hard-disk e cdrom/cdr/cdrw EIDE (NON gli SCSI!), le funzionalità avanzate permesse, tipo accesso al disco a 32 bit, DMA e altro, tramite il comando hdparm. Attenzione L'uso di hdparm può essere PERICOLOSO! Fate SEMPRE le prove prima e dopo ogni comando hdparm che date, con: hdparm -tT /dev/hdX, sostituendo a X le varie unità. Questo vi fornirà dei test per valutare l'aumento o meno delle prestazioni con le varie opzioni impostate. In genere le opzioni da impostare sono: -d1 (usa DMA) e -c3 (usa accesso al disco a 32bit, con sync sequence). Altre possono essere -u1 e -m... (leggete la man-page di hdparm, per calcolare il valore di m). Tenete inoltre presente che se il supporto ide-scsi è compilato come modulo, quando questo viene scaricato dalla memoria, si perdono le impostazioni di hdparm. Per aggirare l'ostacolo, potete aggiungere al vostro file /etc/modules.conf una riga tipo: post-install ide-scsi /sbin/hdparm ... Per vedere come vengono riconosciute le nostre periferiche dal kernel si può dare, come utente root, il comando: cdrecord -scanbus. Io ho un masterizzatore come master ed un lettore come slave nel secondo canale EIDE, ed ecco il mio output: [tty5][root@gondor /home/rjval]# cdrecord -scanbus Cdrecord 1.9 (i686-pc-linux-gnu) Copyright (C) 1995-2000 Jörg Schilling Linux sg driver version: 2.1.39 Using libscg version 'schily-0.1' scsibus0: 0,0,0 0) 'SAMSUNG ' 'CD-R/RW SW-208B ' 'BS01' Removable CD-ROM 0,1,0 1) 'GoldStar' 'CD-ROM CRD-8322B' '1.02' Removable CD-ROM 0,2,0 2) * 0,3,0 3) * 0,4,0 4) * 0,5,0 5) * 0,6,0 6) * 0,7,0 7) * Come si può vedere il masterizzatore ha le "coordinate" (non mi dilungo sulla loro descrizione) 0,0,0, mentre il lettore ha 0,1,0. Dal momento in cui le periferiche sono riconosciute dal kernel come SCSI, il loro posizionamente in /dev sarà (nel mio caso): /dev/scd0 per il master /dev/scd1 per lo slave se, quindi, nella nostra /dev ci sono di link di nome cdrom, cdrom1 che puntano rispettivamente a /dev/hdc (secondary master), /dev/hdd (secondary slave) questi vanno rimossi e rimpiazzati da link che puntano a queste altre periferiche (aggiustate il tutto alla vostra situazione!), come utente root: # cd /dev # rm cdrom # rm cdrom1 # ln -s scd0 cdrom # ln -s scd1 cdrom1 Se invece la vostra distro non usa questi links ricordati di cambiare il vostro /etc/fstab, altrimenti non riuscirete più a montare i cdrom. _________________________________________________________________________________________________________ 16.3. Procedura di masterizzazione CDR 16.3.1. Creazione dell'immagine iso con mkisofs Il comando generale da usare è: mkisofs [opzioni] -o nome_file_immagine.iso /directory/da/esportare Opzioni possibili: -A "Etichetta cd" -b boot.img --- Per rendere il cd bootabile (El Torito extensions). Il file file boot.img viene creato tramite il comando: dd if=/dev/fd0 of=boot.img bs=18k con un floppy di boot nel device /dev/fd0 (un floppy di boot di qualsiasi OS... perfino winbug!) va aggiunta necessariamente anche l'opzione successiva. -c boot.catalog --- Per questo non c'è problema, il boot.catalog lo crea automaticamente mkisofs -C #inizio ultima sessione,#inizio prossima sessione --- Necessario - insieme all'opzione -M per le sessioni successive alla prima (vedi la sezione "multisessione") -D --- Viola le regole standard dell'ISO9660 permettendo di abbattere il limite degli 8 livelli di subdir massimi. Normalmente il cd lavora ugualmente bene su parecchi sistemi. -l --- Abbatte il limite del formato 8.3 MS-DOS permettendo nomi di files di 30 caratteri. I sistemi DOS potrebbero non leggere più il cd. -J --- Estensioni MS Joliet per rendere il cd compatibile col set di caratteri dei vari Winbug. -L --- Copia nel file iso anche i files che iniziano con "." -M path oppure -M device --- Specifica il percorso alla immagine ISO9660 precedente esistente che deve essere "fusa" (va bene anche indicare il nome della periferica). Necessario insieme all'opzione -C per le sessioni successive alla prima (vedi sotto). -P "Editore" e -p "Preparatore" --- Sono stringhe: se proprio volete metterle scriveteci quello che più vi aggrada -o /percorso/nomefile.iso --- Indica dove piazzare il file iso da creare e come chiamarlo -R --- Attiva le esensioni RockRidge (proprietà e permessi) -r --- Come il precedente ma proprietà e permessi vengono settati con i valori usabili da tutti (555). -T --- Genera un file TRANS.TBL per i sistemi che non supportano le estensioni RockRidge. -v --- Aumenta la prolissità del comando. -V "Id del volume" --- Come per -P e -p -x path --- Esclude ciò che viene indicato nel path (anche più di uno, ognuno anticipato da un "-x"). Ad esempio: mkisofs -v -l -T -r -D -J -o /ISO-IMG/image_1.iso /dir/da/esportare È utile testare l'immagine iso appena creata montando - tramite il loopback device - come se fosse un vero e proprio cdrom, col comando seguente: mount -t iso9660 -o ro,loop=/dev/loop0 /ISO-IMG/file_immagine.iso /mnt/cdrom Ricordati poi di smontarla con: umount /mnt/cdrom _________________________________________________________________________________________________________ 16.3.2. Scrivere il cd con cdrecord Sintassi del comando: cdrecord [opzioni generali] dev=device [opzioni traccia] traccia1 traccia2... Opzioni generali possibili: -v --- Aumenta la prolissità del comando. -force --- Forza la continuazione del processo anche se ci sono errori non fatali (utile col blanking su CD-RW "capricciosi") -dummy --- Fa tutto quello che deve fare ma _col laser spento_!!! Chiaramente utile per testare le nostre configurazioni senza destinare un cd all'uso come orologio... ;-) -dao --- Disk at Once mode. Evita scricchiolii e schifezze varie dopo le tracce audio (se il vostro masterizzatore lo supporta). -multi --- Per la scrittura multi sessione. Va messo per la prima sessione, per le successive e _NON_ per l'ultima (vedi più in basso). -msinfo --- Importante anch'esso per la multisessione (vedi sempre dopo). -fix --- Il disco viene solamente fissato. -nofix --- Il disco non viene fissato. -eject --- Espelle il disco dopo la sessione (alcuni tipi di periferiche ne hanno bisogno). blank=type --- Per i CD-RW (vedi dopo). Opzioni traccia possibili: -audio /path/nome_traccia.wav/au --- Specifica la natura audio della traccia (va messo per ogni traccia audio che si vuole incidere). -data /path/file_immagine.iso --- Specifica la natura dati della traccia Comando tipico in dummy mode per tracce dati: cdrecord -v -dummy -eject speed=8 dev=0,0,0 -data /ISO-IMG/file_iso.iso _________________________________________________________________________________________________________ 16.3.3. Scrivere sul cd tracce audio cdrecord -v speed=n dev=0,0,0 -audio /path/traccia_1.wav -audio \ /path/traccia_2.au -audio /path/traccia_3.wav ... _________________________________________________________________________________________________________ 16.3.4. Scrivere sul cd in "mixed mode" (audio e dati) I comuni lettori hi fi sono capaci di leggere solo la prima sessione, e, se c'è una traccia dati cercano spesso di "leggerla" rischiando di spaccare i woofer: la soluzione è quella di scrivere una prima sessione solo audio e la eventuale seconda con dati. cdrecord -v speed=8 dev=0,0,0 -audio /path/traccia_1.wav -data file_iso.iso _________________________________________________________________________________________________________ 16.3.5. Multisessione Bisogna passare a mkisofs le "coordinate" della sessione precedente (se ce n'è una). Queste le può rilevare cdrecord con l'opzione -msinfo cdrecord -msinfo dev=0,0,0 Sono due numeri separati da una virgola (n,N) e vanno passati così come sono a mkisofs tramite l'opzione -C mkisofs -v -l -T -r -D -J -o /ISO-IMG/nome_immagine.iso -C n,N \ -M /dev/scd0 /dir/da/esportare L'opzione -M specifica la periferica da interrogare ed è altrettanto necessaria. Invece che il nome della periferica, -M potrebbe essere anche seguito dal nome dell'immagine precedente. A cdrecord bisogna passare l'opzione -multi a tutte le sessioni tranne che all'ultima. Il comando tipico (in dummy mode) potrebbe essere: cdrecord -v -dummy -multi -eject speed=8 dev=0,0,0 -data /ISO-IMG/file_iso.iso _________________________________________________________________________________________________________ 16.4. Procedura di masterizzazione CDRW Per poter cancellare il contenuto di un disco cdrw su cui sono già state scritte sessioni precedenti possiamo utilizzare l'opzione blank=type di cdrecord: dove type è in genere "all" per cancellare l'intero disco (più lento ma più approfondito) oppure fast con cui si fa una cancellazione minimale ma veloce. Spesso è utile, per alcuni cdrw difettosi usare, insieme all'opzione blank=all anche l'opzione -force per forzare cdrecord a continuare il blanking anche in presenza di errore non fatali. Altri blanking type sono documentati nella pagina man di cdrecord. Ricordo solo blank=track per cancellare una singola traccia. Il tipico comando per il blanking è: cdrecord -v blank=all -force -eject speed=4 dev=0,0,0 Nota: Note sui cd riscrivibili: * Spesso i normali lettori cdrom hanno difficoltà a leggere questo tipo di cd. Ciò è dovuto al diverso coefficiente di riflessione del laser che caratterizza questo tipo di supporti. Lo stesso problema è frequentissimo sui lettori hi-fi o car audio. Per poter ascoltare la vostra musica preferita da un cd audio da voi masterizzato come copia di sicurezza di quello originale (a buon intenditor...), conviene che usiate normali cdr. * Dopo molte cancellazioni/riscritture i vostri cdrw diventeranno inutilizzabili. E' il normale ciclo di vita di questi supporti che non sono eterni. _________________________________________________________________________________________________________ 16.5. Procedura di masterizzazione On The Fly Con una macchina abbastanza potente (almeno un PII 350 o equivalente; ma c'è chi ci riesce anche con processori meno performanti) è possibile saltare la fase di creazione dell'immagine iso, passando l'output di mkisofs direttamente in pasto a cdrecord. IMG_SIZE=`mkisofs -R -q -print-size dir_da_esportare/ \ 2>&1 | sed -e "s/.* = //"` echo $IMG_SIZE [ "0$IMG_SIZE" -ne 0 ] && mkisofs -r dir_da_esportare/ \ | cdrecord speed=4 dev=0,0,0 tsize=${IMG_SIZE}s -data - Il trattino finale non è un errore, indica di prendere i dati dallo standard input. L'impostazione della variabile IMG_SIZE serve per verificare la dimensione dell'immagine che mkisofs andrà a creare. Questo parametro verrà passato a cdrecord con l'opzione "tsize". Perché questo casino? Perché alcuni masterizzatori non ne vogliono sapere di cominciare questa operazione senza prima conoscere la dimensione del file immagine. Se il vostro non è uno di questi potete anche saltare ed usare una banale pipe mkisofs -v -l -T -r -D -J /dir/da/esportare | \ cdrecord -v -eject speed=8 dev=0,0,0 -data - Se volete semplicemente fare una copia di un cd distinguiamo 2 casi: * Avete un lettore cdrom (/dev/scd1) ed un masterizzatore (/dev/scd0): cdrecord -v dev=0,0,0 speed=8 -isosize /dev/scd1 * Non avete anche un lettore, ma solo un masterizzatore, per cui sarete costretti a crearvi un'immagine sull'hard-disk del cd che volete copiare: dd if=/dev/scd1 of=immagine.iso Nota: Al posto di dd potete usare anche dd_rescue, un tool più avanzato, che in caso di errori nel cd originale (reali o da psx ;-) ) continua comunque a generare il file immagine. Ovviamente immagine.iso è il file che passerete come argomento a cdrecord per la successiva masterizzazione: cdrecord -v -eject speed=8 dev=0,0,0 -data immagine.iso _________________________________________________________________________________________________________ Capitolo 17. Servizi In questa sezione vediamo un elenco di buona parte dei possibili demoni di sistema di un sistema Linux. In Linux, e negli Unix in generale, i demoni sono dei processi che vengono avviati di solito durante l'avvio del sistema e continuano a girare in background senza richiedere intervento da parte dell'utente, in attesa che qualche altro programma o processo ne richieda i servizi. L'elenco seguente può esservi utile per vedere quanti di essi vi sono realmente necessari, e se non sia il caso di disabilitare o disinstallare del tutto il pacchetto relativo al servizio. acpid Descrizione: demone per la gestione dell'alimentazione elettrica Stato: opzionale Documentazione: /usr/share/doc/acpid-[versione] anacron Descrizione: una versione particolare del demone cron. cron avvia delle elaborazioni a orari programmati, ma li salta se il sistema non è in funzione all'orario prestabilito. anacron invece controlla in fase di avvio tutte le elaborazioni che sarebbero dovute essere eseguite da cron e le esegue. Può essere utile in caso di macchine che non rimangono accese perennemente. Stato: opzionale Documentazione: man anacron apmd Descrizione: controlla l'Advanced Power Management del BIOS. Utile solo se avete un portatile o un computer che supporti lo standrad ATX di alimentazione elettrica, permettendo di spegnerlo via software. Stato: opzionale Documentazione: man apmd arpwatch Descrizione: tiene traccia delle coppie di indirizzi ethernet/IP. Di solito non è abilitato. Stato: opzionale Documentazione: man arpsnmp atd Descrizione: il demone at, gestisce alcune elaborazioni a orari programmati. Correlato a cron. Stato: essenziale Documentazione: man atd, man at autofs Descrizione: gestisce il demone automount (che non ha niente a che fare con supermount!). Di solito è disabilitato. Utile se si vogliono montare in automatico dei volumi condivisi in rete. Stato: opzionale Documentazione: man autofs, man automount bootparamd Descrizione: serve a fornire le informazioni di boot a client senza disco. Di solito disabilitato. Stato: opzionale Documentazione: man bootparamd crond Descrizione: il demone cron gestisce compiti ripetitivi. Correlato a atd Stato: essenziale Documentazione: man crond, man cron cups Descrizione: è un moderno sistema di stampa, essenziale se lo usate al posto di lpd Stato: essenziale Documentazione: man cups drakfont Descrizione: permette la gestione automatica dei font True-Type da parte del sistema, nei sistemi Linux-Mandrake. Stato: opzionale Documentazione: man drakfont gpm Descrizione: il demone General Purpose Mouse. Necessario solo se volete usare il mouse in console (non negli xterm). Se lavorate quasi sempre in X, è meglio disattivarlo, in quanto sono note incompatibilità con il sistema X-window. Stato: opzionale Documentazione: man gpm harddrake Descrizione: riconosce e configura hardware nuovo/cambiato, nei sistemi Linux-Mandrake. Stato: opzionale Documentazione: /usr/share/doc/harddrake-[versione] httpd Descrizione: questo demone è necessario per il funzionamento del server web Apache. Se non intendete tenere in funzione un server web, disattivatelo: usa infatti una considerevole quantità di risorse di sistema e rende il sistema vulnerabile a possibili attacchi esterni se non configurato adeguatamente. Stato: opzionale Documentazione: man httpd identd Descrizione: fornisce informazioni su utenti/processi (di solito è avviato da inetd - è il processo auth). Stato: opzionale Documentazione: man identd inetd - xinetd Descrizione: gestiscono i servizi dial-in, tipo imap, nntp, finger, ftp, pop3 e telnet (gli ultimi tre di solito sono attivi). inetd è la versione precedente del demone, ultimamente in via di sostituzione con inetd, che gestisce in modo migliore il controllo delle connessioni (anche se ha ancora qualche difficoltà con UDP e RPC), rispetto all'accoppiata inetd+tcpd. Se non dovete offrire questo tipi di servizi, o usate solo collegamenti in dial-out, disattivateli! Con le impostazioni di default, infatti, permettono a chiunque conosca il vostro IP di sferrare attacchi ai vostri danni. Se volete comunque usarli, controllate e impostate i file: /etc/inetd.conf, /etc/hosts.allow, /etc/hosts.deny e installate i tcp-wrappers (tcpd). Stato: opzionale Documentazione: man inetd, man xinetd, man hosts_access and man tcpd ipchains Descrizione: gestisce il firewall-masquerading di sistema. Può essere sostituito con uno script apposito. Stato: opzionale Documentazione: man ipchains keytable Descrizione: carica la mappa di tastiera selezionata, in base all'impostazione del file /etc/sysconfig/keyboard. Di solito è abilitato. Essenziale per tastiere diverse da quelle americane. Stato: essenziale Documentazione: man loadkeys kheader Descrizione: rigenera il file /boot/kernel.h Stato: opzionale Documentazione: /etc/rc.d/init.d/kheader kudzu Descrizione: rileva e configura in fase di avvio l'hardware nuovo o che è cambiato. Conviene disattivarlo per velocizzare il processo d'avvio e nel caso usarlo direttamente da linea di comando. Di solito è abilitato. Stato: opzionale Documentazione: man kudzu ldap Descrizione: usato per accedere a servizi gateway X.500. In genere non è necessario. Stato: opzionale Documentazione: man ldapd linuxconf Descrizione: serve al programma di configurazione LinuxConf. Di solito è abilitato. Utile se non si vogliono modificare a mano i vari file di configurazione di sistema. Stato: opzionale Documentazione: /usr/lib/linuxconf/help lpd Descrizione: il demone Line Printer Spooler. Necessario per la stampa (al suo posto potete usare cups). Di solito è abilitato. Stato: opzionale Documentazione: man lpd mysql Descrizione: sistema di database relazionale avanzato Stato: opzionale Documentazione: man mysql netfs Descrizione: Network Filesystem Mounter. Serve solo se in fase d'avvio si vogliono montare condivisioni di tipo NFS, SMB e NCP. Stato: opzionale Documentazione: man mount network Descrizione: attiva le interfacce di rete durante la fare di avvio, richiamando gli script presenti in /etc/sysconfig/network-scripts. Di solito è abilitato. Stato: essenziale Documentazione: man ifconfig e la documentazione relativa a ciascun tipo di interfaccia usata. nfslock Descrizione: avvia e arresta il servizio di blocco dei file NFS. Se non sapete cosa sia, disabilitatelo. Di solito è abilitato. Stato: opzionale Documentazione: man nfs numlock Descrizione: attiva il tasto NumLock al cambio di runlevel. Di solito è abilitato. Stato: opzionale Documentazione: boh! pcmcia Descrizione: attiva l'interfaccia PCMCIA. Utile solo agli utenti di sistemi portatili. Stato: opzionale Documentazione: lo script stesso portmap Descrizione: necessario per le Remote Procedure Calls. Lasciatelo abilitato se usate GNOME o avete bisogno di RPC per qualche altro motivo. Di solito è abilitato. Stato: opzionale Documentazione: man portmap postfix Descrizione: è un MTA (Mail Transport Agent), simile a sendmail ma molto più sicuro. Se usate Netscape Mail o Kmail o altri programmi che contattano direttamente un SMTP esterno, non ne avete bisogno. Di solito è abilitato. Stato: opzionale Documentazione: man postfix, '/usr/doc/postfix-[version]/html/index.html' random Descrizione: genera numeri casuali, fornendoli a vari programmi. Necessario per la sicurezza. Stato: essenziale Documentazione: man 4 random rawdevices Descrizione: permette accesso diretto ai dischi (usato da oracle) Stato: opzionale Documentazione: /etc/rc.d/init.d/rawdevices routed Descrizione: si occupa degli instradamenti di rete. Non ne avete bisogno se usate connessioni dial-up. Stato: opzionale Documentazione: man routed rstatd Descrizione: genera statistiche sul kernel (utile per gestioni avanzate di rete). Di solito non è abilitato. Stato: opzionale Documentazione: man rpc.rstatd rusersd - rwalld - rwhod Descrizione: fornisce diversi servizi utili quando si gestisce un server. Di solito non è abilitato. Stato: opzionale Documentazione: le loro man-pages smb Descrizione: necessario per far furnzionare SAMBA, il server per il Server Message Block Protocol. Permette di fornire servizi di rete a client Windows e di accedere ad essi da GNU/Linux. Di solito non è abilitato. Stato: opzionale Documentazione: man samba, il libro "Using Samba" della O'Reilly, disponibile in rete sshd Descrizione: è un demone che permette di gestire connessioni protette verso il server, da usare preferibilmente al posto di telnet. Può essere disabilitato se si usano solo connessioni dial-up. Stato: opzionale Documentazione: man sshd syslog Descrizione: si occupa dei log si sistema. Stato: essenziale Documentazione: man sysklogd usb Descrizione: serve per le periferiche su Universal Serial Bus. Se non avete periferiche di questo tipo, potete disabilitarlo. Di solito è abilitato. Stato: opzionale Documentazione: /usr/src/linux/drivers/usb xfs Descrizione: è l'X Font Server. Se non lo caricate, dovrete impostare a mano i percorsi dei font nel file /etc/X11/XF86Config e usare un font server esterno, come xfstt. Di solito è abilitato. Stato: essenziale su usate X Documentazione: man xfs zope Descrizione: un linguaggio di programmazione object oriented per creare siti web dinamici Stato: opzionale Documentazione: /home/httpd/html/zopedocs _________________________________________________________________________________________________________ Capitolo 18. Wheel Mouse A grande richiesta, vediamo come configurare un wheel-mouse in Linux, in modo che funzioni col maggior numero di applicazioni. Un mio consiglio personale è di lasciar perdere Imwheel, un programma che serve proprio a questo, ma che crea a volte incompatibilità con alcuni programmi: io ho configurato tutto senza di esso, e il wheel-mouse mi funziona in X-Window, Kde, Gnome, Wmaker, Emacs, Netscape, Vim, Rxvt e compagnia. A me l'uso contemporaneo di Gpm (per il mouse in console pura) e X-Window creava dei problemi, funzionava "random". Ho risolto facendo leggere in console su /dev/gpmdata, e in X-Window direttamente da /dev/psaux. Queste è la situazione dei device in /dev/: mrshark@pingu:~$ ls -l /dev/mouse /dev/gpmdata /dev/psaux prw-r--r-- 1 root root 0 feb 5 14:16 /dev/gpmdata lrwxrwxrwx 1 root root 5 feb 5 14:26 /dev/mouse -> psaux crw------- 1 root root 10, 1 feb 12 07:48 /dev/psaux Io uso wheel-mouse con porta PS/2, se avete info per altri tipi di mouse, fatemi sapere! I mouse Logitech in versione OEM (bianchi con logo nero), pare non funzionino. Seguono le sezioni relative al mouse delle configurazioni per Xfree86 versioni 3 e 4 rispettivamente: Attenzione Il resto dei file è stato eliminato! C'è molta altra roba all'interno di questi file! Non copiateli semplicemente al posto di quelli che avete, altrimenti X non vi partirà più! Siete avvisati! ;-) ) === file: /etx/X11/XF86Config === Section "Pointer" Protocol "imps/2" # mouse ps/2 # Protocol "intellimouse" # mouse seriale Device "/dev/psaux" buttons 5 ZAxisMapping 4 5 EndSection === file: /etx/X11/XF86Config-4 === # questa e' la sezione originale del mio file, che uso ancora a volte # quando non ho voglia di attaccare il wheel-mouse al portatile Section "InputDevice" Identifier "Mouse1" Driver "mouse" Option "Protocol" "PS/2" Option "Device" "/dev/psaux" Option "Emulate3Buttons" "on" Option "Emulate3Timeout" "50" EndSection # questa invece e' la nuova sezione che ho aggiunto per il wheel-mouse Section "InputDevice" Identifier "Mouse2" Driver "mouse" Option "Protocol" "IMPS/2" # mouse ps/2 # Option "Protocol" "INTELLIMOUSE" # mouse seriale Option "Device" "/dev/psaux" Option "Emulate3Buttons" "off" Option "ZAxisMapping" "4 5" EndSection # in questa sezione dovete specificare quale dei 2 mouse impostati # precedentemente volete usare nelle vostre sessioni X-Window; la # riga che vi interessa e' la InputDevice... Section "ServerLayout" Identifier "layout1" Screen "screen1" # InputDevice "Mouse1" "CorePointer" InputDevice "Mouse2" "CorePointer" InputDevice "Keyboard1" "CoreKeyboard" EndSection Con queste dovreste essere a posto per X-Window, e quindi il mouse dovrebbe già funzionare anche nei vari Window manager (a me già così funziona in tutti i programmi Kde 1 e 2, Gnome e i suoi WM, e con Wmaker). Provate, riavviando X. Ora passiamo a Gpm. Quella che segue è la configurazione di Pingu, la mia Linuxbox Debian, che ha un file apposito per le opzioni di Gpm, quindi se usate altre distribuzioni dovrete inserire nello script che lo avvia le opzioni indicate di seguito ( -m /dev/psaux -t imps2 ): === file: /etc/gpm.conf === device=/dev/psaux responsiveness= repeat_type= type=imps2 append="" # eventualmente mettili sulla riga di comando di gpm se non usi debian # le uniche 2 opzioni che uso sono m e t, come segue da "ps aux | grep gpm": # /usr/sbin/gpm -m /dev/psaux -t imps2 Seguono ora le righe da aggiungere al vostro file ~/.Xdefaults per abilitare lo scroll in Netscape, 5 : Attenzione Il mouse in Netscape funziona solo se avete il NumLock del tastierino numerico disattivato! Ma con questo disattivato, Rxvt fa casini... a voi la palla... === file: ~/.Xdefaults === Netscape*drawingArea.translations: #replace \ : ArmLink() \n\ : ArmLink() \n\ ~Shift: ActivateLink() \n\ ~Shift: ActivateLink(new-window) \ DisarmLink() \n\ Shift: ActivateLink(save-only) \ DisarmLink() \n\ Shift: ActivateLink(save-only) \ DisarmLink() \n\ : DisarmLinkIfMoved() \n\ : DisarmLinkIfMoved() \n\ : DisarmLinkIfMoved() \n\ : DescribeLink() \n\ : xfeDoPopup() \n\ : ActivatePopup() \n\ Ctrl: PageUp()\n\ Ctrl: PageDown()\n\ Shift: LineUp()\n\ Shift: LineDown()\n\ None: LineUp()LineUp()LineUp()LineUp()LineUp()LineUp()\n\ None: LineDown()LineDown()LineDown()LineDown()LineDown()LineDown()\n\ Alt: xfeDoCommand(forward)\n\ Alt: xfeDoCommand(back)\n Netscape*globalNonTextTranslations: #override\n\ Shift: LineUp()\n\ Shift: LineDown()\n\ None:LineUp()LineUp()LineUp()LineUp()LineUp()LineUp()\n\ None:LineDown()LineDown()LineDown()LineDown()LineDown()LineDown()\n\ Alt: xfeDoCommand(forward)\n\ Alt: xfeDoCommand(back)\n Con le righe seguenti, da aggiungere in ~/.emacs, abiliterete la rotella anche per Emacs: === file: ~/.emacs === (defun up-slightly () (interactive) (scroll-up 5)) (defun down-slightly () (interactive) (scroll-down 5)) (global-set-key [mouse-4] 'down-slightly) (global-set-key [mouse-5] 'up-slightly) (defun up-one () (interactive) (scroll-up 1)) (defun down-one () (interactive) (scroll-down 1)) (global-set-key [S-mouse-4] 'down-one) (global-set-key [S-mouse-5] 'up-one) (defun up-a-lot () (interactive) (scroll-up)) (defun down-a-lot () (interactive) (scroll-down)) (global-set-key [C-mouse-4] 'down-a-lot) (global-set-key [C-mouse-5] 'up-a-lot) Con le righe seguenti, sempre da aggiungere in ~/.emacs, abiliterete invece la rotella anche per XEmacs: === file: ~/.emacs === (define-key global-map 'button4 '(lambda (&rest args) (interactive) (let ((curwin (selected-window))) (select-window (car (mouse-pixel-position))) (scroll-down 5) (select-window curwin) ))) (define-key global-map [(shift button4)] '(lambda (&rest args) (interactive) (let ((curwin (selected-window))) (select-window (car (mouse-pixel-position))) (scroll-down 1) (select-window curwin) ))) (define-key global-map [(control button4)] '(lambda (&rest args) (interactive) (let ((curwin (selected-window))) (select-window (car (mouse-pixel-position))) (scroll-down) (select-window curwin) ))) (define-key global-map 'button5 '(lambda (&rest args) (interactive) (let ((curwin (selected-window))) (select-window (car (mouse-pixel-position))) (scroll-up 5) (select-window curwin) ))) (define-key global-map [(shift button5)] '(lambda (&rest args) (interactive) (let ((curwin (selected-window))) (select-window (car (mouse-pixel-position))) (scroll-up 1) (select-window curwin) ))) (define-key global-map [(control button5)] '(lambda (&rest args) (interactive) (let ((curwin (selected-window))) (select-window (car (mouse-pixel-position))) (scroll-up) (select-window curwin) ))) Altre informazioni nel documento indicato nella sezione "Links" _________________________________________________________________________________________________________ Capitolo 19. Varie 19.1. TrueType In questa sezione spiego come impostare X-Window per l'uso dei caratteri True-Type. Non uso né xfstt né xftft, ma solo xfs patchato con l'aggiunta delle librerie freetype (il tutto è di serie dalla Redhat 6.0 in poi e derivate - se xfs della Mandrake 7 vi da problemi, recuperate quello della RedHat 6.1 e sostituitelo). Vi servono anche i file contenuti in ttmkfdir-QUALCOSA.rpm o .tgz o .tar.gz, quindi cercatelo in rete (potrebbe anche chiamasi ttmkdir...). Quindi dopo aver installato quanto appena detto, create una directory /usr/share/fonts/truetype/ e copiateci dentro i file dei font .ttf dalla partizione Windows o da qualche altra parte dove avete font .ttf. Quando copio cose da Win in Linux, solitamente mi ritrovo i file con l'attributo di esecuzione settato, quindi nel caso date: chmod a-x /usr/share/fonts/truetype. Questo dipende da come avete impostato la riga nel vostro file /etc/fstab relativa alla partizione Windows, con exec o noexec. I file in questa dir devono essere TUTTI in minuscolo, quindi rinominate quelli che abbiano lettere in maiuscolo. Se sono pochi potete fare a mano, altrimenti usate questo script (dal Tips-HOWTO - ATTENZIONE: i due caratteri intorno ad ls e il primo e ultimo della riga lc=... sono apici inversi, non apici normali, e si ottengono sulle tastiere italiane con ALT_GR-APICE_NORMALE): #!/bin/sh # lowerit # convert all file names in the current directory to # lower case only operates on plain files - does not # change the name of directories will ask for # verification before overwriting an existing file for x in `ls` do if [ ! -f $x ]; then continue fi lc=`echo $x | tr '[A-Z]' '[a-z]'` if [ $lc != $x ]; then mv -i $x $lc fi done Riguardo X-Window, conviene installare sia i font da 75 dpi che quelli da 100, dovreste averli nella vostra distribuzione (quelli da 75 dpi sono indicati per risoluzioni 640x480 o 800x600, quelli da 100 dpi sono più adatti alle risoluzioni da 1024x768 in su, oppure a quelle più basse se siete parenti di Mr Magoo ;-) ). Entrate nella directory /usr/share/fonts/truetype/ e date il comando: ttmkfdir -o fonts.scale e poi mkfontdir. Avrete così creato i file fonts.scale e fonts.dir, che saranno letti da xfs tramite la direttiva FontPath. Ogni volta che inserirete nuovi font nella directory dovrete rilanciare questi 2 comandi per ricreare l'elenco dei font. Ora modificate il file: /etc/X11/fs/config in modo che carichi e usi prima i font True-Type e poi gli altri (potete anche modificare l'ordine dei 75/100 dpi, mettendo prima quelli che preferite in base alla risoluzione, come spiegato prima): catalogue = /usr/share/fonts/truetype, /usr/X11R6/lib/X11/fonts/misc:unscaled, /usr/X11R6/lib/X11/fonts/100dpi:unscaled, /usr/X11R6/lib/X11/fonts/75dpi:unscaled, /usr/X11R6/lib/X11/fonts/misc, /usr/X11R6/lib/X11/fonts/Type1, /usr/X11R6/lib/X11/fonts/Speedo, /usr/X11R6/lib/X11/fonts/mdk, /usr/share/fonts/default/Type1, /usr/X11R6/lib/X11/fonts/100dpi, /usr/X11R6/lib/X11/fonts/75dpi Infine modificate il file /etc/X11/XF86Config, commentando nella sezione Files tutte le righe di FontPath, ora diventate inutili in quanto richiamate da xfs, lasciando la riga di RgbPath e aggiungendo la riga: FontPath "unix/:7101" La RedHat sembra non avviare bene xfs, quindi assicuratevi che xfs NON parta ogni volta che il sistema si avvia (eliminatelo con ntsysv o con chkconfig --del xfs) e date il comando: /etc/rc.d/init.d/xfs stop per abbatterlo nel caso sia in funzione. Aggiungete la seguante riga al file /etc/rc.d/rc.local : /usr/X11R6/bin/xfs -config /etc/X11/fs/config -port 7101 > /dev/null & uscite da X-Window se siete in gui, riavviate il sistema o reinserite l'ultima riga in console per avviare temporaneamente xfs senza riavviare tutto il sistema, e rilanciate startx per vedere se tutto va bene, provando a dare xfontsel (è contenuto in X11R6-contrib): cliccando su fmly dovreste vedere i vostri font (in KDE potete usare anche kfontmanager)! Per la questione dei 75/100 dpi, se avete messo prima quelli da 100, ricordate anche di cambiare, sempre nel file /etc/X11/fs/config, la riga: default-resolutions = 75,75,100,100 in default-resolutions = 100,100,75,75 e modificate nel file /etc/X11/xdm/Xserver (o comunque cercate il file Xserver) la riga: :0 local /usr/X11R6/bin/X in :0 local /usr/X11R6/bin/X -dpi 100 In una prossima revisione del Quick&Easy Configuration HOWTO sarà aggiunta la configurazione dei font TrueType anche con Xfstt e per l'uso con Staroffice. _________________________________________________________________________________________________________ 19.2. Bash Alcuni file che possono tornare utili per configurare bash (altri più dettagliati sono presenti nel Config-HOWTO) === file: .bash_profile === # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # varie export BASH_ENV="$HOME/.bashrc" export MAIL="$HOME/Mail/$USER" export USER=`whoami` #oppure export USER=`id -un export TMPDIR="$HOME/.tmp" export BROWSER="netscape -raise -remote \"openURL(%s,new-window)\":lynx" export DATE=`date +%B-%Y` export HISTSIZE=1000 export HISTFILESIZE=1000 export HISTIGNORE="[ ]*:&:bg:fg" export PAGER=less export LESS="-M -Q" export LESSEDIT="%E ?lt+%lt. %f" #export LESSOPEN="| lesspipe.sh %s" export LESSOPEN="| lesspipe %s" export LESSCHARSET=latin1 # editor export VISUAL="gvim" export EDITOR="vim" export SLANG_EDITOR="vim %s" # rete export NNTPSERVER="127.0.0.1" export http_proxy="http://localhost:5865" export HOSTNAME=`hostname` # lingua LINGUA="it_IT.ISO-8859-1" export LANG=$LINGUA export LC_COLLATE=$LINGUA export LC_CTYPE=$LINGUA export LC_NUMERIC=$LINGUA export LC_MONETARY=$LINGUA export LC_MESSAGES=$LINGUA export LC_TIME=$LINGUA export LC_ALL= # path export PATH=$PATH:$HOME/.bin:/usr/local/j2sdk1.3.0/bin export JAVA_HOME=/usr/local/j2sdk1.3.0 export JAVA_PATH=/usr/local/j2sdk1.3.0 export SGML_CATALOG_FILES=/etc/sgml/catalog echo fortune === file: .bashrc === # .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions alias rm='rm -i' alias mv='mv -i' alias cp='cp -i' alias s='cd ..' alias d='ls' alias p='cd -' #alias ls='ls -sh1C --color=tty' alias ls="ls -s -F -T 0 -b -H -1 -C --color=auto" alias df="df -Th" alias cdin='mount /mnt/cdrom ; cd /mnt/cdrom ; ls' alias cdout='cd ; umount /mnt/cdrom ; eject' alias du='du -h --max-depth=1' alias startx='startx -- -nolisten tcp' alias netstat='netstat -nap --inet' alias ps='ps auxfwww' eval `dircolors ~/.dircolors` # prompt if [ $USER = 'root' ] ; then COLOUR=41 # red else COLOUR=44 # blue fi ESC="\033" PROMPT="\u@\h" # username@hostname #STYLE=";1m" # bold STYLE="m" # plain PS1="\[$ESC[$COLOUR;37$STYLE\]$PROMPT:\[$ESC[37;40$STYLE\]\w\\$ " PS2="> " # Need for a xterm & co if we don't make a -ls [ -n $DISPLAY ] && { [ -f /etc/profile.d/color_ls.sh ] && source /etc/profile.d/color_ls.sh export XAUTHORITY=$HOME/.Xauthority } # Read first /etc/inputrc if the variable is not defined, and after the /etc/inputrc # include the ~/.inputrc [ -z $INPUTRC ] && export INPUTRC=/etc/inputrc umask=022 ulimit -c 0 === file: .dircolors === # EvilGNU's ~/.dircolors for GNU ls. Colours based off of screen shots by # The Rasterman. # in your .bashrc put the lines: # eval `dircolors ~/.dircolors` and # alias ls='ls --color=auto' # you may also want options like -F or somthing. # # EvilGNU # dfree@inna.net COLOR tty # Extra command line options for ls go here. # Basically these ones are: # -F = show '/' for dirs, '*' for executables, etc. # -T 0 = don't trust tab spacing when formatting ls output. # -b = better support for special characters OPTIONS -F -b -T 0 -s -H -1 -C # Below, there should be one TERM entry for each termtype that is colorizable TERM linux TERM console TERM con132x25 TERM con132x30 TERM con132x43 TERM con132x60 TERM con80x25 TERM con80x28 TERM con80x30 TERM con80x43 TERM con80x50 TERM con80x60 TERM xterm TERM vt100 TERM vt220 TERM ansi TERM rxvt # EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output) EIGHTBIT 1 # Below are the color init strings for the basic file types. A color init # string consists of one or more of the following numeric codes: # Attribute codes: # 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed # Text color codes: # 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white # Background color codes: # 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white NORMAL 00 # global default, although everything should be something. FILE 00 # normal file DIR 00;32 # directory LINK 01;36 # symbolic link FIFO 40;33 # pipe SOCK 01;35 # socket BLK 40;33;01 # block device driver CHR 40;33;01 # character device driver # This is for files with execute permission: EXEC 01;33 # List any file extensions like '.gz' or '.tar' that you would like ls # to colorize below. Put the extension, a space, and the color init string. # (and any comments you want to add after a '#') *~ 05;31 # stuff we hate to find laying around (flashing red) .mtxt 05;31 # crap .ndx 05;31 .cmd 00;33 # executables .exe 00;33 .com 00;33 .btm 00;33 .bat 00;33 .c 00;35 # source code .h 00;36 .pl 00;35 .pm 00;35 .cgi 00;35 .java 00;35 .html 00;35 .tar 00;31 # archives or compressed (bright red) .tgz 00;31 .arj 00;31 .taz 00;31 .lzh 00;31 .zip 00;31 .z 00;31 .Z 00;31 .gz 00;31 .jpg 00;34 # image formats .jpeg 00;34 .JPG 00;34 .gif 00;34 .GIF 00;34 .bmp 00;34 .BMP 00;34 .xbm 00;34 .ppm 00;34 .xpm 00;34 .tif 00;34 .png 00;34 _________________________________________________________________________________________________________ Capitolo 20. Links 20.1. Documenti vari * ethernet howto: http://www.pluto.linux.it/ildp/HOWTO/Ethernet-HOWTO.html * net howto: http://www.linuxdoc.org/HOWTO/Net-HOWTO.html * net 3-4 howto: http://www.linuxdoc.org/HOWTO/NET3-4-HOWTO.html * networking overview howto: http://www.pluto.linux.it/ildp/HOWTO/Networking-Overview-HOWTO.html * cd writing howto: http://www.pluto.linux.it/ildp/HOWTO/CD-Writing-HOWTO.html * mp3 howto: http://www.pluto.linux.it/ildp/HOWTO/MP3-HOWTO.html * security howto: http://www.linuxdoc.org/HOWTO/Security-HOWTO.html * linux administrator security guide: http://www.securityportal.com/lasg/ * ildp: http://www.pluto.linux.it/ildp/ * appunti di informatica libera: http://www.pluto.linux.it/ildp/AppuntiLinux/index.html _________________________________________________________________________________________________________ 20.2. Partizioni * parted: http://www.gnu.org/software/parted/ * partition resizer: http://members.xoom.com/zeleps * partition manager: http://members.xoom.com/ranish/part/ * fips: ftp://ftp.debian.org/pub/debian/tools/fips20.zip * fsresize: http://www.alphalink.com.au/~clausen/fsresize/ * ext2resize: http://ext2resize.sourceforge.net/ * filesystem howto: http://www.linuxdoc.org/HOWTO/Filesystems-HOWTO.html * partitioning primer: http://members.xoom.com/ranish/part/primer.htm * large disk howto: http://www.pluto.linux.it/ildp/HOWTO/Large-Disk-HOWTO.html * partition rescue howto: http://www.linuxdoc.org/HOWTO/mini/Partition-Rescue-mini-HOWTO.html * partition howto: http://www.pluto.linux.it/ildp/HOWTO/mini/Partition.html * FSSTND: http://www.pathname.com/fhs _________________________________________________________________________________________________________ 20.3. Loadlin * loadlin: http://elserv.ffm.fgan.de/~lermen/HOME.html * loadlin+win95 howto: http://www.pluto.linux.it/ildp/HOWTO/mini/Loadlin+Win95.html _________________________________________________________________________________________________________ 20.4. Kernel * kernel: http://www.it.kernel.org/ * kernel howto: http://www.pluto.linux.it/ildp/HOWTO/Kernel-HOWTO.html * lilo howto: http://www.pluto.linux.it/ildp/HOWTO/mini/LILO.html _________________________________________________________________________________________________________ 20.5. Internet * ppp howto: http://www.pluto.linux.it/ildp/HOWTO/PPP-HOWTO.html * serial howto: http://www.pluto.linux.it/ildp/HOWTO/Serial-HOWTO.html * winmodem howto: http://www.linuxdoc.org/HOWTO/Winmodems-and-Linux-HOWTO.html * modem howto: http://www.pluto.linux.it/ildp/HOWTO/Modem-HOWTO.html _________________________________________________________________________________________________________ 20.6. Postfix * postfix: http://postfix.linux.it/start.html * postfix faq: http://postfix.linux.it/faq.html * postfix configurazion: http://postfix.linux.it/basic.html * AGX tutorial: http://www.linux.it/~agx/info/mini-postfix-howto.txt _________________________________________________________________________________________________________ 20.7. Fetchmail * fetchmail: http://www.tuxedo.org/~esr/fetchmail/ * mail administrator howto: http://www.linuxdoc.org/HOWTO/Mail-Administrator-HOWTO.html * mail user howto: http://www.pluto.linux.it/ildp/HOWTO/Mail-User-HOWTO.html _________________________________________________________________________________________________________ 20.8. Procmail * procmail: http://www.procmail.org/ * mini faq: http://www.iki.fi/era/procmail/mini-faq.html * pm-tips: http://www.procmail.org/jari/pm-tips.html * quick start: http://www.ii.com/internet/robots/procmail/qs/ * proctips: http://www.uwasa.fi/~ts/info/proctips.html _________________________________________________________________________________________________________ 20.9. Leafnode * leafnode: http://www.leafnode.org * news leafsite howto: http://www.linuxdoc.org/HOWTO/mini/News-Leafsite.html _________________________________________________________________________________________________________ 20.10. Firewall * firewall howto: http://www.pluto.linux.it/ildp/HOWTO/Firewall-HOWTO.html * ip masquerade howto: http://www.linuxdoc.org/HOWTO/IP-Masquerade-HOWTO.html * ipchains howto: http://www.pluto.linux.it/ildp/HOWTO/IPCHAINS-HOWTO.html * ip masquerade+ napster: http://www.linuxdoc.org/HOWTO/mini/IPMasquerading+Napster.html * generazione firewall online: http://www.linux-firewall-tools.com/linux/firewall/index.html _________________________________________________________________________________________________________ 20.11. DNS * bind: http://www.isc.org/products/BIND/ * dns howto: http://www.pluto.linux.it/ildp/HOWTO/DNS-HOWTO.html * dns resource directory: http://www.dns.net/dnsrd/ * bind operation guide: (tra i documenti di bind, in /usr/doc/bind...) * bind faq: http://www.nominum.com/resources/bind-faq.html * Chroot-BIND8 HOWTO: http://www.losurs.org/docs/howto/Chroot-BIND8.html _________________________________________________________________________________________________________ 20.12. Wwwoffle * wwwoffle: http://www.gedanken.demon.co.uk/wwwoffle/ _________________________________________________________________________________________________________ 20.13. Junkbuster * junkbuster: http://www.junkbuster.com/ * aggiornamenti file: http://www.waldherr.org/junkbuster/update.shtml _________________________________________________________________________________________________________ 20.14. Mutt * mutt: http://www.mutt.org * muttrc builder: http://mutt.netliberte.org/ * mutt gpg pgp howto: http://www.linuxdoc.org/HOWTO/Mutt-GnuPG-PGP-HOWTO.html _________________________________________________________________________________________________________ 20.15. Slrn * slrn: http://space.mit.edu/~davis/slrn.html * slrn+slrnpull howto: http://www.pluto.linux.it/ildp/altri/SLRN+SLRNPULL-HOWTO.html * altra pagina di slrn: http://www.slrn.org * ancora slrn: http://slrn.sourceforge.net * introduzione a slrn: http://alcor.concordia.ca/topics/netnews/slrn/intro/ * Manuale UFFICIALE in Italiano di SLRN: http://www.mrshark.it/downloads.html _________________________________________________________________________________________________________ 20.16. Wheel Mouse * mouse-wheel-scroll: http://www-sop.inria.fr/koala/colas/mouse-wheel-scroll _________________________________________________________________________________________________________ 20.17. Varie 20.17.1. True Type * font howto: http://www.linuxdoc.org/HOWTO/Font-HOWTO.html * font deuglification howto: http://www.pluto.linux.it/ildp/HOWTO/mini/FDU.html * tt debian howto: http://www.pluto.linux.it/ildp/HOWTO/mini/TT-Debian.html * staroffice fonts: http://www.mindspring.com/~john_mcl/adding_fonts.html * staroffice fonts 2: http://private.addcom.de/alien8/Fonts.html * staroffice faq: http://www.wernerroth.de/en/staroffice/faq/faq.html * redhat ttf: http://www.kegel.com/linux/tt.html _________________________________________________________________________________________________________ 20.17.2. Bash * bash prompt howto: http://www.linuxdoc.org/HOWTO/Bash-Prompt-HOWTO.html * config howto: http://www.pluto.linux.it/ildp/HOWTO/Config-HOWTO.html _________________________________________________________________________________________________________ Appendice A. GNU Free Documentation License A.1. Versione originale in Inglese A.1.1. GNU Free Documentation License Version 1.1, March 2000 Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. _________________________________________________________________________________________________________ A.1.2. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other written document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. _________________________________________________________________________________________________________ A.1.3. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (For example, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, whose contents can be viewed and edited directly and straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent modification by readers is not Transparent. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. _________________________________________________________________________________________________________ A.1.4. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. _________________________________________________________________________________________________________ A.1.5. 3. COPYING IN QUANTITY If you publish printed copies of the Document numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a publicly-accessible computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. _________________________________________________________________________________________________________ A.1.6. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has less than five). C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section entitled "History", and its title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. In any section entitled "Acknowledgements" or "Dedications", preserve the section's title, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section as "Endorsements" or to conflict in title with any Invariant Section. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. _________________________________________________________________________________________________________ A.1.7. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections entitled "History" in the various original documents, forming one section entitled "History"; likewise combine any sections entitled "Acknowledgements", and any sections entitled "Dedications". You must delete all sections entitled "Endorsements." _________________________________________________________________________________________________________ A.1.8. 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. _________________________________________________________________________________________________________ A.1.9. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modified Version of the Document, provided no compilation copyright is claimed for the compilation. Such a compilation is called an "aggregate", and this this License does not apply to the other self-contained works thus compiled with the Document, on account of their being thus compiled, if they are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate. _________________________________________________________________________________________________________ A.1.10. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail. _________________________________________________________________________________________________________ A.1.11. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. _________________________________________________________________________________________________________ A.1.12. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. _________________________________________________________________________________________________________ A.2. Versione tradotta in Italiano A.2.1. GNU Free Documentation License Versione 1.1, Marzo 2000 Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Chiunque può copiare e distribuire copie letterali di questo documento di licenza, ma non ne è permessa la modifica. _________________________________________________________________________________________________________ A.2.2. 0. PREAMBOLO Lo scopo di questa licenza è di rendere un manuale, un testo o altri documenti scritti "liberi" nel senso di assicurare a tutti la libertà effettiva di copiarli e redistribuirli, con o senza modifiche, a fini di lucro o no. In secondo luogo questa licenza prevede per autori ed editori il modo per ottenere il giusto riconoscimento del proprio lavoro, preservandoli dall'essere considerati responsabili per modifiche apportate da altri. Questa licenza è un "copyleft": ciò vuol dire che i lavori che derivano dal documento originale devono essere ugualmente liberi. È il complemento alla GNU General Public License, che è una licenza di tipo "copyleft" pensata per il software libero. Abbiamo progettato questa licenza al fine di applicarla alla documentazione del software libero, perché il software libero ha bisogno di documentazione libera: un programma libero dovrebbe accompagnarsi a manuali che forniscano la stessa libertà del software. Ma questa licenza non è limitata alla documentazione del software; può essere utilizzata per ogni testo che tratti un qualsiasi argomento e al di là dell'avvenuta pubblicazione cartacea. Raccomandiamo principalmente questa licenza per opere che abbiano fini didattici o per manuali di consultazione. _________________________________________________________________________________________________________ A.2.3. 1. APPLICABILITÀ E DEFINIZIONI Questa licenza si applica a qualsiasi manuale o altra opera che contenga una nota messa dal detentore del copyright che dica che si può distribuire nei termini di questa licenza. Con "Documento", in seguito ci si riferisce a qualsiasi manuale o opera. Ogni fruitore è un destinatario della licenza e viene indicato con "voi". Una "versione modificata" di un documento è ogni opera contenente il documento stesso o parte di esso, sia riprodotto alla lettera che con modifiche, oppure traduzioni in un'altra lingua. Una "sezione secondaria" è un'appendice cui si fa riferimento o una premessa del documento e riguarda esclusivamente il rapporto dell'editore o dell'autore del documento con l'argomento generale del documento stesso (o argomenti affini) e non contiene nulla che possa essere compreso nell'argomento principale. (Per esempio, se il documento è in parte un manuale di matematica, una sezione secondaria non può contenere spiegazioni di matematica). Il rapporto con l'argomento può essere un tema collegato storicamente con il soggetto principale o con soggetti affini, o essere costituito da argomentazioni legali, commerciali, filosofiche, etiche o politiche pertinenti. Le "sezioni non modificabili" sono alcune sezioni secondarie i cui titoli sono esplicitamente dichiarati essere sezioni non modificabili, nella nota che indica che il documento è realizzato sotto questa licenza. I "testi copertina" sono dei brevi brani di testo che sono elencati nella nota che indica che il documento è realizzato sotto questa licenza. Una copia "trasparente" del documento indica una copia leggibile da un calcolatore, codificata in un formato le cui specifiche sono disponibili pubblicamente, i cui contenuti possono essere visti e modificati direttamente, ora e in futuro, con generici editor di testi o (per immagini composte da pixel) con generici editor di immagini o (per i disegni) con qualche editor di disegni ampiamente diffuso, e la copia deve essere adatta al trattamento per la formattazione o per la conversione in una varietà di formati atti alla successiva formattazione. Una copia fatta in un altro formato di file trasparente il cui markup è stato progettato per intralciare o scoraggiare modifiche future da parte dei lettori non è trasparente. Una copia che non è trasparente è "opaca". Esempi di formati adatti per copie trasparenti sono l'ASCII puro senza markup, il formato di input per Texinfo, il formato di input per LaTex, SGML o XML accoppiati ad una DTD pubblica e disponibile, e semplice HTML conforme agli standard e progettato per essere modificato manualmente. Formati opachi sono PostScript, PDF, formati proprietari che possono essere letti e modificati solo con word processor proprietari, SGML o XML per cui non è in genere disponibile la DTD o gli strumenti per il trattamento, e HTML generato automaticamente da qualche word processor per il solo output. La "pagina del titolo" di un libro stampato indica la pagina del titolo stessa, più qualche pagina seguente per quanto necessario a contenere in modo leggibile, il materiale che la licenza prevede che compaia nella pagina del titolo. Per opere in formati in cui non sia contemplata esplicitamente la pagina del titolo, con "pagina del titolo" si intende il testo prossimo al titolo dell'opera, precedente l'inizio del corpo del testo. _________________________________________________________________________________________________________ A.2.4. 2. COPIE ALLA LETTERA Si può copiare e distribuire il documento con l'ausilio di qualsiasi mezzo, per fini di lucro e non, fornendo per tutte le copie questa licenza, le note sul copyright e l'avviso che questa licenza si applica al documento, e che non si aggiungono altre condizioni al di fuori di quelle della licenza stessa. Non si possono usare misure tecniche per impedire o controllare la lettura o la produzione di copie successive alle copie che si producono o distribuiscono. Però si possono ricavare compensi per le copie fornite. Se si distribuiscono un numero sufficiente di copie si devono seguire anche le condizioni della sezione 3. Si possono anche prestare copie e con le stesse condizioni sopra menzionate possono essere utilizzate in pubblico. _________________________________________________________________________________________________________ A.2.5. 3. COPIARE IN NOTEVOLI QUANTITÀ Se si pubblicano a mezzo stampa più di 100 copie del documento, e la nota della licenza indica che esistono uno o più testi copertina, si devono includere nelle copie, in modo chiaro e leggibile, tutti i testi copertina indicati: il testo della prima di copertina in prima di copertina e il testo di quarta di copertina in quarta di copertina. Ambedue devono identificare l'editore che pubblica il documento. La prima di copertina deve presentare il titolo completo con tutte le parole che lo compongono egualmente visibili ed evidenti. Si può aggiungere altro materiale alle copertine. Il copiare con modifiche limitate alle sole copertine, purché si preservino il titolo e le altre condizioni viste in precedenza, è considerato alla stregua di copiare alla lettera. Se il testo richiesto per le copertine è troppo voluminoso per essere riprodotto in modo leggibile, se ne può mettere una prima parte per quanto ragionevolmente può stare in copertina, e continuare nelle pagine immediatamente seguenti. Se si pubblicano o distribuiscono copie opache del documento in numero superiore a 100, si deve anche includere una copia trasparente leggibile da un calcolatore per ogni copia o menzionare per ogni copia opaca un indirizzo di una rete di calcolatori pubblicamente accessibile in cui vi sia una copia trasparente completa del documento, spogliato di materiale aggiuntivo, e a cui si possa accedere anonimamente e gratuitamente per scaricare il documento usando i protocolli standard e pubblici generalmente usati. Se si adotta l'ultima opzione, si deve prestare la giusta attenzione, nel momento in cui si inizia la distribuzione in quantità elevata di copie opache, ad assicurarsi che la copia trasparente rimanga accessibile all'indirizzo stabilito fino ad almeno un anno di distanza dall'ultima distribuzione (direttamente o attraverso rivenditori) di quell'edizione al pubblico. È caldamente consigliato, benché non obbligatorio, contattare l'autore del documento prima di distribuirne un numero considerevole di copie, per metterlo in grado di fornire una versione aggiornata del documento. _________________________________________________________________________________________________________ A.2.6. 4. MODIFICHE Si possono copiare e distribuire versioni modificate del documento rispettando le condizioni delle precedenti sezioni 2 e 3, purché la versione modificata sia realizzata seguendo scrupolosamente questa stessa licenza, con la versione modificata che svolga il ruolo del "documento", così da estendere la licenza sulla distribuzione e la modifica a chiunque ne possieda una copia. Inoltre nelle versioni modificate si deve: A. Usare nella pagina del titolo (e nelle copertine se ce ne sono) un titolo diverso da quello del documento, e da quelli di versioni precedenti (che devono essere elencati nella sezione storia del documento ove presenti). Si può usare lo stesso titolo di una versione precedente se l'editore di quella versione originale ne ha dato il permesso. B. Elencare nella pagina del titolo, come autori, una o più persone o gruppi responsabili in qualità di autori delle modifiche nella versione modificata, insieme ad almeno cinque fra i principali autori del documento (tutti gli autori principali se sono meno di cinque). C. Dichiarare nella pagina del titolo il nome dell'editore della versione modificata in qualità di editore. D. Conservare tutte le note sul copyright del documento originale. E. Aggiungere un'appropriata licenza per le modifiche di seguito alle altre licenze sui copyright. F. Includere immediatamente dopo la nota di copyright, un avviso di licenza che dia pubblicamente il permesso di usare la versione modificata nei termini di questa licenza, nella forma mostrata nell'addendum alla fine di questo testo. G. Preservare in questo avviso di licenza l'intera lista di sezioni non modificabili e testi copertina richieste come previsto dalla licenza del documento. H. Includere una copia non modificata di questa licenza. I. Conservare la sezione intitolata "Storia", e il suo titolo, e aggiungere a questa un elemento che riporti al minimo il titolo, l'anno, i nuovi autori, e gli editori della versione modificata come figurano nella pagina del titolo. Se non ci sono sezioni intitolate "Storia" nel documento, createne una che riporti il titolo, gli autori, gli editori del documento come figurano nella pagina del titolo, quindi aggiungete un elemento che descriva la versione modificata come detto in precedenza. J. Conservare l'indirizzo in rete riportato nel documento, se c'è, al fine del pubblico accesso ad una copia trasparente, e possibilmente l'indirizzo in rete per le precedenti versioni su cui ci si è basati. Questi possono essere collocati nella sezione "Storia". Si può omettere un indirizzo di rete per un'opera pubblicata almeno quattro anni prima del documento stesso, o se l'originario editore della versione cui ci si riferisce ne dà il permesso. K. In ogni sezione di "Ringraziamenti" o "Dediche", si conservino il titolo, il senso, il tono della sezione stessa. L. Si conservino inalterate le sezioni non modificabili del documento, nei propri testi e nei propri titoli. I numeri della sezione o equivalenti non sono considerati parte del titolo della sezione. M. Si cancelli ogni sezione intitolata "Riconoscimenti". Solo questa sezione può non essere inclusa nella versione modificata. N. Non si modifichi il titolo di sezioni esistenti come "miglioria" o per creare confusione con i titoli di sezioni non modificabili. Se la versione modificata comprende nuove sezioni di primaria importanza o appendici che ricadono in "sezioni secondarie", e non contengono materiale copiato dal documento, si ha facoltà di rendere non modificabili quante sezioni si voglia. Per fare ciò si aggiunga il loro titolo alla lista delle sezioni immutabili nella nota di copyright della versione modificata. Questi titoli devono essere diversi dai titoli di ogni altra sezione. Si può aggiungere una sezione intitolata "Riconoscimenti", a patto che non contenga altro che le approvazioni alla versione modificata prodotte da vari soggetti--per esempio, affermazioni di revisione o che il testo è stato approvato da una organizzazione come la definizione normativa di uno standard. Si può aggiungere un brano fino a cinque parole come Testo Copertina, e un brano fino a 25 parole come Testo di Retro Copertina, alla fine dell'elenco dei Testi Copertina nella versione modificata. Solamente un brano del Testo Copertina e uno del Testo di Retro Copertina possono essere aggiunti (anche con adattamenti) da ciascuna persona o organizzazione. Se il documento include già un testo copertina per la stessa copertina, precedentemente aggiunto o adattato da voi o dalla stessa organizzazione nel nome della quale si agisce, non se ne può aggiungere un altro, ma si può rimpiazzare il vecchio ottenendo l'esplicita autorizzazione dall'editore precedente che aveva aggiunto il testo copertina. L'autore/i e l'editore/i del "documento" non ottengono da questa licenza il permesso di usare i propri nomi per pubblicizzare la versione modificata o rivendicare l'approvazione di ogni versione modificata. _________________________________________________________________________________________________________ A.2.7. 5. UNIONE DI DOCUMENTI Si può unire il documento con altri realizzati sotto questa licenza, seguendo i termini definiti nella precedente sezione 4 per le versioni modificate, a patto che si includa l'insieme di tutte le Sezioni Invarianti di tutti i documenti originali, senza modifiche, e si elenchino tutte come Sezioni Invarianti della sintesi di documenti nella licenza della stessa. Nella sintesi è necessaria una sola copia di questa licenza, e multiple sezioni invarianti possono essere rimpiazzate da una singola copia se identiche. Se ci sono multiple Sezioni Invarianti con lo stesso nome ma contenuti differenti, si renda unico il titolo di ciascuna sezione aggiungendovi alla fine e fra parentesi, il nome dell'autore o editore della sezione, se noti, o altrimenti un numero distintivo. Si facciano gli stessi aggiustamenti ai titoli delle sezioni nell'elenco delle Sezioni Invarianti nella nota di copiright della sintesi. Nella sintesi si devono unire le varie sezioni intitolate "storia" nei vari documenti originali di partenza per formare una unica sezione intitolata "storia"; allo stesso modo si unisca ogni sezione intitolata "Ringraziamenti", e ogni sezione intitolata "Dediche". Si devono eliminare tutte le sezioni intitolate "Riconoscimenti". _________________________________________________________________________________________________________ A.2.8. 6. RACCOLTE DI DOCUMENTI Si può produrre una raccolta che consista del documento e di altri realizzati sotto questa licenza; e rimpiazzare le singole copie di questa licenza nei vari documenti con una sola inclusa nella raccolta, solamente se si seguono le regole fissate da questa licenza per le copie alla lettera come se si applicassero a ciascun documento. Si può estrarre un singolo documento da una raccolta e distribuirlo individualmente sotto questa licenza, solo se si inserisce una copia di questa licenza nel documento estratto e se si seguono tutte le altre regole fissate da questa licenza per le copie alla lettera del documento. _________________________________________________________________________________________________________ A.2.9. 7. RACCOGLIERE INSIEME A LAVORI INDIPENDENTI Una raccolta del documento o sue derivazioni con altri documenti o lavori separati o indipendenti, all'interno di o a formare un archivio o un supporto per la distribuzione, non è una "versione modificata" del documento nella sua interezza, se non ci sono copiright per l'intera raccolta. Ciascuna raccolta si chiama allora "aggregato" e questa licenza non si applica agli altri lavori contenuti in essa che ne sono parte, per il solo fatto di essere raccolti insieme, qualora non siano però loro stessi lavori derivati dal documento. Se le esigenze del Testo Copertina della sezione 3 sono applicabili a queste copie del documento allora, se il documento è inferiore ad un quarto dell'intero aggregato i Testi Copertina del documento possono essere piazzati in copertine che delimitano solo il documento all'interno dell'aggregato. Altrimenti devono apparire nella copertina dell'intero aggregato. _________________________________________________________________________________________________________ A.2.10. 8. TRADUZIONI La traduzione è considerata un tipo di modifica, e di conseguenza si possono distribuire traduzioni del documento seguendo i termini della sezione 4. Rimpiazzare sezioni non modificabili con traduzioni richiede un particolare permesso da parte dei detentori del diritto d'autore, ma si possono includere traduzioni di una o più sezioni non modificabili in aggiunta alle versioni originali di queste sezioni immutabili. Si può fornire una traduzione della presente licenza a patto che si includa anche l'originale versione inglese di questa licenza. In caso di discordanza fra la traduzione e l'originale inglese di questa licenza la versione originale inglese prevale sempre. _________________________________________________________________________________________________________ A.2.11. 9. TERMINI Non si può applicare un'altra licenza al documento, copiarlo, modificarlo, o distribuirlo al di fuori dei termini espressamente previsti da questa licenza. Ogni altro tentativo di applicare un'altra licenza al documento, copiarlo, modificarlo, o distribuirlo è deprecato e pone fine automaticamente ai diritti previsti da questa licenza. Comunque, per quanti abbiano ricevuto copie o abbiano diritti coperti da questa licenza, essi non ne cessano se si rimane perfettamente coerenti con quanto previsto dalla stessa. _________________________________________________________________________________________________________ A.2.12. 10. REVISIONI FUTURE DI QUESTA LICENZA La Free Software Foundation può pubblicare nuove, rivedute versioni della Gnu Free Documentation License volta per volta. Qualche nuova versione potrebbe essere simile nello spirito alla versione attuale ma differire in dettagli per affrontare nuovi problemi e concetti. Si veda http://www.gnu.org/copyleft. Ad ogni versione della licenza viene dato un numero che distingue la versione stessa. Se il documento specifica che si riferisce ad una versione particolare della licenza contraddistinta dal numero o "ogni versione successiva", si ha la possibilità di seguire termini e condizioni sia della versione specificata che di ogni versione successiva pubblicata (non come bozza) dalla Free Software Foundation. Se il documento non specifica un numero di versione particolare di questa licenza, si può scegliere ogni versione pubblicata (non come bozza) dalla Free Software Foundation. Nota: Traduzione in italiano a cura di Andrea Ferro, Leandro Noferini e Franco Vite.