Laboratorio di Internet I Il sistema operativo Linux

Università di Roma Sapienza
Sede di Latina
25 Febbraio 2014
Laboratorio di Internet I
Il sistema operativo Linux
Luca Chiaraviglio
Ingegneria
dell’Informazione
Outline
Breve storia di Linux
Concetti base
Comandi principali
Script di shell
Script AWK
Come accedere alle postazioni di laboratorio
Scaricamento di programmi aggiuntivi
Linux: come e quando
Figlio del sistema operativo UNIX
UNIX: svilippato nel 1969 da AT&T e Bell Laboratories
(principalmente Ken Thompson e Dennis Ritchie)
nell’ambito di un progetto di ricerca per la simulazione
dei movimenti di stelle e pianeti.
Linux: svilippato nel 1991 da Linus Torvalds per
funzionare sulle nuove macchine commerciali i386.
Architettura di kernel monolitico.
Il kernel è liberamente disponibile e modificabile.
Ampiamente utilizzato in ambito accademico e
industriale.
Unix: una grande famiglia
Login
Si accede al sistema mediante una username e una
password.
Diversi utenti associati ad una stessa macchina
Utente privilegiato: root. Consente di operare modifiche
amministrative al sistema.
Dopo il login, il sistema esegue un programma chiamato
shell.
Con interfaccia grafica, la shell è disponibile cliccando
sull’icona del terminale.
Ciascun programma in esecuzione è chiamato processo.
Il prompt dei comandi
Una volta aperto il terminale, l’utente può eseguire dei
comandi.
L’utente normale (non privilegiato) può eseguire solo un
sottoinsieme di comandi.
L’utente root (privilegiato) può eseguire l’intero set dei
comandi.
$ -> utente non privilegiato
# -> utente privilegiato
Funzionamento della shell
Sono disponibili diversi tipi di shell, ma la più utilizzata in
ambito Linux è la shell bash.
Dalla shell è possible digitare il nome dei comandi
assieme ai loro parametri, eseguirli, ed ottenere il
risultato.
I comandi generalmente stampano un output nella shell.
Qualunque comando può essere interrotto prima della
fine della sua esecuzione premendo Ctrl-c.
Tipi di file
File Ordinari, usati per documenti di testo, input file per i
programmi e anche programmi eseguibili
File di directory, ovvero contenitori di altri file.
File speciali, utilizzati per la comunicazione fra diversi
processi, e per la comunicazione fra il processo e I
dispositivi di hardware.
I file di directory possono contenere al loro interno altre
directory, costituendo una gerarchia.
Tipi di file e gerarchia
Root
directory (/)
bin
home
File di cartelle
dev
Chiaraviglio
A
B
File Speciali
File Ordinari
Path name & Directory
Per individuare un file all’interno del file sistema si usa un
pathname
Un pathname è una lista di cartelle separate da “/”
Esempio di pathname assoluto
/home/chiaraviglio/B
Esempio di pathname relativo
/chiaraviglio/B
Directory corrente: “.”
Directory padre della directory corrente: “..”
Navigazione nella gerarchia dei file
Per conoscere il pathname assoluto della directory
corrente
pwd
(present working directory)
Per cambiare directory si usa il comando
cd
(change directory)
cd -> per tornare alla directory home
cd .. -> per tornare alla directory superiore
cd / -> per andare alla directory root
cd ./chiaraviglio -> sono nella directory home e voglio
andare nella directory “chiaraviglio”
cd /dev -> per andare nella directory /dev
Visualizzazione del contenuto di una cartella
Per visualizzare il contenuto di una cartella, si usa il
comando
ls
Digitando “man ls” otteniamo la descrizione del comando
e le relative opzioni.
Alcune opzioni:
ls –l -> stampa informazioni più dettagliate
ls –a -> stampa anche I file nascosti
Esempio di output ls –l
serverone@serverone-PowerEdge-T320:~$ ls -l
total 556
drwxr-xr-x 34 serverone serverone
4096 Feb
drwxr-xr-x
3 serverone serverone
4096 Oct
drwxr-xr-x
2 serverone serverone
4096 Oct
drwx------ 107 serverone serverone
4096 Feb
4
8
8
4
15:03
17:56
17:03
13:51
Desktop
Documents
Downloads
Dropbox
Tree Directory di Linux
Gestione dei file e directory
Creazione di directory
mkdir <nome_directory>
Copia dei file di una directory
cp <directory_sorgente> <directory_destinazione>
Copia di file in una directory
cp <file 1> <file 2> <directory di destinazione>
Rimozione di una directory
rmdir <directory>
Rimozione di un file
rm <file>
Manipolazione dei file
Stampare sulla shell il contenuto di un file
cat <file>
Stampare sulla shell il contenuto più file
cat <file 1> <file 2> … <file N>
Contare il numero di linee, parole e caratteri su un file:
wc <file>
(wc non vuol dire “bagno” ma “word count” J)
Con i comandi “man cat” e “man wc” possiamo ottenere
informazioni sulle possibili opzioni.
Alcune opzioni interessanti:
cat –n <file> -> stampa il file con le righe numerate
wc –l <file> -> stampa solo il numero di righe
Visualizzazione dei file
Oltre al comando cat, è possibile visualizzare parte di un
file.
head -<numero di righe> <file>
Stampa soltanto le prime <numero di righe> di <file>
Esempio: head -5 /etc/passwd
tail -<numero di righe> <file>
Stampa soltanto le ultime <numero di righe> di <file>
tail -10 /etc/passwd
Sicurezza su Linux
Semplice sistema di sicurezza basato su permessi.
Sistema multi-utente: più utenti attivi sulla stessa
macchina.
Quattro classi di utente predefinite:
- root: classe degli utenti privilegiati
- Owner: utente che attualmente possiede il file
- Group: classe di utenti che condividono l’accesso di
gruppo al file
- World: tutti gli utenti che non appartengono alle altre
categorie.
I permessi
Ogni utente possiede dei permessi su un file.
Possibili permessi:
-r: lettura (Read)
-w: scrittura (Write)
-x: esecuzione (eXectution)
Tramite il comando ‘ls –l <nome_del_file>’ otteniamo I
permessi associati al file.
Esempio: ls -l /etc/passwd
-rw-r--r-- 1 root root 2245 Feb 5 14:26 /etc/passwd
Tipo di file e permessi
Il proprietario è “root” (terzo campo), e il gruppo
associato al file è quello “root” (quarto campo).
Modifica dei permessi
Sovente occorre modificare i permessi di un file.
Si utilizza il comando chmod
chmod <nuovi_permessi> <file>
I permessi si impostano secondo il seguente formato:
<permessi proprietario> <permessi gruppo> <permessi mondo>
r w x
0/1 0/1 0/1
r w x
0/1 0/1 0/1
r w x
0/1 0/1 0/1
Si associa uno “0” se il permesso è disabilitato, “1” se è abilitato
Modifica dei permessi - Esempio
Supponiamo di cambiare i permessi del file “prova.txt”
- Permessi di lettura, scrittura, esecuzione per il proprietario del file
- Permessi di lettura per il gruppo del file
- Nessun permesso per gli altri utenti
1)  Scriviamo i permessi in formato binario
rwx rwx rwx
111 100 000
2) Passiamo da formato binario a decimale
7
4
0
3) Impostiamo i permessi con chmod
chmod 740 prova.txt
4) Controlliamo i permessi impostati con “ls –l prova.txt”
Espansione della shell
La shell mette a disposizione dei caratteri speciali per
effettuare operazioni su file.
Tutti i file della directory corrente:
*
Esempio: cp /home/chiaraviglio/* /tmp
Tutti i caratteri possibili:
?
Esempio: ls /dev/tty?
Redirezione dell’output
Per default ogni comando stampa su schermo il risultato
ottenuto.
Si può redizionare l’output su un file con il comando
>
Esempio: cat /etc/passwd > /home/chiaraviglio/prova.txt
Per redizionare l’output in coda ad un file si usa il comando
>>
Allo stesso modo si possono redizionare i messaggi di errore
con il comando
2>
Infine si possono redizionare l’output e I messaggi di errore
con il comando:
&>
Funzioni di ricerca
Per cercare una parola all’interno di un file si usa il comando
grep <parola> <nome_file>
Esempio:
grep chiaraviglio /etc/passwd
La parola può essere sostituita da un’espressione regolare.
Per cercare un file si usa il comando
find <pathnames> -<espressione>
Dove <pathnames> è una lista di nomi di cartelle che viene
ricercata ricorsivamente e <espressione> è una lista di
espressioni che definiscono condizioni e azioni da eseguire
su ciascun file.
Esempi:
find . -print
find / -name passwd –print 2>/dev/null
Funzioni di ordinamento
Per ordinare un insieme di righe di un file dato un criterio si
usa il comando:
sort <opzioni> <file_di_input>
Il file ordinato viene stampato su output.
Esempio:
sort /etc/passwd
Principali opzioni:
-f -> non fa distinzione fra maiuscole e minuscole
-n -> tratta la chiave di ricerca come numerica invece che
come stringa
-r -> ordinamento inverso
-t <s> -> usa il carattere <s> invece che lo spazio come
separatore dei campi
-k <c1>,<c2> -> usa i campi da <c1> a (<c2> - 1) come
chiave di ricerca
Funzioni di ordinamento - esempi
sort /etc/passwd
sort –t: -k3,4 /etc/passwd
ATTENZIONE: mai fare la redirezione di un sort sullo stesso
file:
sort prova.txt > prova.txt
Trasformazioni di caratteri
Linux mette a disposizione un filtro che legge da standard input e
produce una versione modificata su standard output.
La versione modificata consiste nel modificare tutti i caratteri della
stringa <str1> nei corrispettivi caratteri della stringa <str2>
Si usa il seguente comando:
tr <str1> <str2>
Esempio:
tr ABC abc
tr : .
tr ‘\t’ ‘ ‘
In alternativa, il comando tr può essere usato per rimuovere
occorrenze multiple dei caratteri di <str1>
tr –s <str1>
Esempio:
tr –s ‘ ‘
Selezionare le colonne di un file
Spesso occorre selezionare una specifica colonna all’interno di un
file. Si usa il comando:
cut –d<delimitatore> -f<campi> <file_di_input>
Dove <delimitatore> è il carattere che separa le colonne, <campi>
sono le colonne che si vogliono selezionare e <file_di_input> è il file
di ingresso.
Esempio:
cut –d: –f1 /etc/passwd
cut –d: -f1,6 /etc/passwd
cut –d: -f1-6 /etc/passwd
Incollare assieme più file
Spesso occorre incollare più file in modo che le colonne siano
affianciate. Si usa il comando:
paste <file1> <file2>
Esempio:
paste /etc/passwd /etc/passwd
Altre funzioni
Ottenere la data corrente
date
Rimuovere le linee duplicate da un file di input
uniq <nome_del_file>
Confrontare due file
cmp <file1> <file2>
Stampare una stringa
echo <str>
Opzioni
-n -> Stampa senza andare a capo.
Le pipe
La shell mette a disposizione una funzionalità molto sfruttata:
la pipe.
Consiste nel concatenare una serie di comandi.
L’output di un comando diventa l’input per il comando
successivo.
L’output finale produce il risultato dell’applicazione dei
comandi.
Esempio:
ls /usr/bin | wc –w
Mettere più comandi in pipe
Grazie alla pipe, è possibile concatenare assieme i comandi
che abbiamo visto fino ad ora.
Esempio:
cat /etc/passwd | cut –d: -f7 | sort | uniq
cat
/etc/passwd
cut –d: -f7
sort
uniq
output su
schermo
Script di shell
I comandi visti fino ad ora possono essere eseguiti in un file
ed eseguiti.
Estensione tipica .sh.
Esempio:
bash script.sh
La shell mette a disposizione anche dei parametri di ingresso
$1 = primo parametro
$2 = secondo parametro
e così via
Esempio:
bash script.sh param1 param2
Dentro il file script.sh
primo_parametro=$1;
secondo_parametro=$2;
Script di shell – le variabili
Dentro lo script è possibile definire le variabili (non è
necessario definire il tipo).
Esempi:
numero=2;
stringa=“sequenza_di_caratteri”
vettore1=[1 2 3 4 5];
vettore2=“a b c d e f g”;
risultato_comando= `cat /etc/passwd | grep “chiaraviglio”`;
Per estrarre il valore di una variabile, si usa il comando $
Esempi
echo $numero
echo $stringa
echo $risultato_comando
file=“Prova.txt”; cat $file
Script di shell – for
Il ciclo for si può fare in due modi
for((i=0; i<$MAX; i++))
do
<azioni>
done
vett=[1 2 3 4 5];
for index in $vett
do
<azioni>
done
Nel secondo caso, il vettore può essere anche una sequenza
di stringhe.
Esempio: vett=“Roma Torino Milano Bari Palermo”;
Script di shell – while & if
while <condizione>
do
<azioni>
done
ATTENZIONE -> Per decrementare un contatore, si utlizza la
seguente sintassi:
count=$[$count-1];
if <condizione>
then
<azione true>
else
<azione false>
fi
Per l’if la parte else è opzionale.
Script di shell – condizioni
La <condizione> per l’if e il while si implementa con il
comando
test <espressione>
Esempi di espressione
<str1> = <str2>
<str1> != <str2>
<num1> -eq <num2> -> true se uguali
<num1> -ne <num2> -> true se non uguali
<num1> -lt <num2> -> true se minore di
<num1> -gt <num2> -> true se più grande di
<num1> -le <num2> -> true se minore o uguale di
<num1> -ge <num2> -> true se maggiore o uguale di
<exp1> -a <exp2> -> true se entrambe le espressioni sono
true
<exp1> -o <exp2> -> true se una delle espressioni è true
AWK
Linguaggio di scripting specificatamente progettato per
elaborare file di testo e aggiungere funzionalità
computazionali alla shell.
Come si invoca:
awk –f <file_di_script> <input_file1> <input_file2>
La struttura tipica di un file di script è la seguente:
BEGIN {
<azioni da compiere prima di aprire il file>
}
{
<azioni da compiere durante la lettura di <input_file_1>
}
END {
<azioni da compiere dopo la lettura del file>
}
AWK – cicli for e while
Questi costrutti sono del tutto analoghi a C e C++;
Esempi
for (i=0; i<50; i++) {
<azione>
}
i=60;
while(i<60) {
<azione>
i=i-1;
}
AWK – printf e modifica di singoli campi
Per stampare su output il valore di una variabile si usa la
funzione printf.
Esempio;
stringa=“blablablabla”;
printf(“%s\n”, stringa);
Per ogni riga del file di ingresso, è possibile ricavare il valore
di ciascuna variabile.
Esempio:
{
for(i=1; i<=NF; i++) {
printf(“%s “, $i);
}
}
AWK – operazioni su variabili
Con awk è possibile maneggiare in maniera del tutto
semplice le variabili e l’input di un file di ingresso.
Esempio:
Supponiamo di voler calcolare la somma degli elementi di
ciascuna riga del seguente file “prova.txt”:
10 20 30 40 50
12345
awk –f script.awk prova.txt
script.awk
{
tot_value=0;
for(i=1; i<=NF; i++) {
tot_value=tot_value+$i;
}
printf(“%d\n”, tot_value);
}
Accesso alle postazioni del laboratorio
Sulle macchine del laboratorio è già installata una
distribuzione di Linux (Ubuntu).
Nome utente: labint
Password: lablint
In alternativa, è possibile installare una versione di Ubuntu su
macchine Windows utilizzando il software Wubi (soluzione
molto comoda).
Installazione di programmi
Per installare un nuovo programma su una distribuzione
Ubuntu, solitamente si utilizzano i repository di pacchetti.
Esempio: supponiamo di voler installare il programma ethtool.
Per installare il programma, occorre innanzitutto aggiornare la
lista dei repository, mediante il comando:
sudo apt-get update
Siccome l’installazione di un programma richiede privilegi di
root, utilizziamo il comando sudo per ottenerli. Ci verrà
richiesta la password (lablint per le macchine del laboratorio).
A questo punto installiamo il programma con il comando:
sudo apt-get install <nome_programma>
(nel nostro esempio: sudo apt-get install ethtool)
Fine Lezione!!