Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Piccola guida
Versione 4.5
27 giugno 2007
1
L’autore non si assumerà in alcun caso la responsabilità per eventuali danni diretti o indi-
retti riguardanti l’uso proprio o improprio del presente, o qualora il suo uso violi gli accordi
sottoscritti con Apple. Scritto a soli fini informativi. “Little X Manual” è
,c tutti i diritti
riservati. Il logo “Dog using an iMac”
c è stato disegnato da Nina Mariano.
Documento generato con L TEXA
www.oliviomariano.net
e non è abilitata alla stampa. Se desiderate riceverne una versione stampabile sarà necessario
richiederla all’indirizzo olivio.mariano@gmail.com.
2
Introduzione
Il Little X Manual giunge finalmente alla versione 4 approfondendo ed espletando i vari temi
abbordati dalle prime edizioni. Questo manuale vuole essere un contenitore didattico nel quale
vengono spiegate le varie caratteristiche del sistema operativo Mac OS X, affrontando -quando
possibile- il confronto con i sistemi operativi Unix fratelli.
Una prima parte, più argomentata, raccoglie una serie di informazioni per comprendere
pienamente il significato di sistema operativo e le origini di quello che noi tutti chiamiamo sem-
plicemente “Unix”. Successivamente, procedendo per categorie e microcategorie, spiegheremo,
attraverso esempi pratici, le funzionalità della linea di comando, adattando l’uso di quest’ultima
a quelle che potrebbero essere le esigenze di un utente comune.
Non me ne vorranno gli utenti più esperti per l’uso, talvolta, di termini semplicistici per ren-
dere comprensibile ed accessibile questa piccola guida alla maggior parte dell’utenza. Sperando,
come consueto, di aver offerto un buon servizio alla comunità Mac...
Olivio Mariano
3
Indice
1 Il sistema operativo 1
1.1 L’affidabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 L’hardware 5
2.1 Mainframes Minicomputers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Personal computers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3 Unix 7
3.1 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 Mac OS, un cuor di Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.1 A/UX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.2 NeXTSTEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.3 Mac OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
II Il sistema 17
4 Kernel e terminali 17
4.1 Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2 Metodi di accesso ad un sistema operativo Unix . . . . . . . . . . . . . . . . . . 17
4.2.1 Console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.2 Dumb terminals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.3 Smart terminals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.3 Terminale e shells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.4 Il prompt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.5 Uso dei tasti freccia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.6 Logging in e logging out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.7 Logging in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.8 Il nome utente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4
4.9 La password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.10 Logging out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.11 Tipi di login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.11.1 Il superutente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.11.2 Utilizzare il comando sudo . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5
7.4.1 Dove cerca Spotlight . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
7.4.2 Ricerche da terminale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
7.4.3 Operatori booleani . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
7.4.4 Metadata per documenti singoli . . . . . . . . . . . . . . . . . . . . . . . 45
7.4.5 Controllare Spotlight . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
7.5 Comparare: diff, cmp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
7.6 Comandi vari: split, touch, du, wc... . . . . . . . . . . . . . . . . . . . . . . . . . 49
6
8.6.2 Cancellazione parole, righe e altre unità di testo . . . . . . . . . . . . . 65
8.6.3 Cancellazione righe intere . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.6.4 Cancellazione della parte finale di una riga . . . . . . . . . . . . . . . . . 67
8.6.5 Ripristino righe cancellate . . . . . . . . . . . . . . . . . . . . . . . . . . 68
V I processi 69
11 Il documento passwd 76
11.1 Gestire gli utilizzatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
11.2 Gestione dei gruppi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
VII Le shells 88
7
14 Convenzioni e utilizzo 88
14.1 Variabili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
14.2 Le espressioni regolari o caratteri “joker” . . . . . . . . . . . . . . . . . . . . . . 91
14.3 Pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
14.4 Redirezione di uscite / entrate . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
14.5 Alcuni esempi sull’uso delle convenzioni . . . . . . . . . . . . . . . . . . . . . . . 95
14.6 Il comando test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
15 Scripts shell 98
15.1 Istruzioni di strutturazione, if, case, for, while . . . . . . . . . . . . . . . . . . . 100
17 Il TCP/IP 109
17.1 Consultazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
17.2 Test di connettività . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
18 SSH 111
18.1 Sdoppiare i terminali : screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
18.2 Sicurezza in remoto con PAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
19 Samba 116
19.1 Componenti Samba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
19.2 Configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
19.3 Sintassi del documento smb.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
19.4 Lan manager e Smb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
8
Parte I
“il sistema operativo è una sorta di strato che si pone sopra la macchina fisica
e permette di fare richieste ad una macchina virtuale ma che l’utente crede vera;
inoltre il compito del sistema operativo, oltre a quello di controllare l’esecuzione degli
altri programmi, consiste nell’impedire alle applicazioni di eseguire dei comandi che
potrebbero rivelarsi dannosi”
1
• Gestione dei files (file system)
• Interprete di comandi
• Real time
• Sistemi distribuiti
2
• Embedded
Sarà dunque possibile differenziare i diversi sistemi operativi a seconda delle funzionalità
hardware proposte dal calcolatore su cui girano.
1.1 L’affidabilità
Definendo come qualità di un assieme o di un sistema comunque complesso la sua ri-
spondenza ai criteri di specifica di funzionamento, si definisce affidabilità la capacità
di rispettare le specifiche di funzionamento nel tempo.
3
con diverse “modalità operative”. Questo, come può apparire ovvio, è utile e determinante nel
caso siano presenti avarie di diversi sottosistemi (sottoinsiemi). Ciò che chiamiamo ridondanza
, corrisponde a porre, dunque, più elementi in parallelo che, in quanto tali, forniranno al sistema
operativo una maggiore affidabilità.
Vediamo quali sono le modalità operative:
• USER MODE (esecuzione di operazioni per un utente. Es. applicativi). La user mode
gestisce i vari processi attribuendo ad ognuno di essi un determinato periodo di tempo
oltre il quale non possono operare.
CP U KernelM ode KernelM ode U serM ode KernelM ode U serM ode
Processo 1 Waiting Ready Ready Waiting Ready
Processo 2 Waiting Waiting Waiting Waiting Waiting
Sistema operativo Ready Ready - Ready -
Da sinistra a destra possiamo osservare come l’avvicendarsi delle diverse modalità operative
conserva una certa armonia . L’esistenza di una modalità utente (User Mode) implica un uso
nullo della cpu da parte del sistema operativo. L’esistenza di una modalità kernel (Kernel
Mode) implica un uso -possibilmente- complementare della cpu da parte dei processi e da parte
del sistema operativo.
L’interazione e la cooperazione delle modalità operative permette, dunque, ad una CPU di
dare “l’illusione” all’utente di un’effettiva concorrenza tra i vari processi attivi sulla macchina.
In realtà ciò che noi tutti chiamiamo multitasking è semplicemente il passaggio del controllo
della CPU, ad elevatissima velocità, da un processo all’altro, da un processo(i) al sistema
operativo.
Il turno di ciascun processo viene espletato con l’uso della priorità e il passaggio tra lo
stato di running e gli altri comporta un cambiamento di stato (di contesto) della CPU (context
switch).
4
Potremmo analizzare in maniera approfondita come ciascun sistema operativo a tutt’oggi
presente sul mercato può implementare in maniera corretta o meno queste funzionalità. Ciò
richiederebbe molto più che un “piccolo” manuale di duecento pagine... Diremo, sinteticamente,
che la famiglia Unix e i sistemi operativi Windows modelizzano e espletano l’interazione tra
i processi tramite un modo del tutto concorrenziale che rende l’uso efficente delle modalità
operative una priorità per le aziende che ne sviluppano il kernel. Possiamo capire, dunque,
che l’efficenza e l’operatività di un OS sono direttamente influenzate da queste funzionalità. Il
difficile equilibrio che si raggiunge nella gestione delle modalità operative e funzionali indica
la qualità dell’OS scelto. Viceversa, l’incapacità di un sistema operativo di saper gestire in
modo elegante le risorse hardware della macchina su cui gira implica quasi sempre una scarsa
affidabilità.
2 L’hardware
Per capire in maniera precisa come classificare il sistema operativo, è necessario conoscere su
quali tipologie di macchina gira o da quale sistema operazionale deriva. Iniziamo con il dire
che tutti i computer digitali moderni sono concettualmente molto simili. Il fatto che abbiano
diverse funzionalità, costi e prestazioni li caratterizza in:
5
• Supercomputers
• Personal computers
• Real-time computers
• la multiutenza - ciascun utente possiede un spazio di lavoro dedicato al quale gli altri
utenti non possono accedere
6
Figura 1: Un esempio di mainframe
• la memoria protetta - più processi operanti sulla macchina non interferiscono tra loro
evitando di coinvolgere l’operatività dell’intero elaboratore se uno di questi va in crash
3 Unix
Una breve rilettura delle concezioni di sistema operativo e hardware ci avrà fatto capire una cosa
molto importante: Unix non nasce per essere un sistema operativo “personale” ; non appartiene,
dunque, a una categoria di OS per “il resto di noi” ma nasce con il preciso intento di soddisfare
7
Figura 2: L’Apple II, primo computer “personale”
OS Azienda
SunOS Sun Microsystems
AIX IBM
IRIX Silicon Graphics
HP-UX Hawlett Packard
Linux -
Open BSD -
Grazie alla semplicità e alla compostezza di sviluppo, Unix ha una struttura molto semplice.
Questa comprende:
8
• un kernel incaricato della gestione della memorie, delle entrate/uscite, de lo scheduling
dei processi, dell’acceso alle periferiche.
3.1 Linux
Linux è un sistema operativo nato dalla mente del suo creatore Linux Torvalds nel 1991. Lo
sviluppo fu ripreso in seguito dalla comunità open source (Licenza GPL). Questa particolare
filosofia di sviluppo ha permesso a Linux l’integrazione in un numero sempre crescente di imprese
commerciali (IBM, Oracle, Dell, Silicon Graphics, Corel..) e la nascita di vere e proprie aziende
intorno al suo sviluppo (RedHat, Debian..) con lo scopo di vendere il servizio di distribuzione
di questo OS. Il grande successo di Linux è dovuto alla risposta di questo OS a delle particolari
esigenze:
• robustezza
• sicurezza
• funzionalità server
• compatibilità Unix
Facendo tesoro di queste caratteristiche, diverse ditribuzioni (più o meno riuscite) sono dispo-
nibili per l’utente in versione Client o Server, gratuite o commerciali, con supporto tecnico o
meno. Queste distribuzioni (RedHat, Fedora, Debian, Ubuntu, Mandrake...) sono carattetiz-
zate da dei numeri di distribuzione facenti appello a diverse evoluzioni del kernel, quest’ultime
caratterizzate a loro volta da un numero di kernel (ad esempio, Ubuntu 6.0 è basato sul kernel
9
2.6). É dunque possibile trovare un kernel Linux “comune” e normalizzato con integrato in
ciascuna distribuzione dei servizi e delle utilità di amministrazione comuni. Questa “normaliz-
zazione” del kernel ha permesso di possedere una referenza comune per tutti coloro vogliano
accedere ad un sistema operativo di derivazione Unix. Detto questo, esistono comunque molte
differenze tra le diverse distribuzioni quali l’arborescenza delle cartelle sistema e gli script di
amministrazione. Nonostante questa eterogeneità i sistemi che installano Linux sono altamente
competitivi a livello di costi di manutenzione (o semplicemente di acquisto) rispetto alle diver-
se versioni di Windows Server per l’impiantazione su piccoli server di documenti, stampanti o
anche di piccoli-medi gruppi di lavoro. Tutto questo risultando molto spesso altrettanto com-
petitivi rispetto agli stessi sistemi operativi Unix proprietari quando è l’installazione di servers
Web o basi di dati l’obiettivo da raggiungere.
Linux è dunque un ottimo sistema operativo che, per quanto unico nel suo genere ed efficente,
pecca in alcune caratteristiche ed esigenze:
• è un sistema nato per essere amministrato. Uno o più amministratori sono designati
per gestire le macchine. Gli altri utilizzatori definiti non sono tecnicamente autorizzati
e possono realizzare unicamente le azioni previste per essi. A questo si aggiunge anche
il piccolo “’difetto” (riconosciuto e in via di risoluzione) dell’inesistenza talvolta di GUI
locali che possano realizzare gli stessi interventi ottenuti via una linea di comando. Esiste,
dunque, un problema principale per chi possiede piccoli reti locali: formare e pagare un
amministratore di sistema è spesso difficile.
• Supporto del sistema. A volte risulta “aleatorio” sia dal punto di vista correttivo (patchs)
che dal punto di vista dell’assistenza e dell’installazione.
Le linee guida di Linux diventano quindi abbastanza difficili da comprendere per un non
esperto. Difficilmente chi ha appena comprato una qualunque macchina di tipo informatico ca-
pirà cosa voglia dire, ad esempio, “saper scegliere” tra diverse interfaccie, una diversa dall’altra,
tutte con funzionalità diverse.
10
Figura 3: Il desktopswitch di Linux, capace di cambiare interfaccia a seconda delle esigenze.
L’utente comune ha quasi sempre bisogno di uno standard, qualunque esso sia - buono
o cattivo, ma UNO standard. Il cambiamento e la libertà di scelta sono ottime cose, ma il
problema non è offrirle alla propria fascia di utenza ma saperle offrire con esattezza ed eleganza
a chiunque senza imporre una conoscenza approfondita al cliente finale.
11
3.2 Mac OS, un cuor di Unix
3.2.1 A/UX
Unix ed Apple, un connubio che non nasce certo con Mac OS X. Apple si era già avvicinata
a Unix con il poco conosciuto A/UX. A/UX (da Apple Unix) fu l’implementazione di Apple
Computer del sistema operativo Unix per alcuni Macintosh dell’epoca. L’ultima versione di
A/UX data del 1995 (3.1.1) e girava su gran parte dei Macintosh II, Quadra, e Centris. Questo
Unix modificato si basava sul System V 2.2 con alcune caratteristiche aggiunte dal SysV 3 e 4,
BSD 4.2 e 4.3. Compatibile pienamente con i sistemi POSIX e con SVID (System V Interface
Definition), includeva il supporto TCP/IP dalla versione 2 in poi.
Questa prima prova di “connubio” tra Mac OS e Unix includeva, con successo, un’interfaccia
grafica del tutto simile al consueto Finder. In realtà il Finder A/UX era una versione del Finder
7 adattata per essere eseguita come processo Unix e ridisegnata per interagire con il kernel Unix
e il suo filesystem. A/UX includeva anche una CommandShell che offriva -da vero Unix- una
interfaccia a linea di comando e, con particolari layers, poteva supportare in egual misura tutte
le applicazioni del Macintosh System 7.0.1. Al solito Apple, avendo anticipato di gran lunga
12
i tempi, si ritrovò a sviluppare un sistema operativo con una fascia di utenza assai ridotta e
con elevati costi di mantenimento. La storia di A/UX si concluse con una disfatta; anche se
il sistema operativo sviluppato era efficente, Apple non effettuò mai il porting di A/UX sui
PowerPC e preferı̀ addirittura usare una versione modificata dell’AIX IBM sui propri server a
metà degli anni ’90.
3.2.2 NeXTSTEP
Unix era il destino di Apple. Seppur con un nuovo system in via di sviluppo (stile system 7),
Apple -nel periodo più nero della sua storia- abortı̀ il progetto Copland e si ritrovò a dover
scegliere una “base” per il suo nuovo sistema operativo del futuro. Una scelta obbligata, poiché
troppo in ritardo rispetto al principale concorrente del momento: il System 7.5.3 si scontra con
il sempre più efficente e simile al Mac OS, Windows 95. Apple sceglie NeXT e il suo sistema
operativo NeXTSTEP riportando in azienda anche una delle persone più carismatiche della
storia dell’informatica, Steve Jobs. Il 4 febbraio 1997, Apple Computer acquisisce NeXT e uti-
lizza OpenStep per sviluppare l’interfaccia grafica di Mac OS X e portando con se la tecnologia
(in Objective C) Cocoa. NeXTSTEP si basa essenzialmente su un kernel Mach con codice BSD
UNIX che usa il potente Display PostScript per la gestione dell’interfaccia. Flessibile ed elastico
il NeXTSTEP gestiva a livello di oggetti le componenti del SO e comprendeva componentistica
di estrema qualità per lo sviluppo rapido delle applicazioni. La bellezza e l’eleganza di questo
SO derivano principalmente da queste due caratteristiche che, implementate con un’interfaccia
grafica raffinata, ne facevano un prodotto estremamente innovativo. La sua GUI introduceva il
concetto di dock, l’uso del 3D, e l’utilizzo di componenti che accettavano come ingresso oggetti
grafici. La grafica e il suono erano i campi in cui NeXTSTEP eccelleva integrando una gestione
avanzata dei colori per la tipografia e la trasparenza e un processore DSP Motorola che per-
metteva di gestire i suoni in maniera molto efficente. Oltre a tutto questo NeXTSTEP portava
con sé il PDO (Portable Distributed Objects) che permetteva l’invocazione remota degli oggetti
contribuendo cosı̀ al definitivo successo delle tecnologie orientate oggetti.
Con queste solidi basi e con il ritorno di un protagonista d’eccezione (Steve Jobs), Apple
ricominciò a credere in un sistema operativo capace di poter sostituire l’anziano system 7, che
nelle sua varie incarnazioni (System 6,7,7.1,7.5,... fino al 9.2.2) era fondamentalmente rimasto
lo stesso. Steve Jobs, alla prima presentazione di Mac OS X in forma di Public Beta, disse
che ciò che era nato dalle ceneri di NeXTSTEP sarebbe stato il sistema operativo Apple per
13
Figura 6: L’interfaccia di NeXTSTEP
i prossimi 10 anni: di fatto la longevità del nostro OS X oltrepassa molto più che la decade
poiché NeXTSTEP nacque più di 16 anni fa.
3.2.3 Mac OS X
Rhapsody. Questo era il nome che internamente Apple usava per indicare cosa stava sviluppan-
do partendo dall’eredità di NeXTSTEP. Di fatto, il sistema operativo “ideale” sarebbe dovuto
nascere dalle librerie OpenStep con accanto una “Blue Box” capace di emulare le applicazioni
Mac OS Classic. Previsto inizialmente per la fine del 1998, Rhapsody non fu mai commercia-
lizzato. Il principale problema di Rhapsody era una strategia di riscrittura delle applicazioni
alquanto ambiziosa che pretendeva un risviluppo completo delle applicazioni da parte delle
software house. Visti i risultati finanziari disastrori di Apple, Macintosh era un piattaforma
considerata in piena decadenza e la maggior parte degli sviluppatori si rifiutò di continuare a
dar fiducia al Mac OS.
Molto cambiò alla World Wide Developer Conference del 1999, quando Steve Jobs inaugurò
il progetto Mac OS Ten. Rhapsody avrebbe contribuito con il suo kernel, POSIX e OpenStep
14
a integrare il nuovo “Ten” con l’uso delle vecchie API del Mac OS riscritte e rinnovate per
l’occasione sotto il nome di Carbon. Le altre valide tecnologie del Mac OS Classic, quali
QuickTime, AppleEvents, AppleScript e ColorSync sarebbero state portate sotto OS Ten per
la gioia di sviluppatori e utenti finali.
Ed eccoci infine al nostro Mac OS X. Il kernel XNU e lo strato BSD sono stati riorganizzati
e redistribuiti in licenza open source (Apple Public Source Licence) sotto il nome di Darwin.
Fornendo un sistema operativo stabile, solido ed efficente, Darwin è in piena competizione con
gli altri sistemi di derivazione Unix, essendo del tutto “Made in Apple” e avendo abbandonato
tecnologie proprietarie come, ad esempio, il linguaggio PostScript sul quale l’interfaccia di
OpenStep si basava. Con estrema precisione e rispettando in pieno le date di sviluppo, Mac OS
X nasce nel 2001 e continua ad essere sviluppato con continui aggiornamenti a cadenza quasi
semestrale (anche se attualmente -con lo scopo di stabilizzare la piattaforma di sviluppo- Apple
ha deciso di allungare i cicli di sviluppo). Ma ciò che rende Mac OS uno dei sistemi operativi più
avanzati al mondo è la sua GUI. Facendo tesoro dell’esperienza del Mac OS Classic, l’interfaccia
Aqua è considerata una delle migliori ed eleganti. Riuscendo a coniugare questa stupefacente
creatività nello sviluppo delle GUI e la stabilità di un OS Unix, Apple è diventata una delle
compagnie con il maggior numero di installato Unix.
Di fatto, però l’appelazione “Based on Unix” è da considerare “ufficiosa”. Apple non ha
mai fatto parte del “The Open Group”, un’organizzazione nata per certificare l’appartenenza
dei SO alla famiglia Unix. Possiamo dunque definire Mac OS X un sistema operativo ibrido;
un abile miscuglio dei migliori prodotti che l’informatica è riuscita a produrre durante la sua
storia, dalla nascita di Unix al primo Macintosh.
15
Figura 7: L’interfaccia di Mac OS X “Ten” 10.0
16
Parte II
Il sistema
4 Kernel e terminali
4.1 Kernel
Il kernel è il core di Unix. Si tratta, principalmente, di un grosso programma caricato nella
memoria quando la macchina viene accesa e controlla l’allocazione delle risorse hardware da
quel momento in avanti. Il kernel conosce quali risorse hardware sono disponibili e possiede i
programmi necessari per “parlare” con le varie periferiche. Per far ciò ha bisogno dei controlli
di configurazione e alcune utilità standard. Il kernel Unix e le utilità sono programmi flessibili,
e alcuni aspetti delle loro caratteristiche possono essere controllati cambiando i documenti di
configurazione. Tipico esempio di un file di configurazione è il documenoi di sistema “fstab” che
comunica al kernel dove trovare i files presenti sul disco rigido. Altro esempio è il documento
di configurazione del system log che comunica al kernel come effettuare la registrazione dei vari
eventi e errori che si possono riscontrare durante la sessione di lavoro.
17
4.2.1 Console
Ogni sistema operativo Unix possiede una console principale connessa direttamente con la
macchina su cui è installata. La console è una particolare tipo di terminale che viene riconosciuto
quando il sistema è in funzione. Alcune operazioni relative al sistema possono essere attuate
da console. É per questo che è molto spesso accessibile solo dagli operatori del sistema e dagli
amministratori.
Alcuni terminali vengono denominati “muti” poiché possiedono risorse sufficienti solo per man-
dare caratteri come input al sistema e ricevere caratteri come output dal sistema. Molto spesso
i “personal computer” possiedono programmi di emulazione terminale in modo da potersi con-
nettere ad un sistema Unix in questa modalità. I terminali “muti” possono essere connessi
direttamente ad una macchina Unix, in remoto, attraverso un modem, un terminale server o
altre connessioni network.
I terminale cosidetti “smart”, come l’X terminal, possono interagire con il sistema ad un livello
più alto rispetto ai terminali “dumb”. Questi hanno sufficente memoria per provvedere un
adeguato supporto alle interfacce grafiche. L’interazione tra un terminale di questo tipo e
Unix può avvenire attraverso semplici caratteri quali icone, finestre, menu e azioni attraverso
il mouse.
18
puro ” Unix. In questo modo è possibile inviare comandi al Subsystem BSD che ne riceve le
istruzioni direttamente. Con queste caratteristiche il Terminale diventa uno strumento molto
potente di cui un amministratore può disporre. Se se ne hanno le capacità è teoricamente
possibile fare di tutto via terminale, usufruendo delle sue enormi capacità di interazione.
4.4 Il prompt
Prima di spiegare il funzionamento di qualsiasi comando della shell bash (default da Mac OS X
“Panther”) è necessario che si conosca bene l’importanza di ciò che ci appare a schermo al primo
avvio del terminale. Ciò che ci troviamo di fronte all’avvio dell’applicazione Terminale.app è il
prompt:
Last login: Tue Mar 4 06:19:35 on console
Welcome to Darwin!
[mistral:~] olivio\%
La parte tra parentesi quadre indica il nome della macchina. Questa informazione risulta
importantissima per chi ha intenzione di cimentarsi con il controllo remoto dell’elaboratore.
Ci informa, di fatto, su quale macchina stiamo operando. In successione dopo i due punti
troveremo la directory di utilizzo attuale (in gergo: working directory). Di default Mac OS
X imposta come directory iniziale la home directory indicata dalla tilde. Fuori dalle parentesi
quadre appare il nome utente attualmente operante sul terminale. Tutto ciò che si scrive sul
terminale appare sulla destra del nome dell’utilizzatore subito dopo il caratterere “percento”.
19
e intelligente l’esecuzione dei vari processi consentendo oltretutto di amministrare in perfetta
sicurezza la propria parte di sistema. Per far ciò è necessario che il sistema operativo vi “ri-
conosca” e dunque vi si chiederà di effettuare un’operazione di login. Vi starere chiedendo a
cosa serve questa operazione dato che all’avvio del Terminale il prompt ci dice già da subito
con quale nome siamo stati loggati. Questo succede perché di default Mac OS X ha abilitato
il login automatico che sarà necessario disabilitare se si vuole usufruire della multiutenza. A
login automatico attivo o meno la fase di login sarà effettuata comunque nell’ambiente grafico
e dunque all’avvio del terminale saremmo già autenticati.
Un’opzione ancora più diretta per accedere all’interfaccia testuale è quella di scegliere
“Altri...” nella finestra di login e scrivere nel campo destinato al nome utente :
>console
4.7 Logging in
Autenticarsi su un sistema operativo Unix richiede due informazioni fondamentali. Un nome
utente e una password. Quando si accede al terminale di Unix, il sistema operativo richiede
queste due informazioni:
Login:
Dopo aver scritto il proprio nome utente e premuto il tasto invio il sistema vi richiederà
una password. In questo caso quando scriverete il sistema non provvederà a visualizzare la
password digitata.
20
4.9 La password
Quando il vostro account sarà creato, anche una password sarà assegnata al nuovo utente. In
questo caso è utile sapere come cambiare la propria password trovandosi di fronte alla linea di
comando. Dopo essersi loggati è necessario digitare:
% passwd
1. Non usare nessuna parte del proprio nome o il nome di qualcun altro. Né usare l’ana-
gramma di alcun nome
2. Non usare un numero facilmente reperibile tipo il proprio numero di telefono, il proprio
indirizzo.
6. Se si hanno diversi account su diverse macchine non usare sempre la stessa password su
ogni macchina.
% exit
21
Dopo aver lasciato il proprio terminale è necessario assicurarsi che venga visualizzata la
prompt di login affinché si abbia l’assoluta certezza di essere stati effettivamente deautenticati
dal sistema. Se alcuni processi non sono stati terminati prima del loggin out il sistema richiederà
che questi vengano terminati. La shell di Mac OS X usa anche il comando :
% logout
Per effettuare la deautenticazione. É sempre buona norma cancellare ciò che è rimasto
visualizzato sul terminale prima del logout. Potrebbero essere rimaste informazioni importanti
tipo alcune informazioni a proposito di voi o a proposito del lavoro effettuato sul sistema. In
questo caso sarà opportuno digitare il comando:
% clear
• User– L’utente “ospite” non ha alcun diritto sulle impostazioni della macchina. In
definitiva deve sempre richiedere l’autorizzazione all’Amministratore per un qualsiasi
cambiamento sulle impostazioni prestabilite.
22
4.11.1 Il superutente
Il cosı̀detto super utente (detto anche root) è il carattere che può tutto in Unix. É utile cono-
scerlo poiché permette la modifica di parametri nei documenti di sistema altrimenti impossibile
con l’account creato da Mac OS X al primo avvio. Per abilitarlo sarà necessario utilizzare
l’applicazione Netinfo Manager (vedi in /Applications/Utilities/Netinfo Manager). Utilizzando
questa applicazione possiamo autenticare e assegnare al root una password.
Vediamo la procedura di autenticazione:
• In Mac OS 10.2.x e successivi, apriamo NetInfo Manager e scegliamo dal menu “Security”
l’opzione “Enable root user”.
• In Mac OS 10.x.x scegliamo dal menu “Domain” l’opzione “Security”. Dal sottomenu
scegliamo “Enable root user”.
Per richiamare questo tipo di utente via terminale sarà necessario utilizzare il comando:
[mistral:~] olivio % su
Password:
[mistral:/Users/olivio] olivio#
% sudo
23
Parte III
I comandi terminale
Generalmente un comando Unix si presenta sempre sotto questa forma:
% Nomecomando [-options]
Il nome del comando è il nome del programma che il terminal eseguirà. L’opzione ci viene in
genere suggerita dalla shell stessa e altera la funzionalità del comando in base al compito che
l’utente vuole che esegua. L’argomento possono essere dei documenti, delle cartelle o anche
programmi. Provando a scrivere per esempio:
olivio@mistral:~$ cp
La nostra shell ci verrà in aiuto indicandoci quali sono le opzioni possibili per il comando.
olivio@mistral:~$ cp
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-pv] src target
cp [-R [-H | -L | -P]] [-f | -i | -n] [-pv] src1 ... srcN directory
Nell’utilizzare qualunque comando della shell può capitare di incappare in errori. Niente
paura. Se si vuole abortire l’esecuzione di un comando sarà sufficente usare la combinazione di
tasti ctrl + c.
24
Se nome-del-comando è un comando valido (naturalmente la sua man page deve esistere),
viene mostrata la documentazione relativa. Ricordiamo che le man pages non sono solo adibite
alla descrizione dei comandi, ma anche alla descrizione di molti files di configurazione. Se si
scrive:
% man [capitolo] rc
Si otterà la documentazione in linea del file di booting “rc”. In qualunque caso il valore
“capitolo” è un numero che indica in quale parte della man page si vuole ricercare l’informazione
voluta. Omettendo questo valore il comando man mostrerà direttamente la prima pagina del
manuale. Il “valore capitolo“ è importante poichè in ambito Unix ci si trova spesso davanti a
frasi del tipo “per dettagli vedere nomadelcomando(6)”, dove il valore tra parentesi corrisponde
al capitolo delle man pages da consultare. Come “regole” di consultazione ricordiamo che per
andare avanti nello scorrimento del testo delle man pages è sufficente tener premuto il tasto invio
mentre per “sfogliare” le pages si può premere la barra spaziatrice. Chi prende consiglio dalle
man pages molto spesso desidera salvare su disco e tenere sempre a portata di mano il manuale
ricavato. In questo caso si pone un problema. Il testo delle man pages è formattato in maniera
particolare. Non possiamo dunque fare un semplice copia e incolla poichè il testo incollato
sarebbe in definitiva poco leggibile. Occorre oltre che filtrare l’output di man attraverso il
comando “col” anche instradarlo in un file di testo specifico. Usiamo dunque:
5.2 whatis
Dopo l’introduzione del comando man ci sarà utile apprendere l’uso del comando “whatis”.
Quest’ultimo infatti riporta informazioni sintetiche su un comando, quali le man pages esistenti
e il suo funzionamento in generale. Il comando whatis crea il suo database partendo da man
pages già esistenti e disponibili sul computer.
25
5.3 apropos
In correlazione con whatis, riporta tutte le ricorrenze del testo inserito. Scrivere:
% apropos cp
troverà tutte le ricorrenze di cp nel database di whatis. Il comando risulta molto comodo
quando si vuole verificare l’esistenza di quel comando in più man pages (in diversi capitoli, ad
esempio).
% ./pwd
significa eseguire il programma pwd escludendo con ./ tutte le directory all’infuori di quella
in cui si sta operando. Questo comando è molto importante se sappiamo che sulla nostra mac-
china risiedono programmi con lo stesso nome. Potrebbe capitare di lavorare su un programma
che risiede in tutt’altra directory. E’ dunque buona norma specificare sempre la directory nella
quale si sa che risiede il programma da eseguire.
26
6 Muoversi nel filesystem
6.1 Dischi e sistemi
Loggati all’interno del sistema è necessario capire come esso opera e in quale direzione ci stiamo
muovendo digitando i diversi comandi. Ovviamente, come l’interfaccia grafica, il terminale ha
un suo sistema di documenti che non ricalca sempre quella utilizzato dalla GUI. All’interno dei
sistemi Unix a linea di comando osserviamo l’esistenza di una arborescenza unica di cartelle
impiantata sulla root del disco detta “/”. In questo modo il sistema ci “inganna” facendoci
pensare all’esistenza di un solo sistema di documenti. In realtà, è possibile l’unione di più
alberi corrispondenti a sistemi di documenti diversi situati su dischi o anche macchine diverse.
É dunque possibile il “mounting” di ciascun albero su una cartella vuota (o meno) di un albero
già disponibile e creato. In questo caso parliamo di costruzione di un’arborescenza logica.
I vantaggi di questa soluzione sono molteplici:
• Elasticità
• Estensibilità
I sistemi di documenti (filesystems) possono essere cosı̀ creati in una partizione, a sua volta
situata su uno o più dischi (o supporti di immagazzinamento). Unix supporta diversi sistemi
di documenti.; di per se anche Mac OS X lo fa in maniera egregia limitandosi spesso in alcune
sue possibilità usando prevalentemente il filesystem “di serie” per Mac, l’HFS+. Generalmente,
usando un sistema Unix possiamo confidare nel fatto che esso supporti:
• umsdos : MsDos esteso per una migliore compatibilità con Unix (nomi lunghi, UID,
GID..)
27
• ntfs : NTFS (Windows NT)
olivio@mistral:/etc$ df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/disk0s2 77814832 45281652 32277180 59% /
devfs 1 1 0 100% /dev
fdesc 1 1 0 100% /dev
<volfs> 512 512 0 100% /.vol
olivio@mistral:/etc$
28
il quale file e cartelle sono immagazzinati e organizzati su un dispositivo di archiviazione. In
questo sistema di documenti, Unix ci colloca, al suo avvio, in una working directory . A partire
da questa cartella “base” ci accorgeremo che l’esplorazione avviene tramite una sequenza di
“nodi” di tipo gerarchico, molto simile ad un albero. L’albero è piantato nel terreno in un luogo
chamato root(radice) chiamata “/”. Ogni elemento che troviamo in questo catalogo gerarchico è
o una cartella o un documento. Per specificare un particolare documento o cartella è necessario
che si specifichi anche un percorso per giungerci. Il percorso partirà sempre dalla root del
catalogo gerarchico per arrivare al file o cartella voluta. Ogni directory nella sequenza sarà
seguita da “/”. Ricordiamo che il simbolo “/” indica anche la root directory. Non confondiamo
dunque il carattere “/” usato ad inizio sequenza per indicare la root directory e il carattere “/”
usato solamente per separare le cartelle del catalogo gerarchico. L’arborescenza di un sistema
Unix è quasi sempre comune a molti OS di tale derivazione. Di seguito forniamo un elenco delle
varie cartelle presenti a livello “radice” “/”. Ovviamente questo listing è “generale” e varia a
seconda delle varie distribuzioni di Unix installate.
• /home : Cartelle personali degli utenti (home). Ovviamente a seconda della configura-
zione questa arborescenza può cambiare
29
• /usr : Comandi del sistema
• /usr/bin : Comandi del sistema operativo specifici a Linux (ad esempio) e all’installazione
realizzata. Molto spesso vi si trovano degli alias verso i comandi di /bin.
• /usr/doc : Documentazione
• /usr/sbin : Demoni del sistema specifici all’installazione del sistema Unix in question.
• /usr/X11R6 : X-Window
• /var/mail : Mail
30
e /Developer) ma nascoste. Qui di seguito forniamo una lista dei documenti e cartelle visibili
alla radice del disco (o in altre parti del sistema) legati esclusivamente a Mac OS X:
• .DS Store - Documento contenente i settaggi del finder in ogni cartella creata.
• .Trashes - Cartella contenente i documenti che sono stati spostati nel cestino.
• Developer/ - Cartella delle applicazioni di sviluppo Apple. Presente sul disco unicamente
se i Developer Tools sono installati.
• Network/ - Applicazioni via Network. Allo stesso modo Librerie , cartelle Utente via
Network sono usate attraverso l’uso di questa cartella.
• Shared Items/ - Cartella usata da OS 9 per condividere gli elementi tra diversi utenti.
31
• Volumes/ - Contiene tutti i volumi montati dal sistema.
• cores/ - Se il “core dumps’ è in funzione sarà allora creato in questa cartella sotto il nome
di core.pid.
• var/ - I documenti di log sono contenuti in questa cartella. Generalmente anche tutti i
documenti modificati più di frequente.
32
mantenendo una lista dei documenti che non dovrebbero essere visibili nel Finder. Usando poi
i Developer Tools forniti da Apple, il comando :
SetFile -a V documento
SetFile -a v documento
% pwd
cd nome_directory
che significa change directory seguito dal nome della cartella in cui si vuole arrivare. L’ar-
gomento può anche essere un percorso che definisce la directory nella quale si vuole lavorare.
Scrivere semplicemente :
% cd
nel prompt vuol dire chiedere alla shell di reindirizzarci direttamente nella nostra home-
directory. Scrivere:
cd ..
significa chiedere alla shell di scalare di un livello la gerarchia delle directory. Quando si è
nella cartella voluta possiamo chiedere al terminale di dirci cosa vi è dentro scrivendo:
33
% ls
che significa list . In questo caso otterremo il isting dei documenti escludento tutti quelli
che cominciano con ”.“. Più utile è da usare l’opzione del comando ”-l“:
% ls -l
3. Proprietario
4. Gruppo
5. Dimensione
“ls“ si dimostra molto potente. É possibile effetture dei listing molto specifici e dettagliati.
Per esempio scrivendo:
% ls -lR /lib/l*
l’opzione “I” e “R” sono invocate insieme. L’opzione “I” richiede un long output e l’opzione
“R” chede a ls di listare le directory scendendo la gerarchia. L’ultima parte del comando “
/lib/l*” chiede al comando di listare documenti e cartelle comincianti per “l” nella cartella
/lib. Il carattere * significa qualunque carattere, dunque tutte le cartelle comincianti per “l” e
con qualunque seguito di caratteri.
34
6.7 cp
cp è un’utilità di sistema e permette di effettuare una copia del documento o cartella passato
in argomento. Ad esempio:
• olivio@mistral:~/Desktop$ rm Stato.txt
olivio@mistral:~/Desktop$
Abbiamo rimosso il documento Stato.txt dalla Scrivania
35
• rmdir - cancella una cartella
6.10 ln
ln serve alla creazione di alias materiali o simbolici. Un alias materiale è una referenza a un
documento. In questo caso ciò corrisponde a un’uguaglianza totale tra tutti gli alias materiali
sullo stesso documento o cartella; ciò comporta la distruzione reale di un documento quando
l’ultimo alias materiale su quest’ultimo viene eliminato. Un alias simbolico è invece una sem-
plice “scorciatoia” verso un documento: l’alias simbolico rimarrà attivo nel caso il documento
sorgente venga elimitato.
Ad esempio: se creiamo un alias materiale e 2 simbolici sullo stesso documento otterremo la
soppressione dell’alias materiale e di uno dei due alias simbolici. Se sopprimiamo un documento
di destinazione otterremo un errore dall’ultimo degli alias simbolici.
36
Estensione Servizio/applicazione
.c Documento sorgenti in C
.cpp Documento sorgenti in C++
.h Documento di intestazione in linguaggio C o C++
.o Documento oggetto generato dall’applicazione
.a Biblioteca statica
.so Biblioteca dinamica
.sh Script shell
.gz o .z Documento compresso utilizzando gzip
.bz2 Documento compresso utilizzando bzip2
.jpeg, .jpg, .gif, .png, ... Documento immagine
.txt Documento testo
.tgz Documento in formato tar compresso utilizzando gzip
.deb Pacchetto di installazione debian
.rpm Pacchetto di installazione RedHat
.ns Documenti NeXTSTEP ancora presenti in Mac OS X talvolta
% ls /dev | more
dove | ridirigerà l’uscita del comando all’ingresso di more. Il risultato sarà una schermata
pagingdi 24 righe al termine della quale il comando more mosterà a schermo:
--more--
37
attendendo la pressione della barra spaziatrice da parte dell’utente per passare alla pagina
successiva. Allo stesso modo il comando:
% less
% cat
espressamente conCATenate , al pari di less e more stampa a schermo il testo del documento
in parametro ma, come suggerisce il nome del comando, cat può essere in effetti usato per
concatenare e stampare più file. Nel seguente esempio osserverete come vengono stampati uno
di seguito all’altro (senza interruzione o demarcazione del cambio di file) i file resolv.conf e
rc.shutdown:
Il comando:
% od
Può essere utile se il documento da esaminare non è di testo ma, per esempio, un file dati.
In questo caso non ha senso cercare di visualizzarlo o editarlo come fosse un file di testo. É
cosı̀ possibile effettuare un dump ottenendo una rappresentazione visualizzabile del contenuto
binario. od (propriamente Octal Dump ) senza opzioni produce una visualizzazione ottale
delle “parole” del documento. Altre opzioni consentono di dividere il file in altre unità (byte
invece che parole)o di darne una rappresentazione decimale o esadecimale o ASCII . Per ottenere
quest’ultima possibilità usare l’opzione -c (visualizzazione a byte tentando una rappresentazione
ASCII):
olivio@mistral:~$ od -c q.log
0000000 T h i s i s T e X , V e r
0000020 s i o n 3 . 1 4 1 5 9 2 ( W
38
0000040 e b 2 C 7 . 5 . 5 ) ( f o r
0000060 m a t = t e x 2 0 0 6 . 5 . 4
0000100 ) 2 J U N 2 0 0 6 1 5
0000120 : 2 6 \n * * q \n ( / u s r / l o
0000140 c a l / t e T e X / s h a r e /
0000160 t e x m f . t e t e x / t e x /
0000200 l a t e x / t o o l s / q . t e
0000220 x F i l e i g n o r e d \n )
0000240 \n ! E m e r g e n c y s t o
0000260 p . \n < * > q \n \n *
0000300 * * ( j o b a b o r t e d ,
0000320 n o l e g a l \ e n d f
0000340 o u n d ) \n \n N o p a g e s
0000360 o f o u t p u t . \n
0000373
olivio@mistral:~$
\n
rappresentano, seguendo le convenzioi del linguaggio C, dei < CT RL − J > cioè dei < N EW −
LIN E > (se questi file sono stati ottenuti manualmente per es. con un editing, questi caratteri
< N EW − LIN E > sono stati però scritti non premendo il tasto < N EW − LIN E > (talvolta
indicato con < LF > o < LIN E − F EED > sulla tastiera) ma con un < RET U RN >: la
traduzione in < N EW − LIN E > avviene automaticamente). Le coppie di caratteri
\0
rappresentano i caratteri nulli. Per esaminare il contenuto binario del direttorio corrente dare
il comando:
Altro esempio di paginazione con od: Visualizzazione in esadecimale del documento /etc/rc.
39
olivio@mistral:/etc$ od -x /etc/rc
0000000 2123 622f 6e69 732f 0a68 2023 6f43 7970
0000020 6972 6867 2074 3931 3739 322d 3030 2034
0000040 7041 6c70 2065 6f43 706d 7475 7265 202c
0000060 6e49 2e63 0a0a 202e 652f 6374 722f 2e63
0000100 6f63 6d6d 6e6f 0a0a 7865 6f70 7472 2d20
0000120 206e 6153 6566 6f42 746f 650a 7078 726f
0000140 2074 6e2d 5620 7265 6f62 6573 6c46 6761
0000160 650a 7078 726f 2074 6e2d 4620 6373 536b
0000200 616c 6873 650a 7078 726f 2074 6e2d 4e20
0000220 7465 6f42 746f 0a0a 6669 5b20 2d20 2064
0000240 532f 7379 6574 2f6d 6e49 7473 6c61 616c
40
stato ancora in grado di indicizzare . E’ anche largamente obsoleto data la sua lentezza
nelle ricerche.Se proviamo ad effettuare una ricerca del tipo:
il terminale cercherà a partire dalla “radice” del disco il documento fstab. All’occorrenza
questa operazione potrà rivelarsi abbastanza lunga.
In questo caso ho cercato la catena di caratteri apple in tutti i documenti presenti nella
cartella /etc/
41
Figura 8: Albero di “metadati”
sono “dati che descrivono dati” e sono cotenuti nell’header di un qualsiasi file indicizzato. Il
file, di per sé, sarà rappresentato sotto forma di “albero” contenente le diverse informazioni.
In questo modo Mac OS X può identificare molto velocemente il tipo di documento e tutte
le informazioni contenute in esso. La ricerca viene dunque effettuata sull’indice e non sul disco
come succedeva nelle precedenti versioni di Mac OS X e soprattutto questo tipo di ricerca è
42
attivabile da qualsiasi applicazione del sistema operativo. La funzione di ricerca dei dati diventa
dunque accessibile ovunque, integrandosi elegantemente con tutte le funzionalità di qualsiasi
processo.
Chi usa la linea di comando per lavorare e cercare i propri documenti, probabilmente usa i
classici comandi locate e find. Come già spiegato, in entrambi i casi i due comandi hanno pregi
e difetti. Per supplire a questo classici comandi, Spotlight introduce una “suite” di comandi da
terminale dimostrandosi veloce e “specifico” nelle sue ricerche se usato correttamente.
Come già accennato, Spotlight si basa su un database di metadati per effettuare le sue ricerche.
Di per sé, Spotlight usa un plugin specifico per ogni applicazione con la quale interagisce. Questo
plugin estrae i dati dal documento dell’applicazione trattata e lo colloca nel suo database. I
cosidetti plug-in “ importatori ” sono contenuti in
/System/Library/Spotlight
/Library/Spotlight
Una semplice ricerca da linea di comando con Spotlight può essere effettuata in questo modo:
mdfind termine
43
mdfind -onlyin
ci sarà utile:
mdfind -live
ci permetterà di vivere in tempo reale ogni cambiamento effettuato sui documenti ricercati.
Se vogliamo effettuare ricerche avanzate e più specifiche, un possibile esempio può essere
questo per la ricerca di un particolare autore nella nostra libreria iTunes:
Come avrete capito passare in argomento più parole chiave alla shell Unix significa mettere
le parole in questione tra virgolette. L’uso di queste convezioni implica una minima conoscenza
degli operatori booleani. Vediamo come funzionano nel caso di Spotlight.
Gli operatori booleani sono del tutto simili a quelli descritti tra le espressioni regolari in questo
tutorial:
• il simbolo | indica OR
• () crea gruppi
44
1. $ mdfind ‘‘livio|pino’’
In questo modo cercheremo tutti i documenti che contengono o “livio” o “pino”.
2. $ mdfind ‘‘livio(-pino)’’
cercheremo tutti i documenti contenenti “livio”, ma non “pino”
Notiamo in ogni caso che se passiamo un solo parametro al comando le doppie virgolette
non saranno necessarie. Se invece anche una “simple quote” è passata in parametro il comando
mdfind risponderà in questo modo:
$ mdfind l’altro
>
Il terminale attende che la virgoletta sia chiusa per cominciare la ricerca. Quindi effettueremo
la nostra ricerca in questo modo in caso siano presenti delle virgolette nel nostro argomento:
$ mdfind ‘‘l’altro’’
Filtreremo i risultati di “Livio” con il comando grep che in questo caso sarà accompagnato
dall’opzione -i affiché sia case sensitive .
Il comando
mdls
45
olivio@mistral:~/Desktop/Music$ mdls Ani\ difranco.mp3
46
kMDItemFSSize = 5583098
kMDItemFSTypeCode = 0
kMDItemID = 479939
kMDItemKind = ’’MP3 Audio File’’
kMDItemLastUsedDate = 2006-04-11 21:50:41 +0200
kMDItemMediaTypes = (Sound)
kMDItemTotalBitRate = 128
kMDItemUsedDates = (2006-04-11 21:50:41 +0200)
kMDIdem*
Invitiamo il lettore ad una lettura delle appendici per un elenco completo degli attributi dei
metadati e delle loro funzionalità.
Spotlight può essere in parte personalizzabile. Per configurare Spotlight useremo il comando
mdutil
mdimport.
/Volumes/mistral:
Indexing disabled for volume.
47
2. può ispezionare le impostazioni su un volume:
# mdutil -s /Volumes/mistral
/Volumes/mistral/:
Status: Indexing Disabled
# sudo mdutil -E /
48
7.6 Comandi vari: split, touch, du, wc...
• split - ci permette di dividere un documento testo in più parti.
olivio@mistral:/$ ls -l hola
-rw-r--r-- 1 olivio admin 13 Oct 29 18:34 hola
olivio@mistral:/$ date
Sun Oct 29 18:44:11 CET 2006
olivio@mistral:/$ touch hola
olivio@mistral:/$ ls -l hola
-rw-r--r-- 1 olivio admin 13 Oct 29 18:44 hola
Osserviamo in questo caso (tramite l’uso del comando ls- l) come il file hola abbia cambiato
la data di creazione.
49
Parte IV
% nano miodocumento.txt
Nel caso questo documento non esista, nano ne creerà uno con tale nome. Nano ha il
vantaggio di essere abbastanza trasparente verso l’utente. In basso troverete una tool bar
testuale con una lista delle combinazioni tastiera da utilizzare per effettuare le diverse operazioni
sui documenti.
A chi vuole invece conoscere il funzionamento di uno dei più classici e potenti editori di
testo presenti da sempre su Unix consigliamo la lettura della prossima sezione.
50
tutto. Un’ulteriore volume appropriato all’apprendimento di Vi può essere il tutorial interattivo
presente in ogni distribuzione.
8.1 Avvio
Come già spiegato in introduzione, per richiamare l’editor Vi, sarà necessario inserire il comando
vi e successivamente il documento da trattare o da creare.
jobs@mistral:~$ vi documento
L’esistenza o meno del documento passato in argomanto farà si che Vi si comporti in due
modi diversi. Nel primo caso vi aprirà il documento in questione proponendone l’editing. Nel
secondo Vi creerà un documento nuovo. Se il documento passato in argomento è invece già in
stato di editing in un altro terminale, Vi chiederà all’utente le opzioni riportate in figura.
Nel nostro primo utilizzo di Vi, quest’ultimo non è certamente preconfigurato e lo schermo
ci appararirà in questo modo:
~
~
~
~
"doc" [New File]
51
É del tutto normale che l’editor non sia preconfigurato. Spiegheremo in uno dei paragrafi
di seguito come configurare correttamente il proprio editor di testo. Le righe che vediamo
rappresentate sotto forma di :
sono righe di schermo atte a delimitare le zone di testo inseribili; quindi non si tratta di righe
di file, ma essenzialmente, righe oltre l’ End of File . L’ultima riga che precede immediatamente
queste è l’ultima riga del buffer in questione.
8.2 Modalità
Vi è un editor di testo che funziona secondo la modalità di utilizzo in cui si trova. I due
principali stati o mode sono:
Per editare sarà necessario impartire i comandi con Vi nel primo stato, mentre per inserire
nuovo testo Vi dovrà trovarsi nel secondo stato.
Al momento dell’invocazione di Vi, l’editor si pone all’utente in modalità comandi. Per
passare dalla modalità inserzione alla modalità comandi sarà necesario premere il tasto :
<ESC>
Vi non mostra mai a schermo in quale modalità si trova quindi, in caso di incertezza, sarà
utile premere comunque il tasto ESC. Il tasto in questione, dato in modalità comandi elimina
eventuali comandi già presenti in buffer e di cui, quindi, la scrittura non è stata portata a
termine; se invece alcun comando di tipo parziale è stato imparito, Vi emette una segnalazione
acustica.
Riepilogando:
i, I, a, A, o, O, s, c
52
• modalità inserzione →modalità comandi:
ESC
Essenzialmente, in modlità inserzione, si può solo inserire del testo o impartire il comando
ESC: per spostarsi nel testo, dunque, avremo bisogno di un particolare set di comandi che
vedremo più avanti.
8.3 Terminare Vi
Per terminare il processo Vi è necessario usare il comando:
ZZ
Ovviamente per attuare il comando sarà necessario essere in modalità comandi. In questa
modalità alcune considerazioni possono tornare utili:
<RETURN>
• durante la digitazione del comando a schermo non viene presentato niente. Nel caso di
un comando a doppia lettera come ZZ, se digitiamo la prima Z Vi non presenterà niente
a schermo.
53
8.4.1 Inserire prima del cursore
Il testo è inserito prima del carattere che interessa il cursore. Anche in questo caso Vi, nel
passaggio in questa modalità, non mostrerà alcunché a schermo. I caratteri digitati dopo “i”
verrranno dunque scritti nel buffer di Vi per essere poi salvati unicamente alla pressione del
tasto ESC per tornare in modalità comandi.
Un breve esempio di sessione Vi :
Supponiamo di voler creare il documento prova aggiungendo due righe di testo:
• jobs@mistral:~$ vi prova
seguito dal tasto RETURN
• i :
passiamo in modalità inserzione aggiungendo un “:” seguito dal tasto RETURN per
andare a capo.
• prova
seguito dal tasto ESC e dal comando ZZ
:
prova
~
~
~
~
-- INSERT --
54
8.4.2 Cancellazione dei caratteri
<DELETE>
è possibile cancellare uno o più caratteri tra quelli appena battuti, ovviamente in modalit
à inserzione. In Vi il risultato dell’uso del suddetto tasto può risultare non proprio chiaro: il
cursore arretra verso sinistra di un carattere ma non cancella dallo schermo il carattere voluto.
Affinché avvenga, in realtà, una “sostituzione” basta premere il carattere che si vuole immettere
al posto di quello preso in esame da Vi nell’arretramento.
Inoltre alcune considerazioni sull’uso del tasto DELETE in Vi ci sembrano doverose:
• il tasto DELETE si può usare solo in modalità inserzione. Per cancellare testo in modalità
comandi si usano altre combinazioni da tastiera.
• il tasto DELETE cancella solo i caratteri che sono stati inseriti dopo l’ultima inserzione
nel buffer o, se vogliamo, dopo l’ultima richiesta di inserzione.
<CTRL-W>
<CTRL-U>
Questo in caso ci si trovi con il cursore sulla riga effettivamente interessata. Ovviamente
questa combinazione non implica mai la cancellazione di un testo la cui inserzione si avvenuta
prima dell’ultima operazione effettuata. Se, ad esempio , l’inserzione del testo è avvenuta
quando una riga è già stata inserita in precedenza, questa combinazione di tasti non cancellerà
tutta la riga, ma solo quella nuova, dunque corrente .
55
8.4.4 Uso delle frecce
A questo punto, è essenziale parlare dell’uso dei tasti freccia. I tasti freccia non possono
essere usati in modalità inserzione, poiché alcun comando è compreso da Vi se posto in tale
configurazione. I tasti freccia non fanno parte della tastiera alfanumerica di base e, dunque,
questo genere di tasti equivalgono ad una sequenza di caratteri. Una tale sequenza è chiamata
escape sequence ed inizia sempre con il carattere ESC. Vi, dunque, interpreta l’uso dei tasti
freccia come un ESC con, in aggiunta, un altro carattere: di conseguenza uscirà prima dalla
modalità inserzione e poi cercherà di interpretare il carattere dopo l’ESC.
Generalmente, il risultato dell’uso dei tasti freccia, è non voluto o erroneo.
insert , maiuscolo in questo caso. Questo comando è equivalente a una coppia di comandi:
<SPAZIO> <TAB>
2. effettua un’inserzione di testo all’inizio della riga corrente, come se usassimo il tazto “i”
di inserzione classica
56
8.4.6 Creazione di una nuova riga
o, O
Questi permettono di inserire una nuova riga tra due altre già scritte. Se, infatti, in modalità
inserzione si continua a scrivere andando a capo ad ogni fine riga usando il tasto RETURN,
inseriremo un testo su più righe.
Useremo, dunque, i comandi ’o’ oppure ’O’ open . Il comando ’o’ minuscolo, stipula una
riga sotto quella corrente in maniera del tutto indipendente dalla posizione del cursore su
quest’ultima e, ovviamente, mette Vi in modalità inserzione. Al termine dell’operazione si pùo
tornare in modalità comandi premendo, al solito, il tasto ESC.
Se invece, l’ obiettivo, è quello di aprire una nuova riga sopra la corrente possiamo usare il
comando ’O’ maiuscolo. Allo stesso modo termineremo l’operazione con il tasto ESC.
57
Figura 10: La disposizione dei tasti di spostamento in Vi
Ad un primo impatto, la scelta di tali lettere per lo spostamento, può sembrare poco intui-
tiva; potremo osservare, in seguito, come i tasti enunciati sono disposti “strategicamente” sulla
tastiera e quindi la loro posizione risulterà, con il passare del tempo, del tutto naturale.
Ovviamente faremo attenzione ad usare esclusivamente caratteri minuscoli.
Il terminale di Mac OS X, nello specifico, supporta i tasti freccia; al posto dei quattro
comandi sopra indicati è probabile che possano essere impegati i tasti speciali per ottenere
lo stesso effetto. Ricordiamo che Vi è stato progettato per una totale indipendenza dai tasti
speciali della tastiera. É consigliato, dunque, assecondare questa filosofia evitando i tasti freccia.
Inoltre, Vi, prevede anche dei comandi speciali per l’equivalenza delle freccie:
Il comando:
58
(zero), porta il cursore sul primo carattere della riga corrente. Il comando:
porta al primo carattere che non sia < SP AZIO >< T AB > della riga in questione.
Il comando:
porta il cursore sull’ultimo cursore sul primo carattere della riga corrente.
Con Vi è possibile portare direttamente il cursorse su un carattere specifico della riga corrente.
É possibile, altresı̀, portarsi anche su una stringa specifica appartenente alla riga corrente. I
comandi presentati di seguito sono:
• “f” - comando find seguito da un carattere porterà il cursore sulla prima occorrenza del
carattere sulla riga.
• “F” - ricerca il caratere specificato nella riga corrente escludendo il carattere specificato
sempre nella riga corrente e, dunque, escludendo il carattere sotto il cursore.
• “t” - molto simile al comando “f”, ma in questo caso il cursore si sposta sul carattere che
precede quello ricercato.
Alcuni esempi :
fO
sulla stringa di caratteri “Mara Olivio Nina”, il cursore si porterà sulla prima occorrenza
del carattere. Sempre sullo stesso esempio, se il cursore si trova inizialmente su una
delle lettere centrali della stringa, esso proseguirà sino a trovare la giusta occorrenza del
carattere specificato.
59
• nel caso si applichi il comando:
tF
sempre sulla stessa stringa di caratteri riportata nel precedente esempio, il cursore si
porterà sullo
<SPAZIO>
I comandi citati possono essere resi più potenti, facendoli precedere da un contatore: in
questo modo indicheremo a Vi quante volte deve essere ripetuta la ricerca del carattere in
questione sulla riga.
Ricordiamo inoltre che il comando:
ha come funzione quella di ricercare ancora una volta la ricerca iniziata con uno dei comandi
“f” o “F”, usando lo stesso carattere di ricerca sulla stessa riga.
Allo stesso modo, il comando:
effettua le stesse operazioni che il comando “;”, ma in questo caso effettua la ricerca in direzione
opposta all’ultimo comando di ricerca.
Il comando:
è identico a “w”. In questo caso, però, la “parola” è delimitata solo da spazi, TAB e fine
riga.
60
8.5.5 Spostamenti a righe
con il consueto uso, opzionale, di un contatore servono a questo scopo. Il cursore si spsoterà,
in generale, sul primo carattere diverso dallo SPAZIO e dal TAB presente sulla riga in questione.
CTRL - *
che consente lo spostamento verso la fine o verso l’inizio del file a pagina intera di testo o a
mezze pagine .
In sintesi:
Combinazione Uso
CTRL-F (forward) avanti di una pagina intera
CTRL-B (backward) indietro di una pagina intera
CTRL-D (down) avanti di mezza pagina
CTRL-U (up) indietro di mezza pagina
In questo caso l’uso di un contatore non ha lo stesso significato delle precedenti sintassi usate
fin qui. Un contatore che precede le prime due combinazioni descritte indica di quante pagine
ci si deve spostare. Il contatore che precede le ultime due combinazioni nell’ordine rappresenta
il numero di righe di cui si deve spostare il cursore con il corrente e la prossima occorrenza di
combinazione tastiera che non specifichi contatore.
61
8.5.7 Spostamenti ad inizio e fine documento ed ad un numero di riga specificata
62
8.5.8 Ricercare nel testo: stringhe
Vi consente di effettuare la ricerca di stringhe di testo. Il “classico” comando per la ricerca è:
Appena viene premuto il suddetto tasto il cursore si porta sull’ultima riga dello schermo e
l’utente sarà invitato ad inserire la stringa ricercata. Termineremo la redazione della nostra
stringa con un RETURN .
Vi appare in questo modo, in funzione di ricerca:
pippo
pluto
paperino
~
~
~
/pluto
/Steve Jobs
L’editor cercherà una stringa seguita da uno spazio e da un’altra stringa, tutti e tre sulla
stessa riga. La ricerca è, al solito, case sensitive e continua automaticamente dall’inizio fino al
raggiungimento del punto di partenza. Se dopo aver effettuato uan riceca su tutto il file, fino
al ritorno al punto corrente, la stringa non è stata trovata. Vi lo segnalerà in questo modo:
63
Una volta impostata la ricerca, la stringa ricercata rimane memorizzata nel corso dell’intera
sessione di lavoro. Non sarà dunque necessario reimpostare la ricerca ogni qualvolta si vuole
ricominciare la ricerca della stessa stringa: basterà a questo scopo impartire il comando:
Next, ha la stessa funzione di “n”, next, ma la ricerca si svolgerà, in questo caso, in inversamente
al senso del documento. Una volta arrivati ad inizio documento, la ricerca ricomincierà dal fondo
dello stesso.
Con il comando:
abbiamo già detto che la ricerca va dal punto corrente verso la fine del documento. Volendo,
però, iniziare la ricerca nell’altra direzione, possiamo usare il comando:
al posto del ’/’. Una volta impostate la ricerca con il punto interrogativo il significato dei
comandi “n” e “N” sarà invertito: “n” cercherà la prossima occorrenza all’indietro, “N” in
avanti.
La ricerca è, al solito, case sensitive . É possibile, in questo caso, richiedere una ricerca che
non sia case sensitive usando il comando:
:set ignorecase<RETURN>
:set noignorecase<RETURN>
64
8.6 I comandi Vi di cancellazione
8.6.1 Cancellazione di caratteri
Il comando:
cancella il carattere in trattamento da parte del cursore. È possibile anche cancellare più
caratteri facendo precedere “x” con il numero di caratteri da cancellare.
Del tipo:
3x
canacella il carattere alla sinistra del cursore, e come “x” può essere preceduto da un contatore.
Il comando:
sta per delete e si compone di una seconda parte che definisce un comando di movimento. “d”
realizza la cancellazione della parte di testo che va dalla posizione corrente del cursore fino alla
posizione che il cursore andrebbe ad assumere con il comando di movimento impostato.
Ad esempio:
La catena di caratteri:
usando il comando:
65
3w
3dw
2dw
uno
tre quattro cinque sei
66
il comando:
3dw
avremo:
uno quattro cinque sei
I comandi di movimento classicamente associati al comando di cancellazione sono in genere:
w, W
b, B
t
f
oppure i comandi di ricerca di tipo pattern:
/
?
67
8.6.5 Ripristino righe cancellate
Vi conserva dei registri numerici ; una specie di cache che contiene le parti di testo cancellata
dall’utente. In questo modo Vi, tramite il comando:
oppure
La memorizzazione temporanea nei registri numerici non viene alterata dai comandi di sposta-
mento; ciò significa che non solo una riga appena cancellata può essere ripristinata, ma ciò può
essere fatto in un punto diverso da quello dove le righe si trovavano originariamente.
Il comando “p” stampa le righe appena cancellate sotto la riga corrente, mentre il comando
“P” le stampa al di sopra. Nel caso di questi comandi, la funzione contatore classico non esiste.
Al contrario possono essere ripetuti n volte, del tipo:
pppppppp
68
Parte V
I processi
9 Gestione dei processi
I processi su Unix vengono gestiti da una serie di comandi specifici e permettono di interagire
con le applicazioni o i demoni lanciati sulla macchina.
olivio@mistral:~$ ps
PID TT STAT TIME COMMAND
288 p1 S 0:00.17 -bash
395 p1 S 0:00.02 su
olivio@mistral:~$
PID COMMAND %CPU TIME #TH #PRTS #MREGS RPRVT RSHRD RSIZE VSIZE
410 top 6.8% 0:00.56 1 18 20 720K 860K 1.16M 26.9M
406 TextEdit 0.0% 0:01.98 2 103 127 2.34M 8.50M 6.57M 220M
69
401 lookupd 0.0% 0:00.02 2 34 36 372K 1.05M 968K 28.1M
395 bash 0.0% 0:00.01 1 14 17 216K 1.23M 796K 27.1M
394 su 0.0% 0:00.01 1 18 44 172K 1.31M 2.00M 27.2M
358 mdimport 0.0% 0:00.85 4 65 96 1.35M 4.50M 3.35M 65.1M
• renice - la priorità del processo viene ri-passata in parametro ad un processo già attivo.
La gestione dei processi in Unix o comunemente scheduler organizza l’esecuzione dei processi in
base ad un certo livello di priorità. Tale priorità viene calcolata dal sistema in base al tipo di
processo, al suo comportamento e ad una variabile additiva che in questo tutorial chiameremo
nice .
I valori correnti di priorità e NICE per i processi possono essere visualizzati con il comando
ps con l’opzione -l (si veda la sezione dedicata al comando). Purtroppo non c’è uniformità sulla
gamma di valori per queste due variabili. La priorità potrebbe per esempio essere un intero di
due cifre variabile tra 0 e 39 o tra -20 e 20. L’unica certezza è che più alta è la priorità piú
lentamente viene eseguito il processo. Inoltre la variabile nice viene in qualche modo sommata
nel calcolo della priorità, per cui priorità e NICE elevati implicano esecuzione piú lenta del
processo.
Ad esempio:
Quando viene creato un nuovo processo, alla variabile NICE viene assegnato un valore inter-
medio (20 nel caso di gamma 0/39 o 0 nel caso -20/20) a meno che l’utente non richieda una
variazione con il comando nice.
Ad esempio: Se si desidera semplicemente ridurre il peso di un comando sul sistema si
preceda il comando con un nice senza alcuna specificazione numerica mentre se si desidera far
girare un processo alla minima priorità si potranno dare i comandi
70
$ nice -20 gcc titti.c & # Bourne shell
%nice +20 gcc titti.c & # C shell
olivio@mistral:~$ ps
PID TT STAT TIME COMMAND
288 p1 S 0:00.17 -bash
395 p1 S 0:00.03 su
421 p1 S+ 0:00.01 nano
424 p2 S 0:00.03 -bash
olivio@mistral:~$ sudo kill 421
Password:
olivio@mistral:~$ ps
PID TT STAT TIME COMMAND
288 p1 S 0:00.17 -bash
395 p1 S+ 0:00.03 su
424 p2 S 0:00.03 -bash
olivio@mistral:~$
In questo caso osserviamo la terminazione del processo nano con PID 421. Con un secondo ps
osserviamo l’assenza di nano tra i processi attivi.
71
Ad esempio:
Supponiamo di voler eseguire una lista di comandi in un momento preciso della giornata.
Scriveremo questi comandi in un documento di testo chiamato ad esempio “Programmazione”.
date >Stato.txt
who >>Stato.txt
ps >>Stato.txt
olivio@mistral:~$ atq
1 Thu Nov 2 08:15:00 2006
olivio@mistral:~$
Con il comando at assegnamo alle 8:15 l’esecuzione dello script Programmazione. Il risultato
sarà:
olivio@mistral:~$ atq
1 Thu Nov 2 08:15:00 2006
olivio@mistral:~$ date
Thu Nov 2 08:315:00 CET 2006
olivio@mistral:~$ cat Stato.txt
Thu Nov 2 08:315:00 CET 2006
olivio console Nov 1 19:16
olivio ttyp1 Nov 1 21:17
olivio ttyp2 Nov 1 22:37
72
PID TT STAT TIME COMMAND
288 p1 S 0:00.17 -bash
395 p1 S+ 0:00.04 su
470 p2 S 0:00.02 -bash
493 p2 S+ 0:00.00 -bash
olivio@mistral:~$ atq
olivio@mistral:~$
Ossrviamo che alla data specificata il comando è stato eseguito e che rieseguendo il comando
atq non viene più mostrato alcun lavoro da eseguire.
Per effettuare una programmazione ci serve un documento di programmazione cron per -ad
esempio- due comandi ripetitivi. Chiameremo questo documento ProgrammazioneCron.
* * * * * date >>/home/olivio/Cronometro.txt
30 12 1 1 * who
In questo caso eseguiamo ogni minuto il comando date con registrazione del risultato di esecu-
zione in un documento testo Cronometro.txt. Al trentesimo minuto della dodicesima ora del
primo giorno di ogni primo mese dell’anno vogliamo che venga eseguito questo comando.
73
Su 25 Aug 2006, 08:57:01 (UTC+0200)
Su 25 Aug 2006, 08:58:01 (UTC+0200)
Su 25 Aug 2006, 08:59:01 (UTC+0200)
olivio@mistral:~$
$ gcc titti.c
Dato in questo modo (in foreground) il controllo della shell tornerà all’utente solo al termine
della compilazione. Per ottenere l’esecuzione in background basta terminare il comando in
questo modo’:
74
$ ps
PID TT STAT TIME COMMAND
3354 00 S 0:13 -ksh (ksh)
3475 00 S 0:00 gcc titti.c
3482 00 R 0:00 ps
75
Parte VI
olivio@mistral:/$ id
uid=501(olivio) gid=501(olivio) groups=501(olivio), 81(appserveradm),
79(appserverusr), 80(admin)
• groups - allo stesso modo groups visualizza i gruppi ai quali appartiene l’utilizzatore
attivo.
olivio@mistral:/$ groups
olivio appserveradm appserverusr admin
olivio@mistral:/$ finger
Login Name TTY Idle Login Time Office Phone
olivio olivio *con 10:52 Sun 08:12
olivio olivio p1 Sun 18:09
olivio olivio p2 10 Sun 10:14
olivio olivio p3 2:02 Sun 10:23
11 Il documento passwd
Il documento passwd (collocato in /etc/passwd) si occupa di gestire e di recuperare utilizzatori
e gruppi di entità presenti sul sistema. Questo documento, presente su tutti i sistemi Unix,
non ha alcune effetto su Mac OS X. Chi non sia interessato al suo utilizzo può passare diret-
tamente alla sezione successiva dove descriveremo la gestione delle sue caratteristiche tramite
altre metodologie. passwd appare in questo modo:
76
nobody:*:-2:-2:Unprivileged User:/:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
lp:*:26:26:Printing Services:/var/spool/cups:/usr/bin/false
2. password (criptata)
5. descrizione
7. shell
passwd
Infine il comando pwck verifica infine la coerenza dei documenti /etc/passwd e /etc/shadow
77
11.2 Gestione dei gruppi
I gruppi vengono gestiti attraverso tre principali comandi:
Esempio:
In questo esempio nel nostro documento passwd sono state aggiunte queste linee:
fermi:x:1001:1001::/home/fermi:/bin/sh
In /etc/shadow :
fermi:$1$OiUYxLOq$97N3L1zEHtnjalbwceUyl0:13384:0:99999:7:::
In /etc/group :
physiciens:x:1001:fermi
In /etc/gshadow :
physiciens:!::fermi
78
12 Mac OS senza passwd ?
Come già precisato, Mac OS, pur includendo un documento passwd, questo non è sfruttato dal
sistema se non quando si è in modalità “single user“. Se si vogliono sfruttare queste funzionalità
bisognerà accedere al database NetInfo, un “repository” delle informazioni della local directory.
La maniera più semplice di aggiungere un utente o un gruppo al proprio sistema Mac OS è
l’utilizzo del comando niload:
Dopo aver creato il nuovo utente (in questo caso mariano), sarà necessario settare la pas-
sword. In questo caso useremo il comando ditto per creare la cartella home e settare i privilegi
correttamente:
E successivamente:
79
• read (r–) - Per un documento, il privilegio “lettura” permette di leggere il contenuto del
documento. Nel caso di una cartella ne permette l’esplorazione.
Quando si hanno tutti e tre i privilegi di accesso la sigla sarà “rwx” e via via per le varie
combinazioni delle tre lettere. Unix permette anche che gli utenti vengano definiti in gruppi, in
modo da rendere la gestione dei privilegi più semplice e immediata. Le entità presenti nell’uso
dei privilegi di accesso sono dunque:
• Proprietario - Il proprietario (owner) è quasi sempre l’utente che ha creato il file. Quasi
tutti i documenti e cartelle nella propria Home Directory avranno come proprietario
l’utente loggato in quel momento.
• Gruppo - Gli utenti admin su Mac OS X sono membri di gruppi chiamati “admin” e
“wheel”, mentre il super-utente è membro del gruppi chiamati admin e staff. Quasi tutti
i documenti e le cartelle sono assegnati a uno di questi tre gruppi.
• Altri - Altri (Others) si riferisce a tutti quegli utenti che non sono nè utenti nè fanno
parte di alcun gruppo.
olivio@mistral:~/Sites$ ls -l
total 8
drwxr-xr-x 5 olivio olivio 170 Jul 3 12:53 images
-rw-r--r-- 1 olivio olivio 5754 Jul 3 12:53 index.html
olivio@mistral:~/Sites$
80
Osserveremo la presenza di dieci caratteri nella prima colonna:
• Carattere 1: Otterremo :
1. - : è un documento ordinario
2. d : è una directory
3. l : si tratta di un alias simbolico
4. s : si tratta di un documento speciale
% ls -l /etc/passwd
• (rw-) questi tre caratteri descrivono i privilegi relativi al suo possessore. Nel nostro caso
potrà dunque leggere e scrivere il file ma non eseguirlo.
• (r–) questi caratteri descrivono i privilegi per tutti gli utenti appartenenti allo stesso
gruppo del proprietario. Nel nostro caso possibilità di lettura ma non di scrittura nè di
esecuzione.
• (r–) i restanti caratteri descrivono i privilegi per tutti gli altri utenti. Nel nostro caso
lettura ma non scrittura nè esecuzione.
81
13.1 chmod, chown, chgrp, umask : modificare i privilegi
Il comando che ci permette di cambiare i privilegi è chmod . Il comando chmod richede che gli
venga specificato il nuovo privilegio da assegnare e il documento o cartella al quale assegnarlo.
Per settare il privilegio è necessario che si usi la notazione indicata “rwx” per specificare il
tipo di privilegio e la cosidetta “ugo notation” per specificare dove è necessario applicarlo.
Per definire il tipo di cambiamento voluto è necessario usare il segno “+” per aggiungere un
privilegio, il segno “-” per rimuovere un privilegio e il segno “=” per assegnare il privilegio
direttamente. Ad esempio, volendo cambiare i privilegi al documento .shrc nella nostra cartella
personale possiamo usare questa stringa:
In questo esempio stiamo specificando un privilegio di lettura e scrittura per il gruppo senza
possibilità di esecuzione. Possiamo combinare privilegi multipli nei nostri comandi separando
ogni operazione con una virgola, ovviamente non usando alcuno spazio. Ad esempio:
setterà i privilegi “rwx” per il proprietario del documento “lollo”, mentre assegnerà al
gruppo privilegi “r-x” . I comandi chown , chgrp usano la stessa sintassi che chmod e servono
rispettivamente per cambiare il proprietario e il gruppo. Il comando umask ci servirà per
scegliere i privilegi di default di un documento alla sua creazione.
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 olivio olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$ chmod +x projet.java
olivio@mistral:~$ ls -l projet.java
-rwxr-xr-x 1 olivio olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$ chmod -x projet.java
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 olivio olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$
82
In questo caso aggiungiamo i privilegi di esecuzione al documento projet.java e successivamente
annulliamo questa modifica.
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 olivio olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$ chmod 777 projet.java
olivio@mistral:~$ ls -l projet.java
-rwxrwxrwx 1 olivio olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$ chmod 644 projet.java
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 olivio olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$
Configurazione in rwx per il proprietario, il gruppo e tutti gli altri utilizzatori del documento
projet.java. In questo caso osserviamo che i diritti vengono espressi su questa forma:
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 olivio olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$ sudo chown guest projet.java
Password:
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 guest olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$ sudo chown olivio projet.java
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 olivio olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 olivio olivio 3751 May 8 14:37 projet.java
83
olivio@mistral:~$ sudo chown guest:staff projet.java
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 guest staff 3751 May 8 14:37 projet.java
olivio@mistral:~$ sudo chown olivio:olivio projet.java
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 olivio olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$
Modifica del proprietario e del gruppo verso l’utente guest e il gruppo staff e inverso.
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 olivio olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$ sudo chgrp staff projet.java
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 olivio staff 3751 May 8 14:37 projet.java
olivio@mistral:~$ sudo chgrp olivio projet.java
olivio@mistral:~$ ls -l projet.java
-rw-r--r-- 1 olivio olivio 3751 May 8 14:37 projet.java
olivio@mistral:~$
Per rendere effettivo lo sticky bit viene utilizzato il comando chmod. Osserveremo che dopo
il carattere dedicato ai privilegi, vi sarà il carattere t al posto del classico x per identificare la
sua presenza.
84
olivio@mistral:~/Sites$ ls -l
total 8
drwxr-xr-x 5 olivio olivio 170 Jul 3 12:53 images
-rw-r--r-- 1 olivio olivio 5754 Jul 3 12:53 index.html
olivio@mistral:~/Sites$ chmod 1777 images/
olivio@mistral:~/Sites$ ls -l
total 8
drwxrwxrwt 5 olivio olivio 170 Jul 3 12:53 images
-rw-r--r-- 1 olivio olivio 5754 Jul 3 12:53 index.html
olivio@mistral:~/Sites$ cd images/
olivio@mistral:~/Sites/images$ su guest
Password:
guest@mistral:~/Sites/images$ ls -l
total 12
-rw-r--r-- 1 olivio olivio 2326 Jul 3 12:53 apache_pb.gif
-rw-r--r-- 1 olivio olivio 2829 Jul 3 12:53 macosxlogo.gif
-rw-r--r-- 1 olivio olivio 3698 Jul 3 12:53 web_share.gif
guest@mistral:~/Sites/images$ rm -f apache_pb.gif
rm: Operation not permitted.
In questo caso utilizziamo il comando chmod 1777 su una cartella inserendo lo sticky bit e
le autorizzazioni in “controllo totale”. Sarà poi impossibile all’utilizzatore guest di eliminare il
documento per il quale le autorizzazioni lo permettono; questo fino a quando lo sticky bit sarà
presente.
85
del firmware (4.1.7 o 4.1.8), disponibile per i modelli di ultima generazione di Mac. Attraverso
questo aggiornamento è possibile specificare una password per l’OpenFirmware.
Attenzione! Apple non supporta questa funzionalità, (come viene specificato nel TIL
n◦ 106292). In effetti, il solo modo per eliminare questa protezione, è di portare il
proprio Mac presso un centro di assistenza autorizzato fuori qualunque tipo di ga-
ranzia (anche AppleCare). Anche il reset della PRAM (opzione+command+P+R)
non risolverebbe il problema.
• Modalità sicurezza assoluta (full)- che chiede la password ad ogni avvio, prima della scelta
della partizione di boot.
• Modalità sicurezza normale (command) - che permette di partire senza alcuna password
sulla partizione scelta, senza permettere alcun altro coman- do a livello di firmware (quindi
alcuna possibilità di cambiare la partizione di boot senza la password)
• Modalità di non-sicurezza (none)- che non chiede alcuna password (è la modalità di
default)
1. Partire sotto OpenFirmware- Per avviare con OpenFirmware, spegnete la vostra macchi-
na, successivamente riaccendetela tenendo premuto option+command+O+F. Vi ritrover-
te di lı̀ a poco in modalità linea di comando con una tastiera di tipo QWERTY.
86
3. Specificare la modalità di sicurezza- Scrivete il comando:
per disattivare tutti i tipi di protezione. Basterà registrare e riavviare per verificare le
modifiche effettuate. Scrivete il comando:
reset-all
87
Parte VII
Le shells
La shell è il programma più importante in un sistema Unix. La shell è l’interfaccia con il sistema
Unix, una sorta di traduttore che interpreta i comandi dell’utente e li invia al kernel. Possiamo
definire la shell in questo modo:
• La shell è il programma che il kernel fa partire per primo, e in quanto tale è un processo
come lo può essere qualunque applicazione installata sulla macchina in questione. La
particolarità di tutto ciò sta nel fatto che il kenel può eseguire lo stesso programma
(dunque anche la stessa shell) per ogni utente loggato.
• Di fatto su ciascun sistema Unix è possibile aver installati diversi tipi di interpreti (quindi
diverse modalità di esecuzione di un comando). Tra questi ricordiamo sh, bash(ora default
su Mac OS X), csh, tcsh, zsh. Questi interpreti vengono denominati comunemente shells
in ambiente Unix. Fondamentalmente tutte le shell fanno lo stesso identico lavoro (magari
con diversa sintassi) ma alcune sono più evolute di altre, in sostanza perchè sono state
compilate per estendere le capacità delle shells più anziane.
Qualunque sia la shell utilizzata è importante ricordare che tutte le shells sono “case sensiti-
ve” e quindi non ci possiamo permettere di usare un comando con lettere maiuscole o minuscole
a nostro piacimento. LS,ls, Ls. LS sono quattro comandi diversi sia che si usi sh, csh, tcsh o
bash.
14 Convenzioni e utilizzo
Come già detto esistono diversi tipi di shells:
88
• sh (Bourne shell)
• csh (C shell)
• ...
Usualmente in Mac OS X la shell di default è bash (da Mac OS 10.2 in poi). Per ciascuna
shell esiste un documento di configurazione comune a tutti gli utilizzatori ,generalmente presente
in /etc, modificabile dall’amministratore del sistema e utilizzato ogni volta che la shell è lanciata.
Ogni shell di Mac OS X può essere lanciata in modalità diverse. A seconda dei casi, una
shell è lanciata automaticamente in una modalità piuttosto che in un’altra. Di per sé, quando
accediamo al terminale, la shell è lanciata in modo login . Ma questo stato può variare quando,
ad esempio, accediamo al terminale tramite la finestra di login:
>console
Queste considerazioni, ci torneranno utili nella sezione di personalizzazione della shell ; esiste la
possibilità di un documento di configurazione, per ognuna shell, per ciscun utilizzatore, presente
alla radice del repertorio di base dell’utente, modificabile dall’utente stesso e utilizzato dopo il
documento di configurazione comune. Ma vedremo questo più avanti.
14.1 Variabili
Un variabile è caratterizzata da un nome e un valore all’interno della shell. Per “settare”
una variabile è utilzzato il comando set. Scrivendo semplicemente “set” nel nostro terminale
otterremo una lista delle variabili settate di default nella nostra shel, su questa forma:
olivio@mistral:/$ set
BASH=/bin/bash
BASH_VERSION=’2.05b.0(1)-release’
...
Per designare il valore di una variabile si utilizza il suo nome preceduto dal carattere $
89
olivio@mistral:/$ echo HOSTNAME
HOSTNAME
olivio@mistral:/$ echo $HOSTNAME
cable-xx.xx.xx.xx.coditel.net
olivio@mistral:/$
olivio@mistral:/$ TOTO=1500
olivio@mistral:/$ echo $TOTO
1500
olivio@mistral:/$
• PS1 : prompt
90
14.2 Le espressioni regolari o caratteri “joker”
Le espressioni regolari (in inglese regular expression , termine poi spesso aabbreviato in regexp
regex o RE ) sono una sintassi attraverso la quale si possono rappresentare insiemi di strin-
ghe. Gli insiemi caratterizzabili con espressioni regolari sono anche detti linguaggi regolari (e
coincidono con quelli generabili dalle grammatiche regolari e riconoscibili dagli automi a stati
finiti).
Di fatto la nostra shell Unix si comporta come un “automa” quando bisogna indicarle gruppi
di documenti o cartelle. Questa tecnica tramite espressioni regolari si rivela molto potente anche
in ambiti più vasti.
In Unix la sintassi base delle espressioni regolari è ora definita obsoleta dal POSIX, ma
resta ancora molto usata a causa della compatibilità con gli anziani sistemi Unix. La maggior
parte delle utility che usano le espressioni regolari (grep è una di queste) usano in ogni caso il
sistema Unix di default. In ogni sintassi, la maggior parte dei caratteri sono considerati come
letterali : una “a” corrisponde ad “a”, la catena di caratteri “bc” trova sempre bc ... Questa
corrispondenza non è rispettata per alcuni caratteri detti “meta”:
• [ ]
- Trova un singolo carattere contenuto nelle parentesi. Ad esempio, [abc] trova o una “a”,
“b”, o “c”.
• [a-z]
- è un intervallo e trova ogni lettere minuscola dell’alfabeto. Possono esserci casi misti:
[abcq-z] trova a, b, c, q, r, s, t, u, v, w, x, y, z, esattamente come [a-cq-z]. Il carattere ’-’ è
letterale solo se è primo o ultimo carattere nelle parentesi: [abc-] o [-abc]. Per trovare un
carattere ’[’ o ’]’, il modo più semplice è metterli primi all’interno delle parentesi: [][ab]
trova ’]’, ’[’, ’a’ o ’b’.
• [^]
- Trova ogni singolo carattere non incluso nelle parentesi. Ad esempio,
[^abc ]
91
trova ogni carattere diverso da “a”, “b”, o “c”.
[^a-z]
trova ogni singolo carattere che non sia una lettera minuscola. Come sopra, questi due
metodi possono essere usati insieme.
• $
- Corrisponde alla fine di una riga (o ad una riga, quando usato in modalità multilinea)
• ^
- Corrisponde all’inizio di una riga (o ad una riga, quando usato in modalità multilinea)
• \( \)
- Definisce una “sottoespressione marcata”. Ciò che è incluso nell’espressione, può essere
richiamato in seguito.
• \n
- Dove n è una cifra da 1 a 9; trova ciò che la nesima sottoespressione ha trovato. Tale
costrutto è teoricamente irregolare e non è stato adottato nella sintassi estesa delle regexp.
• *
- Un’espressione costituita da un singolo carattere seguito da “*”, trova zero o più copie
di tale espressione. Ad esempio, “[xyz]*” trova “”, “x”, “y”, “zx”, “zyx”, e cosı̀ via. Ad
esempio:
\n*
Dove n è una cifra da 1 a 9, trova zero o più iterazioni di ciò che è la nesima sottoespressione
ha trovato. Ad esempio:
\(a.\)c\1*
92
’’\(’’ e ’’\)’’
seguita da “*” non è valida. In alcuni casi, trova zero o più ripetizioni della stringa che
l’espressione racchiusa ha trovato. In altri casi, trova ciò che l’espressione racchiusa ha
trovato, seguita da un letterale “*”.
• \{x,y\}
- Trova l’ultimo “blocco” almeno x volte e non più di y volte. Ad esempio,
a\{3,5\}
Alcuni esempi:
.atto
93
14.3 Pipes
Il carattere detto pipe | tra due comandi permette di eseguire il primo comando inviando il
suo risultato di esecuzione (come parametro di entrata) al secondo.
ls | sort
La lista dei documenti della cartella su cui si sta lavorando è inviata al comando sort per una
selezione in ordine alfabetico e successiva visualizzazione.
• redirigere i risultati in uscita verso un documento in aggiunta alla fine del documento
usanto i caratteri “>>” tra il comando e il nome del documento.
• Tramite il carattere “<” si ottengono i dati richiesti “verso la tastiera” del il comando a
partire dal contenuto del documento.
In questo caso salviamo i risultati del comando date nel documento uscita.txt. Nel secondo
invece aggiungiamo i risultati del comando who alla fine del documento uscita.txt.
Ossevando poi il contenuto del documento uscita.txt tramite il comando cat, osserveremo
che l’operazione di redirezione è stata effettuata correttamente :
94
14.5 Alcuni esempi sull’uso delle convenzioni
• Il carattere speciale per eccellenza è lo spazio. Interpretare lo spazio come nel sistema
operativo grafico porta sotto il terminale sempre ad un errore, specie nell’indicare una
directory o un file che ne contengono parecchi. Scrivere:
% cd nuova_cartella
difficilmente porterà nella directory nuova cartella. Per far interpretare al terminale il
comando corretto è necessario scrivere:
% cd ’’nuova cartella’’
oppure
% cd nuova\ cartella
# ps -ax
# ps -ax >lista.txt
non mostrerà nulla a video poichè l’output viene trascritto nel file lista.txt nella directory
corrente.
95
14.6 Il comando test
Il comando test serve per la comparazione di espressioni. Questo può ritornare spesso utile
nell’uso quotidiano della shell o quando vengono utilizzati determinate strutture di iterazione
o comando , che vedremo più avanti in questo tutorial. Elenchiamo qui di seguito con che
modalità è necessario usare il comando e aggiungiamo alcuni esempi di utilizzo.
Operatore −
-d E E cartella
-e E E esiste
-r E E leggibile
-s E E di taglia non nulla
-w E E può essere modificato / scritto
-x E eseguibile
... ...
Operatore −
E catena di caratteri non vuota
E1 = E2 E1 uguale a E2
E1 =! E2 E1 diverso da E2
96
Operatore −
E catena di caratteri non vuota
E1 -eq E2 E1 uguale a E2
E1 -ne E2 E1 diverso da E2
E1 -ge E2 E1 più grande o uguale a E2
E1 -gt E2 E1 strettamente più grande che E2
E1 -le E2 E1 più piccolo o uguale a E2
E1 -lt E2 E1 strettamente più piccolo che E2
• Operatori booleani :
Operatore −
(E) E è vero
!E E è falso
E1 -a E2 E1 e E2
E1 -o E2 E1 o E2
Qualche esempio:
olivio@mistral:~/Scripts$ var1=1000
olivio@mistral:~/Scripts$ test $var1 -eq 1000
olivio@mistral:~/Scripts$ echo $?
0
olivio@mistral:~/Scripts$ test $var1 -gt 1000
olivio@mistral:~/Scripts$ echo $?
1
olivio@mistral:~/Scripts$
97
olivio@mistral:~/Scripts$ test -e /etc/group
olivio@mistral:~/Scripts$ echo $?
0
olivio@mistral:~/Scripts$ test -e /etc/groupp
olivio@mistral:~/Scripts$ echo $?
1
olivio@mistral:~/Scripts$
15 Scripts shell
Uno script shell è un documento contenente dei comandi in linguaggio shell (documento testo
reso eseguibile eseguendo il comando chmod +x script shell, descritto in altra sezione in questo
tutorial).
La sintassi da rispettare nella redazione degli script é:
98
• # - per effettuare un commento.
• per usare le variabili : var=valore oppure var=”valore” se questo valore comporta degli
spazi.
• per recuperare degli elementi dalla linea di comando si usano i codici 0,1, 2,3, ... nell’ordine
di scrittura includendo il nome del comando usato.
Esiste, poi, un codice espresso tramite $? che permette il recupero del risultato di esecuzione
dell’ultimo comando. Il risultato booleano “0” alla fine del comando ci indica un’esecuzione
senza anomalie e con uscita valida.
olivio@mistral:~$ who
olivio console Oct 31 08:21
olivio ttyp1 Oct 31 13:55
olivio@mistral:~$ echo $?
0
olivio@mistral:~$
olivio@mistral:~$ rm /etc/
rm: /etc/: is a directory
olivio@mistral:~$ echo $?
1
olivio@mistral:~$
99
15.1 Istruzioni di strutturazione, if, case, for, while
Le istruzioni di strutturazione sono fondamentali non solo negli ambienti Unix; sono una parte
vitale della storia informatica. Nel nostro terminale questo genere di istruzioni sono utilizzate
nativamente (come si può capire dalle origini C del terminale). Detti anche conditional state-
ments , questi sono delle richieste fatte all’elaboratore per effettuare un’esecuzione basata su
una precisa condizione. In questo paragrafo ne vedremo le diverse forme seguite da esempi.
if
comando
then
...
else
...
fi
Quando la shell trova un if (dichiarata come parola riservata) attende un dato di compa-
razione (ad esempio x = 0) e valuta la condizione. Se la condizione è vera, la struttura
blocca e esegue le istruzioni sotto la parola chiave then . In caso contrario sceglie le
istruzioni sotto la parola chiave else .
Esempio :
Queste istruzioni indirizzano la lista dei documenti della cartella corrente verso grep alla
ricerca del nome del documento in parametro. Avremo la visualizzazione di uno dei due
100
messaggi a seconda del risultato di grep (che in questo caso sarà 0 se trovato, non-0 se
inesistente).
Proviamo ad usarlo ora:
case variabile in
v1 | v2 | ... | vn)
...;;
w1 | w2 | ... | wn)
...;;
esac
L’istruzione case si differenzia dalla precedente istruzione poichè permette di scegliere tra
più di due blocchi di codice. Ciò è dettato dal fatto che l’espressione condizionale è di
tipo ordinale e quindi si potranno seguire tante strade differenti quanti sono i valori del
tipo ordinale.
Esempio:
101
echo ’’$numero divisibile per 3’’;;
*)
echo ’’$numero non divisibile per 3’’;;
esac
olivio@mistral:~$ ./Scriptcase
un numero tra 0 e 9 prego
3
3 divisibile per 3
olivio@mistral:~$ ./Scriptcase
un numero tra 0 e 9 prego
5
5 non divisibile per 3
olivio@mistral:~$
In questo caso la shell risponde correttamente: 3 divisibile per se stesso, 5 non divisibile
per 3.
for
variabile
in
lista
do
...
done
102
for è un’istruzione di tipo ciclico come anche while . Sono delle strutture che si diffe-
renziano non poco per quanto riguarda sintassi e logica di esecuzione. L’istruzione for
richiede la specificazione del numero di ripetizioni da effettuare. L’istruzione for richiede
la specificazione del numero di ripetizioni da effettuare. for assegna inizialmente al conta-
tore il valore specificato ed esegue il blocco di istruzioni incrementando o decrementando
il valore del contatore fino a raggiungere il valore indicato per la fine delle iterazioni.
Esempio:
rm -f $2
for file in $1
do
head -n $3 $file >> $2
done
while
comando
do
...
done
103
Il ciclo while si differenzia dal ciclo for per il tipo di espressione di controllo e per la
valutazione della stessa che avviene all’inizio di ogni iterazione. L’espressione di uscita dal
trattamento dell’instruzione comando deve essere di tipo booleano e l’esecuzione del codice
prosegue fintanto che l’espressione è verificata, ovvero restituisce true . L’esecuzione del
codice termina quando l’uscita del comando assume valore false .
Esempio:
In pratica lo script si ferma unicamente quando non troverà il documento passato in parametro
“Scriptfor”. Nell’esempio abbiamo soppresso il documento da un altro terminale e abbiamo
ottenuto la disattivazione del nostro script.
104
Parte VIII
• eseguibili
• biblioteche
• documenti di configurazione
• documentazione
• documenti di dati
• esempi
In definitiva questo genere di pacchetto non ha una procedura standard per l’installazione ed
è quasi sempre necessario consultare i documenti ottenuti subito dopo la decompressione. Di
fatto i pacchetti GNU standarizzano questa procedura rendendo la vita più facile all’utilizza-
tore inesperto. Sette passi, generalmente, sono necessari per una corretta installazione di un
pacchetto GNU:
105
• restaurazione delle componenti tar
• apertura di una shell sulla radice della cartella di restaurazione del passo 3
A titolo di esempio descriviamo l’installazione delle librerie Mesa OpenGL versione 6.5 :
Nel nostro esempio abbiamo tre documenti principali:
1. MesaDemos-6.5.tar.gz
2. MesaGLUT-6.5.tar.gz
3. MesaLib-6.5.tar.gz
olivio@mistral:~/OpenGL$ ls
MesaDemos-6.5.1.tar.gz MesaGLUT-6.5.1.tar.gz MesaLib-6.5.1.tar.gz
olivio@mistral:~/OpenGL$ gzip -d *.gz
olivio@mistral:~/OpenGL$ ls
MesaDemos-6.5.1.tar MesaGLUT-6.5.1.tar MesaLib-6.5.1.tar
olivio@mistral:~/OpenGL$
106
olivio@mistral:~/OpenGL$ ls -l
total 30892
drwxr-xr-x 16 olivio olivio 544 Nov 5 22:23 Mesa-6.5.1
-rw-r--r-- 1 olivio olivio 4372480 Nov 5 22:12 MesaDemos-6.5.1.tar
-rw-r--r-- 1 olivio olivio 2682880 Nov 5 22:13 MesaGLUT-6.5.1.tar
-rw-r--r-- 1 olivio olivio 24576000 Nov 5 22:14 MesaLib-6.5.1.tar
olivio@mistral:~/OpenGL$
olivio@mistral:~/OpenGL$ cd Mesa-6.5.1/
olivio@mistral:~/OpenGL/Mesa-6.5.1$ ls
Makefile Makefile.mgw bin descrip.mms include progs vms
Makefile.DJ Makefile.orig configs docs mms-config. src windows
olivio@mistral:~/OpenGL/Mesa-6.5.1$
olivio@mistral:~/OpenGL/Mesa-6.5.1$ make
107
...
Then type ’make <config>’ (ex: ’make linux-x86’)
(ignore the following error message)
make: *** [configs/current] Error 1
olivio@mistral:~/OpenGL/Mesa-6.5.1$
É dunque possibile l’installazione e la compilazione del pacchetto MESA per diverse piatta-
forme. Nel nostro caso sceglieremo darwin-x86ppc. La compilazione occuperà a pieno schermo
il nostro terminale effettuando tutte le tappe necessarie. Questa operazione potrà prolungarsi
per più di qualche minuto a seconda della complessità del pacchetto.
108
Parte IX
Unix e le reti
17 Il TCP/IP
Quando ci vogliamo collegare con il nostro terminale o con la nostra GUI a qualunque servizio
di rete, stabiliamo un collegamento a livello di applicazione. Questo livello è detto di trasporto.
A questo livello il protocollo TCP mette in coda i messaggi delle applicazioni (le applicazioni
che accedono ai servizi di rete) e li trasmette sotto forma di pacchetti. A livello di rete il
protocollo IP decide dove instradare i pacchetti per trasmettere effettivamente i messaggi da
un computer all’altro. Il settaggio di questi due protocolli TCP e IP avviene, nel terminale,
tramite una serie di comandi specifici. Vediamo quali.
17.1 Consultazione
• ifconfig - permette di consultare la configurazione ip attuale. La risposta a un tale
comando è del genere:
109
Nell’esempio abbiamo chiesto quale sia la configurazione dell’interfaccia en0 attuale. Ov-
viamente diverse interfacce sono presenti su ogni macchina; di default ifconfig mostra a
schermo tutte le interfacce se non ne viene specificata una in argomento. In questo caso
osserveremo anche la presenza di un’interfaccia lo0 detta interfaccia di loopback e che ci
permette di visionare il circuito al quale il nostro indirizzo ip è associato.
• hostname - ci permette di consultare il nome della macchina sulla quale stiamo operando.
olivio@mistral:/$ hostname
mistral.local
olivio@mistral:/$
110
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 50.591/50.822/51.045/0.190 ms
olivio@mistral:/$
• nslookup - permette di inviare delle richieste sul server DNS comfigurato. Per testare ad
esempio il server DNS:
olivio@mistral:/$ nslookup
> powerserver
Server: 192.168.1.1
Address: 192.168.1.1#53
18 SSH
SSH è l’acronimo di Secure Shell ed è un protocollo che permette di inviare comandi sicuri e
criptati a un’altra macchina sulla rete. Generalmente è molto utile e potente quando si vuole
controllare una macchina a distanza proprio come se l’utente in questione ci stesse davanti. La
sintassi per il suo utilizzo é:
111
olivio@mistral:~$ ssh -l olivio 192.168.2.1
The authenticity of host ’192.168.2.1 (192.168.2.1)’ can’t be established.
RSA key fingerprint is 74:ea:09:04:46:e5:8f:50:26:93:9c:38:d9:61:d2:e6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ’192.168.2.1’ (RSA) to the list of known hosts.
Password:
Last login: Thu Jan 8 18:00:36 1970 from 192.168.2.3
Welcome to Darwin!
stp25-1-82-226-151-135:~ olivio$
Se vogliamo inviare alla macchina remota un singolo comando senza dover effettuare tutta
la procedura di logging in e logging out possiamo usare il comando come da esempio:
In questo caso stiamo eliminando un documento sulla macchina remota. Un’altra sintassi
dello stesso comando può essere:
112
La funzionalità più interessante è quella di poter distaccare una sessione lasciandola nello
stato corrente e poterla riattaccare in seguito.
Utilizzare screen è abbastanza intuitivo. Per inizializzare una sessione multipla sarà neces-
sario lanciare il gestore di screen attraverso il comando:
Il risultato del comando non sarà altro che uno schermo vuoto. In realtà screen è attivo e
operante. Per creare un nuovo terminale digiteremo:
CTRL+A c (c sta per create).
Anche in questo caso niente di straordinario apparirà sullo schermo. Al fine di permettervi
di vedere qualcosa di concreto provate a digitare il comando ls. In questo caso stiamo chiedendo
il listaggio della directory corrente nel terminale numero due.
A questo punto digitiamo CTRL+A [space]. Questa combinazione ci farà passare al termi-
nale successivo (in questo caso il numero 1). Ci ritroveremo di fronte al nostro primo terminale
completamente indipendente dal terminale numero due creato in precedenza. Volendo ripassa-
re al terminale precedente useremo la combinazione CTRL+A [DELSPACE]. In questo modo
sarà facile passare da un terminale all’altro. Non da ultimo eviteremo di aprire più finestre e di
creare piu processi futili . Ogni terminale creato avrà un numero e sarà possibile il passaggio da
un terminale all’altro usando il comando CTRL+A [numero del terminale]. Nel nostro esempio
usando la combinazione CTRL+A 1 o CTRL+A 2 passeremo dal terminale 1 al terminale 2 a
seconda delle esigenze.
Quando la nostra utility screen sarà attiva potremo distaccarla e lasciarla nello stato voluto.
La combinazione da usare sarà CTRL+A d (d sta per detach). Questa combinazione dovrebbe
mostravi il contenuto del terminale nel quale avete lanciato screen e fare apparire un messaggio
del genere confermandovi l’operazione:
La nostra sessione è dunque distaccata. Osservando i processi attivi ci renderemo conto che
quelli in esecuzione nella shell virtuale non sono stati terminati. Ad esempio:
113
olivio 5359 0.0 0.8 2964 1364 ? S 13:34 0:00 SCREEN -l
olivio 5360 0.0 1.0 3080 1672 pts/14 S 13:34 0:00 _ /bin/bash
olivio 5374 1.6 1.0 3460 1680 pts/14 S 13:36 0:00 | _ mutt
olivio 5365 0.0 1.0 3072 1644 pts/15 S 13:34 0:00 _ /bin/bash
5359.pts-7.mistral (Detached)
1 Socket in /var/run/screen/S-olivio.
[olivio@mistral] olivio $
In questo caso osserveremo l’esistenza di uno screen attivo (ma distaccato). Per poterlo
riattivare useremo il comando:
screen -dR
Questo tipo di approccio può essere sbagliato e pericoloso, poiché sul nostro Mac OS X sshd
permette di default l’accesso basandosi su un’ autenticazione effettuata
114
dalla configurazione di Directory Access.
Se Directory Access è configurato, ad esempio, sulla Active Directory tutti gli utenti con un
valido account sulla Active Directory potrebbero effettuare un login SSH sul nostro computer.
Come fare allora ad avere accesso al nostro servizio di SSH senza avere più utenti che lo
usino ? Tanto per cominciare diciamo che Mac OS X - dalla versione 10. 2- usa un’ architettura
modulare di autenticazione chiamata PAM.
PAM ( (Pluggable Authentication Modules ) gestisce ogni tipo di autenticazione sulla nostra
macchina come peraltro i cambiamenti di password o le autorizzazioni sui file. Le applicazioni,
in questo modo, invece di implementare tutto ciò nel loro codice fanno affidamento su dei moduli
PAM configurati dall’amministratore della macchina. Per esempio, se vogliamo effettuare un’
autenticazione LDAP usando PAM avremo bisogno di usare il modulo
pam_ldap
Questo modulo conosce tutto il necessario sulla autenticazione di ldap; le applicazioni che
usando ldap fanno quindi affidamento su questo modulo che gestirà gli account per esse. Mac
OS X integra un modulo chiamato
pam_securityserver
che serve per autenticare ogni servizio presente nella Directory Access. Tra questi anche SSH. Il
servizio SSH (sshd) è compatibile PAM e usa un modulo specifico che troveremo nella directoy
/etc/pam.d/sshd
nano /etc/pam.d/sshd
115
auth required pam_deny.so
account required pam_permit.so
password required pam_deny.so
session required pam_permit.so
Focalizziamoci sui diversi moduli di autenticazione (dunque tutti quelli comincianti per
auth). PAM consulterà tutti questi moduli nell’ordine; si fermerà unicamente a seconda della
parola nella seconda colonna del documento (required o sufficent) oppure nel caso il modulo
abbia successo o fallisca.
• pam_login
É abbastanza semplice. Avrà sempre successo se l’esistenza di /etc/nologin sarà verificata
(può essere utile per evitare dei login durante la manutenzione del sistema)
• pam_securityserver
Se fallisce questo modulo PAM procederà a
pam_unix
Per evitare dunque questo potenziale pericolo di intrusione mettiamo in commento questa
linea aggiungendo un # all’inizio.
in questo modo gli amministratori di sistema avranno ancora accesso al protocollo SSH in
locale grazie alla linea pam-unix, ma gli altri utenti avranno l’accesso negato.
19 Samba
Samba è un protocollo (detto anche smb ) che permette la condivisione di file e stampanti e
di ottenere interoperabilità tra Linux, Unix, Mac OS X e Windows. Si tratta di un software
che può girare su piattaforme che non siano Microsoft Windows, per esempio, UNIX, Linux,
Mac OS X e altri sistemi operativi. Quando correttamente configurato, permette di interagire
116
con client o server Microsoft Windows come se fosse un file e print server Microsoft agendo da
Primary Domain Controller (PDC) o come Backup Domain Controller, può inoltre prendere
parte ad un dominio Active Directory.
• nmbd - demone che permette l’implementazione dei servizi Netbios (protocollo TCP/IP)
e l’ “Esploratore di risorse ” WINS
19.2 Configurazione
Principalmente Samba si basa su un documento di configurazione smb.conf presente nella car-
tella etc. Il documento Samba si presenta sotto la forma di diverse linee che si possono mettere
in commento o attivare a seconda delle esigenze.
• - Commento
• ; - Linea attiva
117
Questo nella sezione contraddistinta da apposita linea di demarcazione:
[global]
## Browsing/Identification ###
....
Nella sezione home definiremo l’accesso alle cartelle di base degli utilizzatori.
[homes]
comment = Repertoires de base
browseable = yes
valid users = %S
writable = yes
create mask = 0644
directory mask = 0755
olivio@mistral:~$ testparm
Load smb config files from /private/etc/smb.conf
Processing section "[homes]"
Processing section "[printers]"
118
Loaded services file OK.
Invalid combination of parameters for service homes.
Invalid combination of parameters for service printers.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
# Global parameters
[global]
dos charset = 437
unix charset = UTF-8-MAC
display charset = UTF-8-MAC
server string = mistral
auth methods = guest, opendirectory
passdb backend = opendirectorysam, guest
guest account = unknown
defer sharing violations = No
os level = 8
brlm = Yes
printer admin = @admin, @staff
vfs objects = darwin_acls
[homes]
comment = User Home Directories
read only = No
browseable = No
[printers]
path = /tmp
printable = Yes
browseable = No
olivio@mistral:~$
119
19.4 Lan manager e Smb
Il comando:
mount -t smbfs
ci permetterà il mounting delle risorse condivise di un server Lan Manager all’interno del
sistema.
Esistono dei problemi di accesso alle risorse condivise sui server Windows NT, 2000 ou
2003 se questi esigono il trasferimento delle informazioni di login. Sarà necessario in questo
caso usare delle strategie specifiche per attivare / disattivare / configurare le entrate relative a
questi aspetti in:
• Parametri Windows
• Parametri di sicurezza
• Strategie locali
• Opzioni di sicurezza
Tutto questo sia a livello locale sul server considerato sia a livello di dominio.
120
A Attributi dei metadati
Attributo Descrizione
kMDItemAttributeChangeDate Data e ora dell’ultimo cambiamento al metadata.
kMDItemAudiences Il pubblico verso il quale il file è orientato
kMDItemAuthors L’autore del documento
kMDItemCity L’origine del documento
kMDItemComment Commenti
kMDItemContactKeywords Contatti associati al documento
kMDItemContentCreationDate La data di creazione
kMDItemContentModificationDate Data dell’ultima modifica effettuata
kMDItemContentType Tipo di documento. com.adobe.pdf per i PDF
kMDItemContributors I ”partecipanti” al documento
kMDItemCopyright Copyright
kMDItemCountry Paese di origine del documento
kMDItemCoverage Collocazione geografica
kMDItemCreator L’applicazione che ha creato il documento
kMDItemDescription Descrizione del documento
kMDItemDueDate Data del documento rappresentato
kMDItemDurationSeconds Durata (in secondi) del documento
kMDItemEmailAddresses Indirizzi e-mail associati
kMDItemEncodingApplications Il nome dell’applicazione che ha codificato il documento
kMDItemFinderComment Commenti Finder del documento
kMDItemFonts I fonts usati nel documento
kMDItemHeadline Sinossi del documento
kMDItemInstantMessageAddresses Nicknames associati al documento
kMDItemInstructions Instruzioni speciali associate al documento
kMDItemKeywords Parole chiave
kMDItemKind Tipo di documento
kMDItemLanguages Lingua
kMDItemLastUsedDate Data e ora di ultima apertura del documento
kMDItemNumberOfPages Numero di pagine
121
Attributo Descrizione
kMDItemOrganizations Organizzazione creatrice
kMDItemPageHeight Larghezza in punti del documento
kMDItemPageWidth Altezza in punti del documento
kMDItemPhoneNumbers Numeri di telefono associati al documento
kMDItemProjects Nome dei progetti associati al documento
kMDItemPublishers Editore del documento
kMDItemRecipients Recipiente del documento
kMDItemRights Link sui diritti del documento
kMDItemSecurityMethod Crittografia usata dal documento
kMDItemStarRating Valutazione (in un doc iTunes sono le ”stelle”)
kMDItemStateOrProvince Stato o provincia di origine
kMDItemTitle Titolo
kMDItemVersion Versione
kMDItemWhereFroms Provenienza del documento (e-mail o numeri di telefono)
122