Comandi_shell_bash

Transcript

Comandi_shell_bash
FONDAMENTI DEI SISTEMI OPERATIVI
Appunti dalle esercitazioni del laboratorio di GNU/Linux
(Ing. Silvia Giannini)
Anno Accademico 2012-2013
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Premessa
La presente dispensa contiene una descrizione dei comandi di shell Bash presentati a lezione
nell’ambito delle esercitazioni su sistemi operativi GNU/Linux per il corso di Fondamenti dei
Sistemi Operativi, tenuto dal Prof. Giacomo Piscitelli nei corsi di laurea di Ingegneria
Informatica e dell’Automazione ed Ingegneria Elettronica e delle Telecomunicazioni (A.A.
2012-13).
Parte del contenuto è tratto dalle slide del corso di Laboratorio di Sistemi Operativi
(distribuite nei termini della licenza Creative Commons “Attribuzione/Condividi allo stesso
modo 2.5” http://creativecommons.org/licenses/by-sa/2.5/it/legalcode), tenuto dal Dott.
Gennaro Oliva presso l’Università degli Studi di Napoli Federico II nell’A.A. 2010-11.
Saranno apprezzate e benvenute le segnalazioni di errori, imprecisioni ed omissioni (mail to
[email protected]).
Tale dispensa non è da considerarsi esaustiva sugli argomenti affrontati a lezione. Per ulteriori
approfondimenti
si
rimanda
a
"Linux
e
la
shell
Bash"
(http://sisinflab.poliba.it/giannini/SO/Linux_e_la_shell_Bash.pdf)
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 2
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Indice
Comandi di help .....................................................................................................................6
man ....................................................................................................................................6
Il file system ...........................................................................................................................8
pwd ....................................................................................................................................8
ls ........................................................................................................................................8
Protezione di file e directory ...........................................................................................9
cd .....................................................................................................................................10
cp .....................................................................................................................................10
mkdir ................................................................................................................................11
mv ....................................................................................................................................11
rm.....................................................................................................................................11
rmdir ................................................................................................................................11
stat ....................................................................................................................................12
touch ................................................................................................................................12
Manipolazione dei permessi ..............................................................................................13
chown ...............................................................................................................................13
chgrp ................................................................................................................................13
chmod...............................................................................................................................13
Link ..................................................................................................................................13
Hard link ..........................................................................................................................14
Soft link o symbolic link ...................................................................................................14
Altri comandi di base ............................................................................................................15
alias/unalias ......................................................................................................................15
echo ..................................................................................................................................15
date...................................................................................................................................15
which................................................................................................................................15
Caratteri speciali di shell.......................................................................................................16
1. File globbing.................................................................................................................16
2. Espansione della shell ...................................................................................................16
3. Regole di quoting ..........................................................................................................16
Espressioni Regolari .............................................................................................................17
Sintassi delle espressioni regolari......................................................................................17
Caratteri speciali della shell ed espressioni regolari...........................................................19
Caratteri speciali per le espressioni regolari ................................................................19
Operatori di ripetizione .....................................................................................................19
Regole di precedenza degli operatori ................................................................................20
Comandi di ricerca di stringhe ..............................................................................................20
grep ..................................................................................................................................20
Gestione utenti e gruppi ........................................................................................................24
Gruppi di utenti ................................................................................................................24
groupadd ..........................................................................................................................24
groupdel ...........................................................................................................................24
groupmod .........................................................................................................................24
useradd .............................................................................................................................25
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 3
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
passwd ..............................................................................................................................25
userdel ..............................................................................................................................26
usermod ............................................................................................................................26
su (substitute user) ............................................................................................................27
Comandi informativi ............................................................................................................27
id ......................................................................................................................................27
whoami.............................................................................................................................28
who ..................................................................................................................................28
groups...............................................................................................................................28
last ....................................................................................................................................28
Variabili ...............................................................................................................................29
Definizione .......................................................................................................................29
Variabili d'ambiente .........................................................................................................29
printenv ............................................................................................................................29
export ...............................................................................................................................30
set/unset............................................................................................................................30
Visualizzazione ed editing di file ..........................................................................................31
cat.....................................................................................................................................31
file ....................................................................................................................................31
less (more) ........................................................................................................................31
Canali di comunicazione e ridirezione ..................................................................................32
Operatori di ridirezione dello standard output ...................................................................32
Operatori di ridirezione dello standard error......................................................................32
Operatori di ridirezione dello standard input .....................................................................32
Operatore di pipeline ........................................................................................................33
Liste di comandi ...................................................................................................................33
sequenza ...........................................................................................................................33
concorrenza ......................................................................................................................34
condizione ........................................................................................................................34
esclusione .........................................................................................................................34
Exit status di liste di comandi ...........................................................................................34
Script BASH ........................................................................................................................34
Filtri e programmi di utilità generica.....................................................................................35
sort ...................................................................................................................................35
wc.....................................................................................................................................36
head ..................................................................................................................................36
tail ....................................................................................................................................36
uniq ..................................................................................................................................37
cut ....................................................................................................................................37
diff ...................................................................................................................................38
Gestione dei processi ............................................................................................................39
Avvio del sistema ..............................................................................................................39
Runlevel ...........................................................................................................................39
shutdown ..........................................................................................................................40
Controllo dei processi .......................................................................................................40
ps......................................................................................................................................41
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 4
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
pstree ................................................................................................................................43
top ....................................................................................................................................43
Background e foreground .............................................................................................44
yes ....................................................................................................................................44
sleep .................................................................................................................................44
wait ..................................................................................................................................44
jobs ...................................................................................................................................44
fg ......................................................................................................................................45
bg .....................................................................................................................................45
Segnali .............................................................................................................................45
kill ....................................................................................................................................46
pkill ..................................................................................................................................47
killall ................................................................................................................................47
Terminazione di un processo ............................................................................................47
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 5
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Comandi di help
man
Il comando man (manual) fornisce informazioni su qualsiasi comando, visualizzandone la pagina di manuale
relativa.
Il manuale è suddiviso in pagine logiche che corrispondono ad una sezione. Ogni sezione si riferisce ad un
insieme di argomenti logicamente affini.
Le pagine di manuale di un sistema UNIX sono raggruppate in 8 sezioni:
1) programmi eseguibili o comandi di shell (ls, vi, ...);
2) system call (open, write, fork, ...);
3) funzioni di libreria (printf, scanf, …);
4) file speciali (/dev/null, /dev/mouse, ...);
5) formati di file (/etc/passwd, /etc/hosts, …);
6) giochi (fortune, ...);
7) protocolli, convenzioni, panoramiche, varie (tcp, boot, ... );
8) comandi per la gestione del sistema (iptables, mkfs, ...).
SINTASSI: $ man [opzioni] comando
$ man man
All'interno di una pagina di manuale ci si può muovere con i tasti direzione: su, giù, pg su, pg giù. Si esce dalla
visualizzazione premendo q (quit). Si può ricercare una stringa digitando /stringa e se ne visualizzano le
occorrenze premendo n (occorrenza successiva) oppure N (occorrenza precedente).
La struttura della documentazione dei comandi è simile per ogni comando e segue il paradigma LDP (Linux
Documentation Project). All'interno di una pagina di manuale ci sono varie sottosezioni. Quelle convenzionali
sono: NAME, SYNOPSIS, CONFIGURATION, DESCRIPTION, OPTIONS, EXIT STATUS, RETURN
VALUE, ERRORS, ENVIRONMENT, FILES, VERSIONS, CONFORMING TO, NOTES, BUGS, EXAMPLE,
AUTHORS, SEE ALSO.
Di particolare rilevanza:
NAME: nome del comando e relativo commento
SYNOPSIS: sintassi del comando
DESCRIPTION: descrizione dettagliata del comando
OPTIONS: flag attribuibili al comando
Opzioni:
-f
Mostra NAME (con session) e relativo commento (equivale a SINTASSI: $ whatis comando)
-k
Cerca nel NAME e nel commento del man di tutti i comandi il pattern (comando) in argomento.
Risponde col
NAME del comando e con il commento associato (equivale a SINTASSI: $ apropos comando)
-L
Consente di visualizzare il manuale nella traduzione richiesta, se disponibile.
$ man -L it man
$ man -L en man
L'argomento del comando man viene ricercato all'interno delle sezioni in ordine crescente. Alla prima
corrispondenza trovata, viene visualizzata la pagina di manuale individuata. Alcune parole chiave possono essere
presenti in più sezioni, quindi per visualizzare il manuale di una sezione specifica bisogna anteporre come
opzione il numero della sezione (preceduto o meno dal flag -s).
Esempi.
- La parola write corrisponde almeno a due pagine di manuale: (1) il comando write per comunicare con gli
utenti; (2) la system call write per l'I/O a basso livello.
Per visualizzare la pagina della system call usiamo: $ man 2 write
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 6
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
- $ man -s1 chmod
$ man -s2 chmod
(Mostra la prima sessione)
(Mostra la seconda sessione)
In maniera alternativa, è possibile utilizzare
SINTASSI: $ comando --help
Accede direttamente alla sottosezione relativa alla descrizione delle options.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 7
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Il file system
Il file system di Unix ha un'organizzazione gerarchica ad albero, la cui radice (root) è una directory identificata
dal carattere /. Alcune sottodirectory della root directory sono comuni a tutti i sistemi UNIX.
bin: programmi binari (built-in) essenziali utilizzabili da tutti gli utenti
sbin: (superuser bin) programmi binari essenziali per l'amministrazione del sistema
boot: file necessari all'avvio del sistema quali il kernel ed i driver
dev: file speciali associati a dispositivi hardware
etc: file di configurazione
home: home directory degli utenti che hanno un account sulla macchina
root: home directory del root user
tmp: file temporanei
usr: file read-only
var: file che il sistema scrive durante l'esecuzione (log, spool, cache, ...)
Per i sistemi Linux i nomi delle directory e le loro funzioni sono stabilite dal Filesystem Hierarchy Standard
(FHS).
I nomi di file e directory possono essere composti da qualsiasi sequenza di caratteri eccetto /. E' buona prassi
limitarsi nell'utilizzo degli spazi. Ogni directory contiene 2 directory speciali: ., che corrisponde alla directory
stessa; .., che corrisponde alla directory padre (la directory padre di / è / stessa).
La struttura ad albero consente di identificare univocamente un elemento del file system mediante il percorso che
va dalla root directory / al file stesso. Questo percorso viene detto pathname. Nel pathname tutte le directory del
percorso vengono separate dal carattere /. Un pathname che inizia con il carattere / viene detto assoluto, parte
dalla root directory ed arriva ad un elemento del filesystem. Un pathname che inizia senza il carattere /, parte da
una directory del file system e viene detto relativo.
pwd
Il comando pwd (print working directory) mostra sullo standard output il percorso completo (pathname assoluto)
della directory di lavoro corrente.
SINTASSI: $ pwd
user@ubuntu:~$ pwd
/home/user
ls
Il comano ls (list) lista il contenuto di una directory in ordine alfabetico (in assenza del path in argomento lista il
contenuto della current working directory - cwd).
SINTASSI: $ ls [opzioni] [path]
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 8
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Opzioni:
-a
(all) Mostra anche i file nascosti (tutti i file che iniziano con il carattere '.')
-F
Associa un identificatore per ogni tipo di file in coda al nome (@ link simbolico; * eseguibile; /
directory; | FIFO; = socket)
-t
Ordina i file per data di modifica, dal più recente
-u
Ordina i file per data di ultimo accesso, dal più recente
-r
Inverte l'ordine alfabetico di visualizzazione
-R
Visualizza in modo ricorsivo il contenuto delle sottodirectory
-1
Visualizza l'elenco in un'unica colonna
-Q
Circonda i nomi dei file con le virgolette (utile in caso di nomi di file che contengono spazi)
-i
Visualizza l'#i-node del file.
-l
Mostra informazioni dettagliate sui file contenuti nella directory in maniera tabellare:
[Access Control List] [numero di link al file] [utente] [gruppo] [dimensione in byte] [ultimo accesso]
[nome simbolico file]
Protezione di file e directory
Unix è un sistema multi utente e necessita di meccanismi di protezione di file e directory per consentire ad ogni
utente di preservare i propri dati dall'accesso da parte di altri utenti. Ogni file ha un proprietario e un gruppo di
appartenenza. L'amministratore può modificare, assieme al proprietario, i diritti d'accesso.
Al file sono associate protezioni per tre tipi di accesso:
a) Accesso in lettura identificato dalla lettera “r” (read)
b) Accesso in scrittura identificato dalla lettera “w” (write)
c) Accesso in esecuzione identificato dalla lettera “x” (execute)
Le protezioni possono essere applicate a 3 classi di utenti:
1. il proprietario del file (user)
2. il gruppo a cui appartiene il file (group)
3. tutti gli altri utenti (others)
L'Access Control List (ACL) è una sequenza di 10 caratteri. Il primo carattere rappresenta il tipo di file:
d
directory (contiene nomi di file e puntatori ad i-node)
l
link simbolico (puntatore a file)
file ordinario o regolare (contengono dati, senza distinzione tra file binari o di testo)
b
file speciale a blocchi (file speciale che fornisce un'interfaccia bufferizzata a blocchi di lunghezza
fissa per l'I/O da dispositivi di memorizzazione quali hard disk, cdrom, floppy ...)
c
file speciale a caratteri (file speciale che fornisce un'interfaccia non bufferizzata con blocchi di
lunghezza variabile a dispositivi quali schede audio, terminali, porte seriali, ...)
p
file FIFO o pipe con nome (tipo di file destinato alla comunicazione iterprocesso su una stessa
macchina)
s
socket (file utilizzato per la comunicazione tra due processi anche su rete)
Gli altri 9 caratteri vanno interpretati a gruppi di tre:
AuBuCu AgBgCg AoBoCo
A: permesso di lettura (r o -)
B: permesso di scrittura (w o -)
C: permesso di esecuzione (x o -)
per lo user owner (u); per il group owner (g); per gli others (o) ovvero il resto del mondo.
Esempio di ACL: l rw- rw- r-Si tratta di un link simbolico. L'utente proprietario ha permessi di lettura e scrittura, non di esecuzione; gli utenti
appartenenti al gruppo del proprietario hanno diritto di lettura e scrittura, non di esecuzione; il resto del mondo
ha solo diritto di esecuzione.
Nel caso di directory, i tre tipi di permesso assumono il seguente significato:
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 9
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
r
w
x
Visualizzare il contenuto della directory (il list è una lettura)
Scrivere all'interno della directory (rinomina, modifica, rimozione)
Attraversare una directory, ovvero utilizzare il nome della directory per accedere ad un qualsiasi file
contenuto nel sottoalbero di cui è radice. Assegnare un premesso di esecuzione ad una directory
equivale a permettere la navigazione dell'albero. Se chiedo il list del contenuto di una cartella che non
posso eseguire il sistema comunica permission denied. Negli altri casi il permesso di esecuzione
esiste solitamente solo per file ordinari.
E' d'uso fare una maschera in forma ottale dell'ACL, escluso il primo carattere. I 9 valori possono essere
interpretati come bit (0: permesso negato; 1: permesso concesso) e considerati a gruppi di 3 (8 combinazioni per
ciascun terzetto).
Esempi:
110 110 100 = 664 (dall'esempio precedente)
755 = 111 101 101 ovvero rwx r-w r-w
640 = 110 100 000 ovvero rw- r-- --cd
Il comando cd (change directory) cambia la cwd corrente con quella specificata.
SINTASSI: $ cd [path]
Utilizzi particolari:
cd
(Torna alla homedir dell'utente loggato: equivale a cd ~)
cd (Torna alla directory precedentemente referenziata, memorizzata nella variabile d'ambiente
OLDPWD)
cd .
(Porta nella cwd)
cd ..
(Porta nella directory padre della cwd)
$ cd /
$ cd /usr/bin
Esercizi
1. Visualizzate la pagina di manuale del comando ls.
2. Cercate la stringa “long” per leggere la sezione relativa all'opzione -l.
3. Cercate la stringa “all” per leggere la sezione relativa all'opzione -a.
4. Spostatevi nella directory /usr/bin .
5. Visualizzatene il contenuto.
6. Tornate nella vostra home directory.
cp
Il comando cp (copy) copia il file (o una directory vuota) dal percorso di partenza a quello di destinazione. Se il
file di destinazione non esiste viene creato, viceversa si rischia la sovrascrittura. La copia di cartelle non vuote va
effettuata in maniera ricorsiva.
SINTASSI: $ cp [opzioni] [path/]fileOrigine [path/]fileDest
Opzioni:
-f
-i
-p
-R
-v
Forza la sovrascrittura
Richiede interattivamente la conferma di sovrascrittura
Mantiene le caratteristiche del file sorgente compresa la data e l'ora di referenziazione
Copia ricorsiva
Verbose mode
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 10
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Esempi:
$ cp esempio esempio.bak
$ cp -i esempio2 esempio.bak
$ cp -Rv dir/dir1 silviax
mkdir
Il comando mkdir (make directory), crea una directory.
SINTASSI: $ mkdir [opzioni] [path/]nomeDir
Opzioni:
-m ACL
-v
Crea una directory specificando l'ACL
Verbose Mode: mostra sullo standard output le operazioni eseguite
Esempi:
$ mkdir prova
$mkdir prova1 prova2
$ mkdir prova1/prova11 /home/silvia/prova/prova2
$ mkdir -m 766 prova3
Come verificate che la creazione sia andata a buon fine?
$ mkdir -vm 766 provaV
mv
Il comando mv (move), sposta (cut and paste/rename) file o directory da un percorso di partenza ad uno di
destinazione.
SINTASSI: $ mv [opzioni] [path/]fileOrigine [path/]fileDest
Opzioni:
-f
-i
-v
Forza la sovrascrittura
Richiede interattivamente la conferma di sovrascrittura
Verbose mode
Esempi:
$mv file1 file2
$mv file1 dirA
$mv dirA file1
$mv dirA dirB
(rinomina file 1 come file2 eventualmente sovrascrivendolo)
(sposta file1 in dirA)
(non concesso se file1 è un file esistente)
(sposta dirA in dirB o rinomina dirA in dirB, se dirB non esiste)
rm
Il comando rm (remove file), rimuove un file (o una directory in manera ricorsiva se non vuota).
SINTASSI: rm [opzioni] nomeFile
Opzioni:
-R
-v
Cancellazione ricorsiva del contenuto di una directory e della directory stessa, se non vuota
Verbose mode
Esempi:
$ rm -Rv provaFull
$ rm file1
rmdir
Il comando rmdir (remove directory), cancella una directory. La directory dev'essere vuota.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 11
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
SINTASSI: $ rmdir [opzioni] nomeDir_1 [nomeDir_n]
Opzioni:
--ignore-fail-on-non-empty
-v
Non mostra a video il messaggio di errore
Verbose mode
stat
Ad ogni file sono associate una serie di informazioni o metadati, quali la dimensione, i permessi, le date di
accesso e di modifica. Queste informazioni possono essere lette dal filesystem e vengono memorizzate in una
struttura dati chiamata stat che contiene almeno i seguenti membri:
struct stat {
dev_t
st_dev
ino_t
st_ino
mode_t st_mode
nlink_t
st_nlink
uid_t
st_uid
gid_t
st_gid
dev_t
st_rdev
off_t
st_size
time_t
st_atime
time_t
st_mtime
time_t
st_ctime
blksize_t st_blksize
blkcnt_t st_blocks
}
/*ID del device che contiene il file*/
/*n.ro inode*/
/*tipo di file e permessi*/
/*numero di link al file*/
/*user ID del proprietario del file*/
/*group ID del proprietario del file*/
/*device ID (se il file è speciale a blocchi o a caratteri)*/
/*dimensione del file in bytes (per file regolari, directory o link)*/
/*orario dell'ultimo accessoai dati*/
/*orario dell'ultima modifica ai dati*/
/*orario dell'ultimo cambiamento all'inode (ad esempio attraverso chmod)*/
/*dimensione del blocco per l'oggetto (è specifica del FS, può variare da file a file)*/
/*numero di blocchi allocati per l'oggetto*/
Per avere informazioni su data di creazione, accesso e modifica di un file si può utilizzare il comando
SINTASSI: $ stat nomeFile)
touch
Aggiorna data ed ora di ultima referenziazione del file in argomento (di default cambia sia l'orario di accesso che
di modifica), con l'orario corrente. Se il file non esiste, crea un file vuoto con data e ora corrente.
SINTASSI: $ touch [opzioni] nomeFile
Opzioni:
-a
-c
-m
Cambia l'orario di accesso
Non crea il file, aggiorna solo la data di ultimo accesso
Cambia l'orario di modifica
Esempio:
$ touch prova/touch.exe
Esercizi
1. All'interno della vostra home directory create 2 directory denominate “uno” e “due”.
2. Copiate il file /etc/profile nella directory uno, conservandone il nome.
3. Copiate il file /etc/profile nella directory due cambiandone il nome in copia-profile.
4. Spostate il file profile nella directory due ed il file copia-profile nella directory uno.
5. Cancellate i due file con uno stesso comando.
6. Cancellate le due directory vuote.
7. Verificate il funzionamento di touch per la modifica dell'orario di ultimo accesso e per la creazione di un file
vuoto.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 12
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Manipolazione dei permessi
Al momento della creazione di un file, esso appartiene all’utente che lo ha creato e assume il gruppo di
quest’ultimo. Il superuser può modificare queste informazioni con i comandi:
chown
Il comando chown (change owner), modifica il proprietario di un file.
SINTASSI: # chown newowner file1 [file2 ... fileN]
chgrp
Il comando chgrp (change group), modifica l'owner group di un file.
SINTASSI: # chgrp newgroup file1 [file2 ... fileN]
Esempio:
# chown userB:groupB file1
chmod
Il comando chmod (change mode), consente all'utente proprietario (o al superuser) di modificare i permessi (la
ACL) di file e directory.
SINTASSI: $ chmod [codiceUtente±codicePermesso | formaOttale] file1 [file2 ... fileN]
codiceUtente:
user group other all
operatore:
+ (aggiunge) – (rimuove);
codicePermesso: read write execute.
Esercizi
1. Copiate il file /bin/ls nella vostra home directory specificando il pathname.
2. Eliminate i permessi di esecuzione a tutti gli utenti per la copia locale.
3. Ripristinate i permessi di esecuzione al solo proprietario del file.
4. Create una directory “test” nella vostra home directory e copiate il file /bin/ls al suo interno
5. Eliminate i permessi di esecuzione alla directory e provate a listare il contenuto. Perché non è concessa
l'operazione?
6. Ripristinate i vecchi permessi e cancellate con un unico comando il file all'interno della directory e la
directory stessa.
Link
Un cilindro è organizzato in i-nodes (i-node table) e data-blocks.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 13
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Ad ogni file è associato un singolo ed unico i-node che memorizza la maggior parte delle informazioni restituite
da stat (numero di link, dimensione, proprietario, allocazione sul disco, etc.) e i puntatori ai data block, in cui
viene memorizzato il contenuto di un file. All’aumento delle dimensioni del file può corrispondere un aumento
dei data block allocati per il file.
Il data block di una directory viene detto directory block e contiene, per ogni file contenuto nella directory, una
directory entry (#inode, filename) contenente il nome del file e il numero di i-node ad esso associato. La
modifica del nome di un file viene effettuata sull'informazione memorizzata nel directory block.
Un riferimento ad un file è detto link. Ogni file può avere un numero qualsiasi di link.
UNIX ha due tipi di link: hard link e soft link. Entrambi possono essere creati con il comando ln.
Hard link
Un hard link è un puntatore all'i-node di un file. Un hard link è un elemento all’interno di una directory il cui
numero di i-node corrisponde a quello di un altro file. In pratica, è possibile creare “un file” all’interno di una
directory creando un puntatore ad un file già esistente. Un hard link eredita tutte le informazioni associate all'inode del file originale e non c'è più modo di distinguere tra l'hard link e il file originale.
Le directory hanno un numero di link almeno pari a 2: un puntatore è memorizzato nella voce corrispondente
contenuta dalla directory “padre”; un puntatore è contenuto nella stessa directory verso “.”.
La maggior parte di implementazioni UNIX moderne non consente di creare ulteriori hard link a directory.
Questo limite viene imposto per evitare ricorsioni infinite nel tentativo di attraversare un albero che parte da un
hard link che punta alla propria directory padre. Inoltre, non è possibile effettuare un hard link con un file
memorizzato su una partizione diversa da quella della directory in cui lo si vuole creare.
Ogni volta che si crea un hard link ad un file, il link count per il file si incrementa di 1.
Quando il comando rm riceve come argomento un hard link, il sistema decrementa il link count (nell’i-node del
file) di 1. Se il link count non è 0, il sistema rimuove solo la directory entry del file cancellato. Il contenuto del
file e altre directory entry per quel file (hard link) rimangono inalterati. Se il link count è 0, il sistema rimuove la
directory entry per quel file, libera l’-inode del file e dealloca i data block che contenevano il file.
SINTASSI: ln [opzioni] fileEsistente1 [fileEsistente2 ... fileEsistenteN] nuovoFile
fileEsistenteX non può essere una directory.
nuovoFile
può essere una directory. In tal caso viene creato un hard link all'interno di nuovoFile a tutti i
fileEsistenti indicati nel comando e i link hanno lo stesso nome dei file originari.
Opzioni:
-n
Non crea il link se nuovoFile esistente già.
Soft link o symbolic link
Un soft link (o symbolic link) corrisponde ad un file che contiene, all’interno dell’unico data block ad esso
associato, il percorso assoluto di un altro file. I soft link superano i limiti degli hard link in quanto consentono di:
- creare collegamenti tra entità su filesystem diversi;
- creare link a directory.
Un soft link può essere utilizzato per creare puntatori a file o directory lasciando sempre ben chiara la distinzione
tra il file originale e il link.
Quando il comando rm riceve come argomento un soft link, cancella quest'ultimo e non il file a cui esso si
riferisce.
SINTASSI: $ ln -s pathnameAssolutofileEsistente nomeLink
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 14
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Altri comandi di base
alias/unalias
L'alias è un nome alternativo dato ad una sequenza complessa
SINTASSI: $ alias
$ alias nomeAlias='comando'
Esempi:
$ alias al='ls -al'
$ alias cp='cp -i'
Visualizza tutti gli alias
Crea un alias
(impone al sistema il controllo di sovrascrittura)
SINTASSI: $ unalias [opzioni] nomeAlias
Distrugge l'alias nomeAlias
Esempio:
$ unalias al
Opzioni:
-a
Distrugge tutti gli alias
echo
Stampa una stringa sullo standard output.
SINTASSI: $ echo [stringa]
Esempi:
$ echo hello world!
$ echo ~
(Mostra il percorso assoluto della home-dir dell'utente loggato, vedi sezione Espansione
della shell)
date
Mostra la data e l'ora corrente
which
Stampa il path assoluto di un comando
Esercizio:
Trovate il path del comando whoami
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 15
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Caratteri speciali di shell
Prima di eseguire un comando, la shell interpreta alcuni caratteri speciali (wildcard) sostituendoli secondo
regole. Il carattere di escape \ preserva un singolo carattere dall'espansione della shell (analogo utilizzo è
attribuito al simbolo di escape nelle espressioni regolari).
$ echo \*
1. File globbing
* l'asterisco rappresenta un gruppo qualsiasi di caratteri, compreso il punto, purché il punto non si trovi all'inizio
del nome
$ rmdir pro*
Cancella tutte le directory vuote il cui nome inizia con pro
? il punto interrogativo rappresenta un unico carattere qualsiasi, compreso il punto, purché il punto non si trovi
all'inizio del nome
$ rmdir pro?
Cancella tutte le directory vuote con nome pro seguito da un solo carattere qualsiasi
[...] le parentesi quadre permettono di rappresentare un carattere qualsiasi o un intervallo di caratteri possibili.
[adfz]
[g-z]
[^a]
Uno qualsiasi dei caratteri a,d,f,z
Uno qualsiasi dei caratteri compresi tra g e z
Un carattere qualsiasi diverso da a
2. Espansione della shell
{...} le parentesi graffe consentono di specificare un qualsiasi insieme di stringhe nella forma:
prefisso{stringa1,stringa2,stringa3}suffisso
Esempi:
$ echo v{en,id,ic}i
veni vidi vici
$ echo v{en,i{d,c}}i
veni vidi vici
~
Utilizzato per riferirsi alle home directory dell'utente loggato
~name Identifica la home dir dell'utente name
$ mkdir ~/Mail (Crea una directory Mail sotto la home directory dell'utente loggato)
$nomevar
Espansione dei parametri d'ambiente e delle variabili (vedi sezione Variabili)
$ echo $USER
$(comando)
Sostituisce l'output del comando
$ echo Oggi e\' $(date)
Oggi e' gio 24 mar 2011, 08.32.06, CET
3. Regole di quoting
L'inserimento di una stringa tra apici singoli ' ' protegge i caratteri speciali contenuti nella stringa dall'espansione
da parte della shell.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 16
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
$ echo '$HOME'=$HOME
$HOME=/home/silvia
L'utilizzo di apici doppi “ ” consente l'espansione da parte della shell dei soli nomi di variabile, mentre preserva
gli altri caratteri speciali dall'espansione.
$ echo "ls $HOME/* mostra il contenuto della homedir"
ls /home/silvia/* mostra il contenuto della homedir
Esercizi
1. Listare tutti i file della cartella /var/log che contengono il carattere '-' nel nome e che terminano per '.log'.
2. Listare tutti i file della cartella /var/log composti da tre caratteri e che terminano con '.log'.
3. Listare tutti i file della cartella /var/log che iniziano con un carattere compreso tra 'h' e 'z' e terminano con
'.log'.
4. Visualizzare i file nella directory /var/log che contengono un numero all'interno del nome e terminano in '.log'.
5. Il man del comando mv riporta tra le options:
-t DEST_DIR
Sposta tutti gli argomenti della cartella sorgente nella cartella DEST_DIR
Scrivere un comando per spostare il contenuto della cartella ./folder2 all'interno della cartella ./prova1.
Disegnare l'albero delle directory risultante al termine dell'operazione, supponendo che la cartella ./folder2
contenga i file file1, file2, folder1. Quale comando utilizzare per spostare l'intera cartella folder2 all'interno di
prova1?
Espressioni Regolari
Un'espressione regolare è un pattern che rappresenta un insieme di stringhe. In altre parole, è una stringa scritta
secondo una precisa sintassi.
Le espressioni regolari vengono tipicamente utilizzate nella ricerca di stringhe all'interno di file di testo e nella
sostituzione delle stringhe trovate con nuovo testo.
Usando espressioni regolari nell'effettuare ricerche, non si è obbligati a specificare esattamente i termini da
ricercare, ma si possono definire delle regole generali da utilizzare per trovare le stringhe di interesse.
Sintassi delle espressioni regolari
1. Il caso più elementare di espressione regolare è un singolo carattere, che rappresenta l'insieme delle stringhe
costituite dal solo carattere.
Il carattere a, ad esempio, rappresenta l'insieme di stringhe costituito dal solo carattere {a}.
2. Insiemi di caratteri
Per identificare diversi caratteri è possibile utilizzare le parentesi quadre [...], come accade per il file globbing.
Una lista di caratteri racchiusa tra parentesi quadre corrisponde a qualsiasi carattere in esse contenuto.
Se la lista viene preceduta dal simbolo ^, l'espressione corrisponde a qualsiasi carattere non contenuto nella lista.
Esempio: [^abcd]
fughe mostrata perché contiene f,u,g,h,e
coda mostrata perché contiene o
bada non mostrata perché non contiene caratteri diversi da a,b,c,d
Il carattere ^, se specificato dopo il primo carattere, assume significato letterale.
L’espressione '[a^b]' mostra le linee del file che contengono i caratteri a,^ e b e non caratteri a seguiti da caratteri
diversi da b.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 17
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
All'interno delle parentesi quadre è possibile indicare un intervallo di caratteri specificando gli estremi e
separandoli con il carattere -.
L'espressione [a-g] mostra tutte le righe del file che contengono una lettera compresa tra a e g.
Alcune localizzazioni prevedono l'ordinamento aAbBcCdD... per cui specificando [a-g] si individuano le lettere
[aAbBcCdDeEfF].
Si possono anche identificare classi di caratteri attraverso le espressioni:
[:alnum:]
Caratteri alfanumerici (cifra o lettera)
[:alpha:]
Caratteri alfabetici
[:digit:]
Caratteri numerici
[:lower:]
Lettere minuscole
[:upper:]
Lettere maiuscole
[:xdigit:]
Cifre esadecimali
...
Esempio: [[:lower:]]
Seleziona tutte le righe che contengono una minuscola.
3. Concatenazione
Due espressioni regolari, regex1 e regex2, possono essere concatenate in una nuova espressione regolare
regex1regex2. Ad essa corrisponde qualsiasi stringa formata da due stringhe concatenate corrispondenti alle
singole espressioni di partenza.
La più semplice forma di concatenazione è una stringa di lettere o numeri.
L'espressione regolare 'ab' ricerca tutte le righe che contengono la stringa ab.
L'espressione regolare 'a[1-5]' restituisce tutte le righe contenenti una delle seguenti stringhe: {a1,a2,a3,a4,a5}.
4. Alternanza
Due espressioni regolari, regex1 e regex2, possono essere concatenate utilizzando l'operatore pipe |.
L'espressione regolare risultante corrisponde a qualsiasi stringa che corrisponda alla prima o alla seconda.
L'insieme delle stringhe rappresentate dall'espressione regex1|regex2 è l'unione degli insiemi delle stringhe
rappresentate da regex1 e regex2.
L'espressione regolare 'a|b' visualizza le righe che contengono le stringhe che contengono la lettera a e quelle che
contengono la lettera b.
5. Posizionamento
a. I caratteri ^ e $ identificano all'interno di un'espressione regolare rispettivamente inizio e fine riga.
L'espressione regolare 'stringa$' stampa tutte le righe che terminano con stringa.
L'espressione regolare '^stringa' stampa tutte le righe che iniziano con stringa.
L'espressione regolare '^stringa$' stampa le righe costituite solo dalla parola stringa.
b. I simboli \< e \> individuano rispettivamente l'inizio e la fine di una stringa.
L'espressione regolare '\<stringa' stampa la tutte le righe che contengono una parola che comincia con stringa (ad
es.: stringa, stringato, ma non costringa).
L'espressione regolare 'stringa\>' stampa la tutte le righe che contengono una parola che termina con stringa (ad
es.: stringa, costringa, ma non stringato).
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 18
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Caratteri speciali della shell ed espressioni regolari
Le espressioni regolari possono generare confusione perché utilizzano gli stessi caratteri speciali della shell, ma
con significati a volte diversi.
L'espansione dei caratteri speciali della shell viene sempre effettuata prima di eseguire un comando. Per
preservare le espressioni regolari utilizzate da alcuni comandi (come ad esempio grep) da interpretazioni errate, è
opportuno proteggerle con gli apici '…', evitando così che la shell interpreti i caratteri speciali di shell contenuti
nell'espressione regolare. Questo è necessario anche quando i caratteri speciali hanno la stessa funzione.
Caratteri speciali per le espressioni regolari
Il carattere punto . è un carattere speciale che rappresenta qualsiasi carattere (lettera, cifra, spazio, tab, ...).
N.B. La sintassi delle espressioni regolari differisce da quella del file globbing dove un singolo carattere è
rappresentato dal carattere ?.
I caratteri speciali all'interno di un'espressione regolare con le quadre [...] perdono di significato e vengono
considerati letteralmente.
L'espressione regolare '[\.*]' mostra le linee del file che contengono i caratteri .,\ e * e non zero o più occorrenze
del carattere . (vedi sezione Operatori di ripetizione).
Operatori di ripetizione
Un'espressione regolare che genera una corrispondenza con un singolo carattere può essere seguita da uno o più
operatori di ripetizione.
Il carattere * viene specificato per cercare un'espressione ripetuta un numero qualsiasi di volte (anche zero).
N.B. Notare la differenza con il carattere * del file globbing!
L'espressione regolare 'ab*c' visualizza le righe che contengono le stringe {ac,abc,abbc,abbbc,ab...bc}.
Il carattere ? viene specificato per cercare un'espressione ripetuta al più una volta (anche zero)
L'espressione regolare 'ab?c' visualizza le righe che contengono le stringe {ac,abc}, ma non corrisponde alle
stringhe {abbc,abbbc,ab...bc}.
Il carattere + viene specificato per cercare un'espressione ripetuta almeno una volta.
L'espressione regolare 'ab+c' visualizza le righe che contengono le stringhe {abc,abbc,abbbc,ab...bc}, ma non
corrisponde alla stringa {ac}.
L'espressione {n} viene specificata per cercare un'espressione ripetuta esattamente n volte.
L'espressione 'ab{2}c' visualizza le righe che contengono le stringhe {abbc}, ma non corrisponde alle stringhe
{ac,abc,abbbc,ab...bc}.
L'espressione {n,m} viene specificata per cercare un'espressione ripetuta almeno n volte e al più m volte.
L'espressione regolare 'ab{2,5}c' visualizza le righe che contengono le stringhe {abbc,abbbc,abbbbc,abbbbbc},
ma non corrisponde alle stringhe {ac,abc,abbb...bbc}.
L'espressione {n,} viene specificata per cercare un'espressione ripetuta almeno n volte.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 19
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
L'espressione regolare '\<[[:digit:]]{4,}\>' visualizza le righe contenenti stringhe che cominciano con numeri
aventi almeno quattro cifre.
Regole di precedenza degli operatori
Nell'interpretazione delle espressioni regolari le operazioni sulle espressioni vengono valutate nel seguente
ordine
1) ripetizione
2) concatenazione
3) alternanza
Le parentesi tonde possono essere utilizzate per modificare quest'ordine predefinito.
L'espressione regolare 'a|bc+', esplicitando l'ordinamento delle operazioni, equivale a: '(a|(b(c+)))' overo ricerca
stringhe del tipo {a, bc, bcc, bccc...}.
Con le parentesi tonde possiamo modificare l'ordinamento delle operazioni:
con 'a|(bc)+' ricerchiamo stringhe del tipo {a, bc, bcbc...};
con '(a|b)c+' ricerchiamo stringhe del tipo {ac..., bc...}.
Comandi di ricerca di stringhe
grep
Il comando grep (Global Regular Expression Print) viene utilizzato per cercare stringhe all'interno di un file.
SINTASSI: $ grep [opzioni] 'pattern' [file]
pattern è un'espressione regolare. Se il file non è specificato, grep opera sullo standard input.
Opzioni:
-v
Stampa le righe che non contengono stringhe corrispondenti al pattern
-n
Antepone il numero di riga
-c
Visualizza soltanto quante righe contengono stringhe corrispondenti al pattern
-i
Rende il comando case-insensitive
--color Evidenzia, colorandola, l'occorrenza del pattern all'interno della riga
-E
Abilita l'interpretazione di espressioni regolari estese
I caratteri ?, +, {, }, |, (, e ), se utilizzati con grep che interpreta espressioni regolari base (in assenza dell'opzione
-E), vanno preceduti dal carattere di escape \. Se si utilizzano con egrep o con l'opzione -E di grep, che abilita
l'interpretazione di espressioni regolari estese, non è necessario anteporre il carattere \. La differenza è solo nella
sintassi dell'espressione regolare non nella sua funzionalità: $ grep 'a\+' equivale a $ egrep 'a+'.
Quando si proteggono gli argomenti del pattern di grep con gli apici singoli, si preclude l'utilizzo di variabili. In
alcuni casi si possono utilizzare gli apici doppi, che non impediscono la sostituzione della variabile con il suo
valore.
$ grep “^$USER:” /etc/passwd
(si veda la sezione Variabili)
Esempi:
Sia dato il seguente file di test denominato 'file':
fughe
coda
bada
MAIUSCOLE
a1
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 20
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
a2
a3
a4
a5
a6
a7a8
a9
stringa
stringa stringato costringa
ac
abc
abbc
abbbc
file.txt
ciao a *
exit
^_^
a^
done
matr 543672
matr 543321
matr 523455
tel 0801234567
prefix 080
a
b
bc
bcc
bccc
bcbcbc
bacbc
bac
ac
acc
caa
acac
$ grep a file
della riga
Mostra tutte le linee del file che contengono la lettera a almeno una volta in qualsiasi punto
$ grep . file
Mostra tutte le linee del file che contengono almeno un carattere
$ grep '[abcd]' file
Mostra tutte le linee del file che contengono almeno una tra le lettere a,b,c,d
$ grep '[^abcd]' file
Mostra le linee del file che contengono lettere diverse da a,b,c,d
fughe mostrata perché contiene f,u,g,h,e; coda mostrata perché contiene o; bada non mostrata perché
non contiene lettere diverse da a,b,c,d; etc.
Quale comando utilizzare per visualizzare tutte le righe che non contengono a, b, c e d?
$ grep '[a-g]' file
Mostra tutte le righe del file che contengono una lettera compresa tra a e g
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 21
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
$ grep [[:upper:]] file
Stampa tutte le righe che contengono un carattere maiuscolo
$ grep 'ad' file
Stampa tutte le linee del file che contengono la stringa ad
$ grep 'a[1-5]' file
Ricerca una stringa di tipo {a1,a2,a3,a4,a5}
$ grep 'stringa$' file
Stampa tutte le righe che terminano con stringa
$ grep '^stringa' file
Stampa tutte le righe che iniziano con stringa
$ grep '^stringa$' file
Stampa le righe che contengono soltanto stringa
$ grep '\<stringa' file
Stampa tutte le righe che contengono una parola che comincia con stringa
(stringa, stringato, ma non costringa)
$ grep 'stringa\>' file
Stampa tutte le righe che contengono una parola che termina con stringa
(stringa, costringa, ma non stringato)
$ grep '\<stringa\>' file
Cosa restituisce?
$ grep 'ab*c' file
Visualizza le righe che contengono le stringhe: ac, abc, abbc, abbbc, ab...bc
$ grep '[\.*]' file
Mostra le linee del file che contengono i caratteri .,\ e * e non zero o più occorrenze
del carattere .
file.txt mostrata perché contiene .; ciao a * mostrata perché contiene *; etc.
$ grep '[a^b]' file
Mostra le linee del file che contengono i caratteri a, ^ e b e non caratteri a seguiti da
caratteri diversi da b
^_^ mostrata perché contiene ^; a^ mostrata perché contiene a e ^; etc.
$ egrep 'ab?c' file
Visualizza le righe che contengono le stringhe: ac, abc; ma non corrisponde alle
stringhe: abbc, abbbc, ab...bc.
$ egrep 'ab+c' file
Visualizza le righe che contengono le stringhe: abc, abbc, abbbc, ab...bc; ma non
corrisponde alla stringa ac
$ egrep 'ab{2}c' file
Visualizza le righe che contengono le stringhe abbc, ma non corrisponde alle stringhe
ac, abc, abbbc, ab...bc
$ egrep 'ab{2,3}c' file
Visualizza le righe che contengono le stringhe abbc e abbbc, ma non corrisponde alle
stringhe ac, abc, abbbbc, abbb...bbc
$ grep -E '\<[[:digit:]]{4,}\>' file
Visualizza le righe contenenti i numeri con più di quattro cifre
$ egrep 'a|b' file
Visualizza le righe che contengono stringhe contenenti la lettera a o la lettera b
$ egrep 'a|bc+' file
Visualizza le righe che contengono stringhe del tipo: a, bc,bcc...
$ egrep 'a|(bc)+' file
Visualizza le righe che contengono stringhe del tipo: a, bc, bcbc....
$ egrep '(a|b)c+' file
Visualizza le righe che contengono le stringhe di tipo: ac..., bc...
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 22
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Esercizi
Scrivere un comando per visualizzare nel file /etc/passwd le righe:
1. che non contengono cifre pari;
2. che corrispondono ad utenti con prima lettera compresa tra g e l, ordinate in ordine alfabetico;
3. che contengono la lettera 'c' ripetuta minimo 1 volta e massimo 2 volte di seguito.
4. Scrivere un comando per visualizzare nel file /etc/services le righe contenenti la parola 'ftp'.
5. Scrivere un comando che mostri a video tutti i file regolari contenuti nella cwd che risultano accessibili in
lettura al resto del mondo.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 23
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Gestione utenti e gruppi
Nei sistemi Unix gli utenti si dividono in: superuser (utente amministratore o root) e utenti regolari. L'utente root
ha tutti i privilegi sul sistema e può aggiungere o rimuovere i privilegi agli altri utenti (diritti di accesso), così
come creare nuovi utenti.
Gruppi di utenti
Ciascun utente di un sistema Unix appartiene ad uno o più gruppi. Ogni utente ha un unico gruppo di login
(gruppo principale) di cui è titolare e può essere membro di più gruppi supplementari, a cui l'utente aderisce
senza esserne il titolare. Su alcuni sistemi, l'appartenenza ad alcuni gruppi supplementari determina la possibilità
di utilizzare alcune funzionalità del sistema (audio – utilizzare la scheda audio; video – utilizzare la webcam;
dialout – utilizzare il modem e le porte seriali; dip – utilizzare connessioni ad internet via modem; etc.). Di fatto i
gruppi servono per gestire con maggiore flessibilità l'accesso ai file e di conseguenza l'uso delle risorse.
L'amministratore di sistema può creare un gruppo e gli account per gli utenti che amministreranno il gruppo.
Il file /etc/group contiene l'elenco dei gruppi di utenti presenti nel sistema. Ad ogni gruppo è associata una riga
nella quale si trova l'IDgroup e l'elenco degli utenti che ne fanno parte. Alcuni sistemi Linux, alla creazione di un
nuovo utente, se non si specifica il gruppo principale, di default creano un gruppo con lo stesso nome dell'utente
di cui l'utente diventa titolare. Altri sistemi hanno il gruppo "users" in cui vengono automaticamente inseriti tutti
gli utenti aggiunti al sistema. Le righe di /etc/group si presentano nella seguente forma:
GroupName:Password:GroupID:User1,User2,...,UserN
GroupName
Password
Indica il nome del gruppo.
Indica la password del gruppo. Solitamente non viene data una password al gruppo ma solo ai
singoli utenti.
GroupID
Indica l'ID associato a quel gruppo.
User1,...,UserN E' l'elenco degli users aventi tale gruppo come gruppo supplementare. I nomi dei singoli users
devono essere sparati da una virgola.
groupadd
Crea un nuovo gruppo. Il nuovo gruppo verrà aggiunto ai file di sistema necessari.
SINTASSI: # groupadd [opzioni] nome_gruppo
Opzioni:
[-o] -g #gid
Specifica il valore numerico dell'identificatore del gruppo (#gid). Deve essere univoco, a
meno che si usi l'opzione -o.
groupdel
Modifica i file di account del sistema, rimuovendo tutte le voci che si riferiscono al nome del gruppo specificato
(che si suppone esistente). Non è possibile rimuovere il gruppo primario di un utente senza aver rimosso prima
quest'ultimo.
SINTASSI: # groupdel nome_gruppo
groupmod
Modifica la definizione di un gruppo sul sistema.
SINTASSI: # groupmod [opzioni] groupName
Opzioni:
[-o] -g #gid
Modifica l'id del gruppo groupName in #gid. Il flag -o consente l'uso di un #gid non univoco.
-n group_name Modifica il nome del gruppo groupName nel nuovo nome group_name.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 24
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Ogni account utente è caratterizzato da: username (pubblico), userid (pubblico), password (privata), groupname
(pubblico), groupid (pubblico).
useradd
Comando di basso livello per la creazione di un nuovo utente (analogo alla procedura guidata offerta dal
comando adduser nomeutente).
SINTASSI: # useradd [opzioni] nomeUtente
Opzioni:
-d home_dir
Setta la home-directory dell'utente
-m
Crea la home-directory dell'utente
-k /etc/skel
Copia i file i file predefiniti nella home del nuovo utente
-e #YYYY-MM-DD
Imposta la data di scadenza dell'account
-f giorni_inattività
Indica il numero di giorni, che intercorrano fra la data di expire della password e la
disabilitazione dell'account
-g/--gid nome_gruppo/#gid
Nome o #gid del gruppo principale assegnato al nuovo utente. Tale gruppo
deve esistere!
-G gruppo1[,gruppo2,...,gruppoN] Lista di gruppi supplementari assegnati all’utente. Tali gruppi devono esistere
-p password_criptata
Setta la password per il nuovo utente. La password inserita dev'essere la versione
crittografata (hash MD5)
-s defaultShell
Nome della shell di login dell’utente
[-o] -u #uid
Valore numerico assegnato all’id utente. Dev'essere univoco a meno che non si usi
l'opzione -o.
-D [opzioni]
Modifica le impostazioni di default di un nuovo utente
# useradd -d /home/ciccio -m -k /etc/skel -g 100 -s /bin/bash ciccio
passwd
Comando che permette di settare o modificare la password di un utente. L'utente root può modificare le
password di ogni utente, mentre gli utenti normali possono modificare solo la propria.
SINTASSI: # passwd [opzioni] nomeutente
Opzione:
-d
Disabilita la password per l'utente
Il file /etc/passwd è il database degli utenti su ogni sistema Unix. Ad ogni user è dedicata una riga che definisce
quali sono i suoi principali attributi. Sui sistemi Unix meno recenti in questo file viene scritta anche la password
(criptata); su quelli più recenti essa viene scritta, generalmente, in /etc/shadow, che ha maggiori restrizioni in
termini di sicurezza (visualizzate i diritti associati al file /etc/passwd).
Le righe di /etc/passwd si presentano nella seguente forma:
Username:Password:UserID:GroupID:Info:HomeDirectory:Shell
Username
Password
Nome di login al sistema dell'utente
Campo riservato alla password dell'utente. Può essere scritta direttamente in forma criptata o
esserci semplicemente una x (la password c'è ma è scritta altrove, di solito in /etc/shadow). Se
c'è un * significa che l'utente o non ha una password o la password non è valida (in questo caso
non gli è permesso il login)
UserID
ID dell'user
GroupID
ID del gruppo di appartenenza
Info
Contiene informazioni sull'utente non necessarie al sistema (nome esteso, numero di telefono,
mail,etc...)
HomeDirectory Indica la directory della home dell'utente
Shell Indica la shell di default per l'utente
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 25
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Storicamente su Unix il file /etc/passwd conteneva l'elenco di tutti gli utenti e la loro password in forma criptata.
Per la stessa natura di Unix, tutti gli utenti devono poter aver accesso in lettura a questo file, per cui esporre le
password di tutti, seppur criptate, risultava rischioso per la sicurezza del sistema.
Su tutti i sistemi Linux e Unix recenti, la gestione della password è stata migliorata sia in termini di sicurezza
che di versatilità, affiancando al normale /etc/passwd la gestione del file /etc/shadow che introduce nuove
funzionalità (vedi i diritti associati al file /etc/shadow e confronta con /etc/passwd). Questo file è leggibile solo
dal root, mentre viene lasciato l'accesso in lettura a /etc/passwd per tutti gli utenti. Le password in /etc/shadow
sono criptate con algoritmi più complessi e robusti. È possibile gestire il tempo di scadenza, la durata minima e
massima e i tempi di notifica della password.
Il file /etc/shadow è il database delle password sui sistemi Unix più evoluti. In esso sono elencate, per ogni
utente, la password (criptata) e vari parametri ad essa connessi (ultima modifica, durata massima e minima,
ecc...). Ad esso fanno riferimento diversi files, fra cui /etc/passwd e tutti i comandi per la gestione degli utenti
(useradd, userdel, usermod).
Le righe in /etc/shadow si presentano nella seguente forma:
Username:password:lastchange:min:max:warn:inactive:expire
Username
Password
Il nome dell'utente a cui fa riferimento la password
Password criptata (13 caratteri). Può assumere anche altri valori quali * che sta ad indicare che
l'utente è disabilitato e !! (o nessun carattere) che indica che l'utente non ha password
lastchange
Numero di giorni compresi fra il 1 gennaio 1970 e l'ultima modifica della password
min
Minimo numero di giorni dall'ultima data di modifica prima di poter nuovamente cambiare la password
max
Durata massima della password (sempre in giorni)
warn
Numero di giorni di preavviso all'utente prima di invalidare la password
inactive Numero di giorni di inattività possibili per l'utente
expire Data dopo la quale il login non può più essere effettuato
userdel
Rimuove l'account di un utente, ma non i file relativi.
SINTASSI: # userdel [opzioni] nome_utente
Opzioni:
-r
Rimuove anche i file della home_directory utente
usermod
Comando che permette di cambiare le impostazioni di un account creato precedentemente. L'utente che lancia il
comando deve possedere i privilegi di amministratore.
SINTASSI # usermod [opzioni] login-name
Opzioni:
-d home_dir
Modifica la home_dir dell'utente
-e expire_date Modifica l'expire_date
-f inactive_days Modifica il numero di giorni che intercorrono fra la scadenza della password e la disabilitazione dell'account
-g initial_group Modifica il gruppo primario
-G groups
Modifica i Gruppi secondari
-l login
Cambia il nome di login dell'utente
-p password
Modifica la password criptata (sconsigliato)
-s shells
Modifica la shell di default dell'utente
-u UID
Modifica l'UID
-L
Esegue il lock dell'account
-U
Operazione inversa del lock, ovvero riabilita l'account
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 26
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
su (substitute user)
Cambia id utente o diventa superuser, se il nome utente non è specificato.
SINTASSI: $ su [opzioni] [nomeutente]
Opzioni:
-l
Fornisce un ambiente simile a quello di login dell'utente
$ su
(si intende root)
Esercizi
1. Creare un nuovo gruppo di nome 'new' assegnando l'id 1001 che corrisponde al gid di un gruppo esistente.
2. Creare un nuovo utente con lo stesso nome del gruppo appena creato e assegnargli il gruppo new.
3. Cambiare il gruppo principale dell'utente appena creato in userA e assegnare l'utente al gruppo supplementare
supA.
4. Rimuovere il gruppo creato all'esercizio 1. Viene rimosso anche il gruppo con #gid=1001?
5. Definire una serie di comandi che consentano di creare manualmente un nuovo utente, senza far ricorso ai
comandi useradd o adduser. Si suppone che il comando di riferimento sia:
useradd -u 1006 --gid 1007 -d /home/ciccio -m -k /etc/skel -s /bin/bash ciccio
a. Loggarsi come amministratore
b. Editare il file /etc/passwd
ciccio:x:1006:1007::/home/ciccio:/bin/bash
c. Editare il file /etc/group
ciccio:x:1007
d. Editare il file /etc/shadow
ciccio:......:15482:0:999:7:::
e. Creare la home directory
mkdir /home/ciccio
f. Inizializzare i file della home
cp /etc/skel/* /home/ciccio
g. Cambiare il proprietario della home directory
chown ciccio:ciccio /home/ciccio
h. Cambiare i diritti di accesso alla home directory
chmod 700 /home/ciccio
i. Impostare una password per l'utente ciccio
passwd ciccio
Comandi informativi
Consentono di ottenere dal sistema informazioni sugli utenti.
id
Mostra gli identificatori numerici (uid, gid, groups), e i nomi simbolici ad essi associati, dell'utente indicato
come argomento.
SINTASSI: $ id [opzioni] [nomeutente]
Opzioni:
-u
Filtra sull'utente (mostra solo l'id)
-g
Filtra sul gruppo principale (mostra solo l'id)
-G
Filtra sui gruppi supplementari (mostra solo l'id)
-n
Se utilizzato assieme a -u, -g e -G mostra solo il nome anzichè l'id numerico
silvia@ubuntu:~ id silvia
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 27
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
whoami
Mostra chi è l'utente della shell
SINTASSI: $ whoami
who
Mostra tutti gli utenti correntemente connessi al sistema e i relativi dati (nome del terminale, data-ora)
SINTASSI: $ who [opzioni]
Opzioni:
-a
Mostra tutti gli utenti
-l
Mostra il login dei processi di sistema
-q
Mostra il nome degli utenti loggati e il loro numero complessivo
-r
Mostra il runlevel corrente
groups
Mostra i nomi dei gruppi a cui appartiene l'utente correntemente loggato o di quello specificato.
SINTASSI: $ groups [nome_utente]
last
Lista gli ultimi login/logout degli utenti sul sistema e gli ultimi riavvii del sistema, interpellando il file
/var/log/wtmp, altrimenti non visualizzabile.
Visualizza: nome utente, console di login, identificativo del display, kernel, data di login, tempo di permanenza.
SINTASSI: $ last [nomeutente]
$ last root
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 28
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Variabili
Permettono di memorizzare stringhe ed interi. I nomi sono case sensitive e possono contenere lettere, cifre e
underscore '_', ma non spazi o punteggiatura; non possono iniziare con una cifra.
Definizione
SINTASSI: $ nomevar=valore
$ a=5
$ msg=”Benvenuti alla”
Il valore di una variabile viene visualizzato attraverso il comando echo seguito dal nome della variabile
preceduto dal simbolo $. Per delimitarne il nome si usano le parentesi graffe.
$ echo $msg ${a}a lezione
Benvenuti alla 5a lezione
Variabili d'ambiente
L'ambiente è un insieme di variabili che condizionano un processo eseguito dalla shell. Una variabile d'ambiente
contiene valori di comodo caratteristici dell'ambiente di shell di un dato utente, è visibile a tutti i programmi
eseguiti dalla shell, fornisce informazioni ai programmi ed eventualmente ne condiziona l'esecuzione.
printenv
Il comando printenv (print environment) stampa l'elenco delle variabili d'ambiente. Se provvisto di argomento,
stampa il valore della variabile d'ambiente.
SINTASSI: $ printenv [nomevariabile]
USER Utente che esegue la bash
HOME Home directory dell'utente che esegue la shell
PS1
Prompt
HOSTNAME
Nome del computer
SHELL Pathname assoluto della shell in uso
PWD Percorso della cwd
OLDPWD
Percorso della directory precedentemente visitata
UID
Identificativo numerico dell'utente loggato
GROUPS
Vettore degli ID dei gruppi a cui l'utente appartiene
PPID Process ID del processo genitore della shell attuale
PATH
La variabile PATH contiene i percorsi in cui la shell ricerca gli eseguibili dei comandi, memorizzati sottoforma
di elenco di directory separate da due punti. Il valore di default per tutti gli utenti è impostato
dall'amministratore. L'utente può modificarla nel corso dell'esecuzione inserendo un path a cui fa spesso
riferimento o fare in modo che venga modificata ad ogni avvio. Tale variabile serve ad evitare che l'utente che si
interfaccia con la shell debba scrivere per ogni comando tutto il percorso.
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games
Nell'esecuzione di un comando distinguiamo 2 casi.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 29
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
1) Quando il comando non contiene il carattere '/', la shell tenta di localizzarlo mediante i seguenti passi:
a. verifica che il comando sia una funzione della shell;
b. verifica che sia un comando incorporato (built-in);
c. cerca nelle directory specificate nell'ordine in cui sono elencate nella variabile PATH un file
eseguibile con il nome specificato. La shell esegue il primo file eseguibile con il nome specificato che
trova.
2) Quando il comando contiene uno o più '/', la shell esegue il programma corrispondente al pathname
specificato. Quando si specifica il pathname per eseguire un comando, è necessario utilizzare almeno un
carattere '/'.
Per eseguire un comando il cui file è nella directory corrente, sarà necessario utilizzare la sintassi ./nome_file.
Per ovviare a questo problema è possibile inserire la directory '.' nella variabile PATH.
Exit status (?)
Ogni comando shell, al termine dell'esecuzione, fornisce un exit status ovvero un valore intero compreso tra 0 e
255 che ne descrive l'esito dell'esecuzione. Per convenzione:
0
indica che il programma è stato eseguito con successo;
[1-255] indica che il programma non è terminato correttamente (il significato del valore dell'exit status è
descritto nella pagina di manuale).
La shell memorizza l'exit status dell'ultimo comando eseguito nella variabile ?.
$ cat /etc/shadow
$ echo $?
1
export
Per rendere d'ambiente una variabile dichiarata si usa il comando export.
L'assegnazione o la creazione di una variabile ha validità solo nel'ambito della shell stessa.
SINTASSI: $ export nome[=valore]
set/unset
Il comando set visualizza tutte le variabili definite nella shell in esecuzione, anche quelle create manualmente.
Il comando:
SINTASSI: $ unset nomevariabile
rimuove la variabile.
Esercizi
1. Copia il file /bin/echo nella tua home directory ed eseguilo con gli argomenti “Hello World!”
2. Aggiungi alla variabile PATH la directory '.' facendo in modo che il comando echo eseguito sia sempre quello
della copia nella tua home directory.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 30
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Visualizzazione ed editing di file
cat
Il comando cat (concatenate) legge ogni file argomento in sequenza e mostra sullo standard output il contenuto,
ovvero concatena file. L'operazione non genera alcun file e si utilizza per controllare il contenuto di file testuali.
SINTASSI: $ cat [opzioni] file
Opzione:
-n
Numera le righe sullo stdout
Esempio:
file1: Questo è il primo file
file2: Questo è il secondo file
$ cat file1
$ cat file1 file2
file
Visualizza il tipo di uno o più file.
SINTASSI: $ file file_esempio
user@ubuntu:~$ file ./*
./esempio_sort_num.txt: ASCII text
./esempio_sort.txt: ASCII text
./esempio_uniq.txt: UTF-8 Unicode text
./file_esempio.txt: ASCII text
Esercizio: Che tipo di file è il file /var/log/wtmp?
less (more)
Visualizza un file in modo interattivo. Apre il paginatore e formatta il testo in pagine per facilitarne la lettura.
SINTASSI: $ less nomefile
more è un paginatore alla stregua di less, ma consente solo lo scorrimento delle pagine in avanti.
N.B. I paginatori si possono scorrere con i tasti invio, spazio e frecce. Per uscire dal paginatore si usa Q. Per
chiedere l'help del paginatore si usa H.
$ ls -l | less
(Si veda la sezione Operatori di redirezione)
Esercizi
1. Visualizzate il contenuto del file /etc/passwd.
2. Visualizzate l'inizio e la fine del file /etc/passwd attraverso un paginatore.
3. Determinare la tipologia dei file /etc/passwd e /bin/ls.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 31
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Canali di comunicazione e ridirezione
I programmi dispongono di 3 canali di comunicazione standard (standard file descriptor):
0 Standard input (tastiera)
1 Standard output (terminale)
2 Standard error (terminale)
La shell consente il reindirizzamento dei 3 canali standard all'interno di file con la sintassi:
$ comando operatore file
Operatori di ridirezione dello standard output
Ridirige lo std output del comando sul file. Se il file non esiste, viene creato; se il file esiste, viene sovrascritto
(>) oppure il nuovo output viene accodato (>>).
SINTASSI: $ comando > file
> ridirige lo standard output in modalità truncate
SINTASSI: $ comando >> file
>> ridirige lo standard output in modalità append
$ who
$ who > whofile
$ cat whofile
$ ls -l > stdout.txt
$ cat stdout.txt
$ echo parola esempio >> file_prova
$ cat file1 file2 > file3
Operatori di ridirezione dello standard error
Ridirige lo std error del comando su file. Se il file non esiste, viene creato; se il file esiste, viene sovrascritto (2>)
oppure il nuovo output viene accodato (2>>).
SINTASSI: $ comando 2> file
2> ridirige lo standard error in modalita truncate
SINTASSI: $ comando 2>> file
2>> ridirige lo standard error in modalità append
Operatori di ridirezione dello standard input
Ridirige lo std input del comando su file, cioè fa sì che l'input di un comando provenga, anziché da tastiera, da
un file.
SINTASSI: $ comando < file
< ridirige lo standard input
$ grep 'ciao' /home/silvia/file
$ grep 'ciao' < /home/silvia/file
L'interprete standard di comandi (sh), permette di eseguire comandi letti da una stringa a riga di comando (-c),
dallo standard input (-s) o da un file specificato.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 32
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
comandi
pwd
ls
echo “comandi“
mkdir redirectdir
$ sh < comandi
SINTASSI: $ comando << file
<< redirezione doppia dell'input con accodamento fino alla digitazione di un carattere di escape o buffer pieno
$ grep 'ciao' << eof
> ciao ciao
> eof
$ sh << eof
> ls
> pwd
> eof
Per reindirizzare standard output e standard error nello stesso file si può utilizzare l'operatore &> (&>>)
SINTASSI: $ comando &> filename
Più reindirizzamenti possono essere effettuati nella stessa linea di comando:
$ comando < in > out 2> err
Operatore di pipeline
Canale di ridirezione che collega lo standard output di un programma allo standard input di un altro (vedi figura).
Utilizza il simbolo |.
SINTASSI: $ comando1 | comando2 | …
$ ls -l /etc | less
Liste di comandi
Sulla stessa linea di comando è possibile eseguire una lista di comandi separandoli con caratteri speciali.
Tipi di esecuzione:
sequenza
SINTASSI: $ comando1 ; comando2
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 33
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Indipendentemente dal loro exit status, con ';' i due comandi vengono eseguiti in sequenza (prima comando1 e
poi comando2) .
$ env > env-silvia ; cp env-silvia /tmp/
$ ls -l /tmp/env-* env-* (Per verifica)
$ (date;ls) > compfile
concorrenza
SINTASSI: $ comando1 & comando2
Il comando1 viene eseguito in background, il comando2 in foreground (si veda la sezione Gestione dei processi).
condizione
SINTASSI: $ comando1 && comando2
Il comando1 viene eseguito sempre; il comando2 soltanto se il primo è terminato con successo (exit status 0).
Supponiamo che il file /tmp/env1 non esista
$ cp /tmp/env-silvia1 . && cat env-silvia1 env-silvia > env-silviax2
In questo caso cat non viene eseguito perche' cp non ha trovato il file da copiare. Una volta generato il file da
copiare, eseguendo lo stesso comando il cat verrà eseguito perché cp terminerà senza errori.
esclusione
SINTASSI: $ comando1 || comando2
Il comando1 viene sempre eseguito; il comando2 soltanto se il primo è terminato con exit status diverso da 0.
$ chown silvia /tmp/env-vito || rm -f env-silvia
In questo caso il secondo rm viene eseguito perché l'utente corrente non può cambiare il proprietario di un file.
$ rm -f /tmp/env-silvia || rm -f env-silvia1
In questo caso il secondo rm non viene eseguito perché il primo rm termina senza errori.
Exit status di liste di comandi
Quando si eseguono più programmi in una sola linea di comando (come nelle pipeline o nelle liste di comandi),
l'exit status è relativo all'ultimo comando eseguito.
Script BASH
Non c'è differenza tra quello che si può scrivere utilizzando la shell interattivamente o mediante uno script.
Uno script di shell BASH è un file di testo che:
- contiene comandi di shell;
- inizia con la stringa “#!/bin/bash”;
- ha permesso di esecuzione.
I primi due caratteri #! indicano che il file è uno script o più in generale un programma interpretato. La stringa
successiva è il pathname dell'interprete per il programma.
La shell esegue l'interprete specificato nella prima linea passandogli come argomento il nome dello script.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 34
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Filtri e programmi di utilità generica
I programmi introdotti qui di seguito, così come cat, less e quasi tutti i comandi Unix, in mancanza di specifiche
diverse fornite a linea di comando effettuano una trasformazione sullo standard input.
sort ordina le linee di un file di testo
wc è un programma che permette di contare caratteri, parole e linee
head e tail estraggono linee da un file di testo
uniq elimina linee ripetute consecutive da un file
cut estrae sezioni di una riga di testo
diff confronta due file di testo
grep seleziona linee di specificata struttura (vedi sezione Comandi di ricerca di stringhe)
sort
Ordina il file ottenuto concatenando i file indicati, e scrive il risultato sullo standard output. Se non è indicato
alcun file, ordina lo standard input.
SINTASSI: $ sort [opzioni] [file1 ... fileN]
Opzioni:
-b
-c
-d
-f
-i
-m
-n
-r
-o file
Ignora i blank iniziali (spazi e tabulazioni)
Controlla se i file indicati sono già ordinati. Se non lo sono, viene emessa una segnalazione di errore
e il programma mostra la prima riga che non rispetta l'ordine.
Dictionary order: ignora tutti i caratteri che non siano lettere, numeri o spazi
Non distingue tra lettere maiuscole e minuscole
Ignora i caratteri speciali al di fuori del set ASCII puro (ignora caratteri non stampabili)
Fonde insieme i file indicati che devono essere già ordinati (non effettua ordinamento)
Sort numerico: considera anche il segno meno e il punto decimale
Reverse: inverte il senso di ordinamento
Utilizza il file indicato per inserire il risultato dell'operazione, invece di utilizzare lo standard output
$ cat numeri
10
1
2
5
77
750
8
$ sort numeri
$ sort -r numeri
$ sort -n numeri
$ cat esempio_sort.txt
RIGA A
RIGA B
RIGA D
RIGA C
$ sort esempio_sort.txt
$ sort -c esempio_sort.txt
$ sort numeri esempio_sort.txt > sort1
$ sort -o sort numeri esempio_sort.txt
$ cat esempio_sort_num.txt
1.1
100
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 35
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
5
11
$ sort esempio_sort_num.txt
$ sort -n esempio_sort_num.txt
wc
Conta e mostra il numero di linee (-l), il numero di parole (-w), il numero di caratteri (-m) e il numero di byte
(-c) di uno o più file. L'opzione di default è -lwc (righe, parole e byte).
SINTASSI: $ wc [-lwmc] [file]
Formato risposta: [righe] [parole] [caratteri] [byte] nome_file
I campi restituiti dalla risposta vengono mostrati sempre nell'ordine del formato della risposta,
indipendentemente dall'ordine di inserimento dei flag nel comando. Semplicemente viene effettuato un filtro dei
campi mostrati a seconda che vengano o meno inseriti tutti i flag.
$ cat elencotel
roberto 48000529
marco 3452328
mario 5567843
luigi 67421467
$ wc elencotel
4(n.linee) 8(n. parole) 60(n. byte) elencotel
$ wc -w -l -m -c esempio_uniq.txt
6 37 209 215 esempio_uniq.txt
head
Copia le prime X linee o byte di un file sullo standard output (default X=10). Se nessun file è specificato, copia
linee dallo standard input.
SINTASSI: $ head [opzioni] [filename]
Opzioni:
-c #X
-c -#X
-n #X
-n -#X
Mostra i primi #X byte di un file
Mostra i byte di un file esclusi gli ultimi #X byte
Mostra le prime #X righe di un file (equivale a -#X)
Mostra le righe di un file escluse le ultime #X
$ cat elencotel
$ head -1 elencotel (equivale a $ head -n 1 elencotel)
$ head -n -1 elencotel
$ head -c 6 file_esempio.txt
15 fif
tail
Copia il file sullo standard output, iniziando da un posto specificato (linee, blocchi o caratteri dall'inizio o dalla
fine del file). Se non è specificato nessun file, copia lo standard input. Mostra le ultime righe o byte di un file, di
default le prime 10 righe.
SINTASSI: $ tail [opzioni] [file]
Opzioni:
-c #X
-c +#X
Mostra gli ultimi #X byte di un file
Mostra gli ultimi byte di un file a partire dal byte #X
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 36
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
-n #X
-n +#X
Mostra le ultime #X righe di un file (equivale a -#X)
Mostra le ultime righe di un file a partire dalla riga #X
$ cat elencotel
$ tail -c +3 elencotel
$ tail -n 3 elencotel
$ tail -c 3 file_esempio.txt
ne (l'ultimo byte è EOF!)
$ tail -n +13 file_esempio.txt
3 three
2 two
1 one
and mission...
uniq
Mostra od omette le linee ripetute. Se non è specificato nessun flag, visualizza tutte le righe senza ripetizioni.
SINTASSI: $ uniq [opzioni] file
Opzioni:
-c
-d
-f N
-i
-s N
-u
-w N
Per ogni riga indica il numero di occorrenze
Mostra solo le linee duplicate
Salta il confronto delle prime N parole
Nel confronto ignora la differenza tra lettere maiuscole e minuscole
Salta il confronto dei primi N caratteri
Mostra solo le linee uniche non duplicate
Confronta non più di N caratteri per riga
$ cat esempio_uniq.txt
Questa riga è presente una sola volta.
Questa riga è presente due volte.
Questa riga è presente due volte.
Questa riga è presente tre volte.
Questa riga è presente tre volte.
Questa riga è presente tre volte.
$ uniq esempio_uniq.txt
$ uniq -cd esempio_uniq.txt
$ uniq -u esempio_uniq.txt
$ uniq -cs 22 esempio_uniq.txt
cut
Permette di estrarre sezioni di una riga di testo, delimitate da un carattere separatore.
SINTASSI: $ cut [opzioni] [file]
Opzioni:
-b range
-c range
-d separatore
-f intervallo
Estrae solo i byte indicati nel range (N, N-M, -N, N-)
Estrae solo i caratteri indicati nel range (N, N-M, -N, N-)
Indica il carattere/stringa separatore da utilizzare (anzichè TAB)
Indica la lista dei campi da estrarre (N, N-M, -N, N-)
$ cat cut_file
nome
pippo
cognome matricola
pluto
123456
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 37
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
ciccio
$ cut -f 2 cut_file
pallino
098765
$ cat cut_file_delim
nome;cognome;matricola;email;CDL
pippo;pluto;123456;[email protected];AUT
ciccio;pallino;098765;[email protected];INF
$ cut -d \; -f 2-3,5 cut_file_delim
Considera ogni riga composta da più stringhe separate dal (;) e ne visualizza solo la seconda, la terza e la quinta.
diff
Trova differenze tra due file. Questo comando risulta molto utile per confrontare i file di configurazione. Se si
sostituisce a uno dei file da confrontare il trattino (-), questo indica che il confronto verrà eseguito con lo
standard input.
SINTASSI: $ diff [opzioni] file1 file2
Opzioni:
-b
-B
-r
--brief
--ignore-case
Ignora le differenze nella quantità di spazi bianchi
Ignora le differenze che consistono solo in righe vuote
Confrontando due directory, confronta ogni sottodirectory ricorsivamente
Riferisce solo se i file sono diversi, senza mostrarne le differenze
Considera allo stesso modo maiuscole e minuscole, ignorando ogni relativa differenza
$ diff –brief /etc/passwd /etc/shadow
colordiff
Il comando ha le stesse opzioni ed effetti di diff ma mostra un output colorato che permette una maggiore
leggibilità.
Esercizi
1. Conta il numero di linee contenute nel file /etc/passwd
2. Visualizza le righe del file /etc/passwd in ordine alfabetico
3. Nella pagina di manuale di sort trova l'opzione per l'ordinamento numerico
4. Conta i file che terminano con '.log' nella directory /var/log
5. Sapendo che l'opzione '-k POS' del comando sort consente di ordinare le righe di un testo in base al k-esimo
campo, ordina i file nella tua directory in base al numero di link e visualizza l'elenco con less.
6. Visualizza i file in /etc e le relative informazioni ordinati per dimensione.
7. Crea un file contenente tutte le variabili di ambiente denominato env-MATR e copialo sotto /tmp. Concatena i
due file e visualizza il contenuto ordinato senza mostrare le linee ripetute. Visualizza prima le linee che non
presentano, ripetizioni poi quelle ripetute.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 38
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Gestione dei processi
Avvio del sistema
Il BIOS (Basic Input Output System) è l'insieme di routine eseguite all’avvio del sistema e che svolgono funzioni
di collegamento tra il software e l’hardware (controllano la presenza di RAM, le periferiche IDE, la tastiera,
etc.). Il BIOS si occupa di caricare il primo settore (Master Boot Record) del primo cilindro del dispositivo di
boot (di default il primo hard disk del primo canale IDE) ed esegue le istruzioni in esso contenute, cedendo il
controllo del sistema al Boot Loader, un piccolo programma contenuto nei primi 512 byte del Master Boot
Record che si occupa di caricare il kernel in memoria ed eseguirlo.
Un singolo boot loader è in grado di caricare molti tipi di kernel e quindi anche diversi sistemi operativi presenti
in partizioni differenti. Naturalmente può essere caricato un solo kernel per volta.
Il kernel di GNU/Linux, cioè Linux, è in grado di accettare parametri da riga di comando. Una volta avviato, si
decomprime, esamina ed elabora i parametri passati ed avvia /sbin/init. Il processo init è il primo processo
eseguito subito dopo la fase di bootstrap del sistema, dopo che il kernel è stato caricato, ed è avviato direttamente
dal kernel.
init viene spesso denominato il genitore di tutti i processi presenti su un sistema GNU/Linux (più correttamente è
l'avo di tutti i processi), rimane attivo per tutto il funzionamento del sistema ed ha il compito di inizializzare e
gestire il sistema ad un livello più alto di quello del kernel, per permetterne l'utilizzo da parte degli utenti.
Il suo ruolo fondamentale è quello di eseguire tutti i processi necessari al funzionamento del sistema secondo le
direttive specificate nel file /etc/inittab, in cui ogni riga ha una struttura di tipo id:runlevel:action:process:
id: identificatore univoco della riga;
runlevel: elenco dei runlevel per i quali il comando specificato deve essere applicato;
action: azione da intraprendere da parte di init;
command: nome del file eseguibile associato all'azione.
init svolge una serie di compiti amministrativi fondamentali per il funzionamento del sistema e non può mai
essere terminato. La riga contenente la direttiva sysinit è indipendente dal runlevel corrente ed è associata ad un
file eseguibile che si occupa di eseguire le operazioni preliminari, di configurazione del sistema.
Successivamente vengono avviati i servizi per l’utilizzo del sistema, i deamon.
/etc/inittab contiene solitamente istruzioni per l'attivazione dei terminali e la specifica del runlevel di default.
Runlevel
Linux può funzionare in modalità diverse, ovvero la sua esecuzione dipende dal valore di un parametro
importantissimo detto runlevel, per mezzo del quale init cambia la modalità di funzionamento del sistema. Un
runlevel è una configurazione software che specifica i servizi da attivare o disattivare sul sistema.
I valori di runlevel riservati sono:
0: halt, spegnimento del sistema
1: single user mode
6: reboot, riavvio del sistema
Quelli configurabili vanno dal 2 al 5 e ciascuna versione di UNIX o distribuzione di Linux attribuisce loro un
significato (3: full multi user; 5: full multi user + sessione grafica).
Il comando
SINTASSI: $ runlevel
restituisce il valore del runlevel corrente.
Digitando il comando
SINTASSI: $ init numero_ runlevel
si manda il sistema in esecuzione in quel runlevel.
# init 6
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 39
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
La direttiva initdefault in /etc/inittab indica il runlevel di default di avvio del sistema: id:2:initdefault: .
I servizi da attivare o disattivare in ciascun runlevel sono specificati nelle directory /etc/rcX.d dove X è il
runlevel.
shutdown
Spegne il sistema in maniera sicura. Tutti gli utenti loggati ricevono un messaggio quando viene eseguito tale
comando. È possibile spegnere o riavviare il sistema immediatamente, dopo un intervallo di tempo, oppure ad un
orario prefissato mediante l’argomento time, che può avere diversi formati: now (spegne il sistema
immediatamente); +m (spegne il sistema dopo m minuti); hh:mm (specifica l'orario di spegnimento).
SINTASSI: $ shutdown [-krh] time [messaggio_avviso]
Opzioni:
-k
Non spegne realmente il sistema, ma manda il messagio di avviso specificato a tutti gli utenti connessi
-r
Riavvia il sistema dopo lo spegnimento, equivalente a $ init 6
-h
Spegne il sistema, equivalente a $ init 0
Controllo dei processi
L'istanza di un programma in esecuzione in ambiente UNIX viene detta processo. Ogni programma può generare
diversi processi. Ad esempio, ogni utente collegato al sistema esegue la sua shell; ogni utente può eseguire
un'istanza di vi.
Nei sistemi Unix ad ogni processo è assegnato un intero univoco, compreso tra 0 e 32767, denominato PID
(process identification number), e un parent PID (PPID), ovvero il PID del processo che lo ha generato.
Il sistema operativo assegna ad ogni nuovo processo un PID che il processo mantiene fino alla sua terminazione.
I PID possono essere riutilizzati dopo la conclusione del processo e associati ad un nuovo processo. La maggior
parte delle implementazioni di UNIX utilizza un algoritmo che posticipa il più possibile il riuso dei PID in modo
da evitare che processi eseguiti a breve distanza di tempo utilizzino lo stesso PID.
Il processo con PID 0 è solitamente lo scheduler (anche noto come swapper). Al processo init, invece, è
associato PID=1 e nessun PPID.
Tutti gli altri processi si creano tramite system call fork a partire da init. Il nuovo processo è detto processo
“figlio” mentre il processo che ha invocato la fork è detto processo “genitore”. Nell'esecuzione dei programmi, il
sistema operativo UNIX effettua normalmente le seguenti operazioni:
1. creazione di un nuovo processo;
2. esecuzione del programma figlio nello spazio del nuovo processo;
3. attesa dal processo padre della terminazione del processo figlio;
4. terminazione dell'esecuzione del processo figlio.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 40
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
fork è una system call speciale che viene invocata una volta, ma in caso di successo ritorna due volte e restituisce
due valori diversi: una volta nel genitore restituendo il PID del figlio; una volta nel figlio restituendo 0.
La fork restituisce il PID del figlio per consentire al genitore di tenere traccia del processo generato. Ogni
processo può avere più figli e non esistono system call che elenchino i figli di un dato processo, mentre ogni
processo ha sempre un unico genitore.
Il processo figlio è una copia integrale del genitore. Il figlio ha una copia delle variabili del processo genitore,
quindi la modifica di una variabile nello spazio di indirizzamento del figlio non modifica la variabile nel
processo genitore.
Dopo la fork, in entrambi i processi viene eseguita l'istruzione successiva alla fork. Il modo più semplice per
distinguerli ed eseguire istruzioni diverse nel genitore e nel figlio è controllare il valore di ritorno della fork.
La fork consente anche di suddividere il carico di lavoro tra diversi processi assegnando ad ognuno di essi parte
del lavoro. Un caso frequente è quello di un programma che fornisce un determinato servizio: ad ogni richiesta
ricevuta, il processo genera un figlio e gli assegna la richiesta da servire, mentre il genitore ritorna in attesa di
nuove richieste.
Ad ogni processo sono associati due utenti:
Real user: utente che ha lanciato il processo;
Effective user: utente che determina i diritti del processo.
Solitamente i due utenti coincidono, ma quando un file eseguibile ha il set-uid-bit impostato, il corrispondente
processo avrà:
Real user: utente che ha lanciato il processo
Effective user: utente proprietario dell'eseguibile.
Questo metodo consente agli utenti di effettuare operazioni che normalmente non potrebbero fare e al
programma di stabilire l'effettiva identità dell'esecutore. Il processo figlio eredita dal genitore una serie di
proprietà tra cui real ed effective UID.
Esempio : Il comando passwd
Il comando passwd serve per modificare la password d'accesso al sistema. Quando eseguito da un utente
normale, chiede all'utente la vecchia password, poi una volta verificato che la password coincide, chiede una
nuova password 2 volte e sostituisce il campo corrispondente nel file di password del sistema (normalmente
/etc/shadow). L'utente che esegue passwd non ha il permesso di modificare il file di sistema, ma il programma
passwd ha il set-uid-bit impostato.
$ ls -la /usr/bin/passwd
-rwsr-xr-x 1 root root 42824 apr 9 2012 /usr/bin/passwd
Quando viene eseguito da root, il comando passwd permette di cambiare la password di qualsiasi utente. Non
chiede mai la vecchia password (neanche quando si tratta della password di root). Dal momento che qualsiasi
utente esegua passwd ottiene i permessi di root, il comando passwd per accorgersi di essere stato eseguito da root
confronta Real ed Effective user.
ps
Il comando ps (process status) visualizza i processi in esecuzione sul sistema (è una snapshot statica).
Di default su ogni processo dell'elenco vengono visualizzate le seguenti informazioni: il PID, il terminale (TTY)
da cui il processo è stato lanciato, il tempo di CPU utilizzato dal processo (TIME) ed il comando (CMD). In
assenza di opzioni, visualizza i processi eseguiti dalla shell corrente in ordine crescente di PID.
SINTASSI: $ ps [opzioni]
PID
2532
2590
2658
TTY
pts/1
pts/1
pts/1
TIME
00:00:00
00:01:06
00:00:00
CMD
bash
yes
ps
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 41
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Opzioni:
a
-e
-f
-F
f
-o
-p [lista_PID]
-r
-t [lista_tty]
-u [lista_utenti]
x
u
(all) Mostra i processi di tutti gli utenti
Visualizza tutti i processi
(full) Visualizza anche UID (effective user), PPID, argomenti e start time (STIME)
(father) Visualizza informazioni ancora più dettagliate rispetto a -f
Visualizza lo stato (STAT) e la dipendenza padre/figlio (COMMAND)
Consente di specificare l'elenco di informazioni da visualizzare
Solo le informazioni relative ai PID specificati
(running) Restringe la selezione solo ai processi in esecuzione
Seleziona per tty
Mostra solo i processi relativi agli utenti in lista_utenti, se non specificato all'utente corrente.
Mostra i processi di sistema (il tty è criptato)
Mostra informazioni accessorie rispetto al normale ps
USER
silvia
silvia
silvia
%CPU
0.0
6.1
0.0
PID
2532
2590
2657
USER:
PID:
%CPU:
%MEM:
VSZ:
RSS:
TTY:
STAT:
START:
TIME:
COMMAND:
%MEM
0.1
0.0
0.0
VSZ
21824
5872
16872
RSS
4364
608
1264
TTY
pts/1
pts/1
pts/1
STAT
Ss
T
R+
START
13:33
13:33
13:51
TIME
0:00
1:06
0:00
COMMAND
bash
yes
ps u
utente che ha lanciato il processo
Process ID
(tempo di CPU a carico del processo)/(tempo di CPU totale)
(memoria a carico del processo)/(memoria totale)
Virtual Size, quantità di memoria virtuale a carico del processo, espressa in byte
Resident Size, espressa in byte
Teletype (terminale)
caratteri che indicano lo stato del processo
R = running; Ss = sleeping interrompibile; D = sleeping non interrompibile; Z = zombie; X =
dead; T = treased o stopped; W = non residente in memoria; < = alta priorità
orario di inizio del processo
tempo di CPU utilizzato dal processo
nome comando
silvia@ubuntu:~$ ps -u silvia -o pid,ppid,%cpu,%mem
$ ps au
$ ps aux
$ ps aur
$ ps ax | head -n 10
Visualizza i processi utilizzando la notazione BSD
PID TTY STAT TIME COMMAND
1 ? Ss 0:02 /sbin/init
2 ? S< 0:00 [kthreadd]
3 ? S< 0:00 [migration/0]
4 ? S< 0:03 [ksoftirqd/0]
5 ? S< 0:00 [watchdog/0]
6 ? S< 0:00 [events/0]
7 ? S< 0:00 [khelper]
46 ? S< 0:00 [kintegrityd/0]
48 ? S< 4:46 [kblockd/0]
Esercizi
1. Ordina i processi in esecuzione sul sistema in base al nome utente.
2. Elencare tutti i processi in esecuzione sul sistema che hanno TTY pari a ?.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 42
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
pstree
Permette la visualizzazione ad albero dei processi
SINTASSI: $ pstree [opzioni]
Opzioni:
-h
Evidenzia il percorso fino al processo corrente
-p
Mostra il PID
top
Mostra dinamicamente una serie di informazioni sui processi e sul sistema. Lo stato dei processi sulla macchina
viene aggiornato ad intervalli regolari.
SINTASSI: $ top
(con q si esce dal top).
Nella parte superiore sono presenti informazioni generali sul sistema.
TOP: orario di ultimo aggiornamento (consente di capire ogni quanto avviene l'aggiornamento);
UP:
da quanto tempo è acceso il sistema;
USER: numero di utenti connessi;
LOAD AVERAGE:
carico medio della macchina in termini di utilizzo di CPU calcolato per intervalli di 15
min, 5 min, 1 min;
N. TASK:
totali e per stato;
% UTILIZZO CPU:
da parte di US (utente), SY (sistema), etc.;
MEMORIA:
quantità totale e utilizzata/libera/buffer
SWAP: quantità totale e utilizzata/libera/cached
user@ubuntu:~$ top
top - 12:31:19 up 7:12, 2 users, load average: 1.64, 1.45, 1.36
Tasks: 116 total, 4 running, 112 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.7%us, 1.7%sy, 0.0%ni, 33.2%id, 62.5%wa, 0.0%hi, 0.0%si, 0.0%st
Mem:
514296k
total,
493048k used,
21248k free,
136620k buffers
Swap:
0k free,
153360k cached
PID
1983
6059
48
5938
6541
6633
16217
4974
5492
1
2
3
4
5
6
0k
USER
root
root
root
mythtv
user
user
user
root
mysql
root
root
root
root
root
root
total,
PR
15
20
15
20
20
20
20
20
20
20
15
RT
15
RT
15
NI
-5
0
-5
0
0
0
0
0
0
0
-5
-5
-5
-5
-5
0k used,
VIRT
0
42320
0
69804
45252
30156
98.8m
13808
125m
3056
0
0
0
0
0
RES
0
14m
0
7844
14m
15m
25m
2820
17m
1888
0
0
0
0
0
SHR
0
7376
0
5044
8428
10m
12m
2288
5188
564
0
0
0
0
0
S
D
S
S
D
S
S
R
R
S
S
S
S
S
S
R
%CPU
3.7
3.7
1.3
1.3
0.7
0.7
0.7
0.3
0.3
0.0
0.0
0.0
0.0
0.0
0.0
%MEM TIME+ COMMAND
0.0
3.0
0.0
1.5
2.9
3.0
5.0
0.5
3.5
0.4
0.0
0.0
0.0
0.0
0.0
15:26.3
1:29.96
5:00.52
5:13.02
0:01.26
0:39.56
0:07.76
0:28.42
1:00.04
0:02.00
0:00.00
0:00.00
0:03.76
0:00.00
0:00.62
kjournald
Xorg
kblockd/0
mythbackend
gnome-settingsvmware-user-loa
gnome-terminal
vmtoolsd
mysqld
init
kthreadd
migration/0
ksoftirqd/0
watchdog/0
events/0
NI (nice).
Il valore di nice rappresenta un meccanismo di correzione della priorità statica; è un numero intero positivo o
negativo che misura la correttezza dell'algoritmo di scheduling e cerca di spostare i processi CPU bound o I/O
bound. Ad esempio, un fattore ni = +19 abbassa la priorità; ni = -5 alza la priorità.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 43
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Background e foreground
Normalmente la shell esegue i comandi dell'utente in foreground, ovvero restituisce il controllo del terminale
soltanto a comando terminato. Utilizzando il simbolo & subito dopo un comando, il comando viene eseguito in
background e la shell restituisce subito il controllo del terminale. Se non rediretto in file, il comando in
background utilizza il terminale per lo standard output e lo standard error.
$ ls -R /usr > ~/elenco &
[1] 3347
(rappresentano [jobnumber] PID)
Quando viene lanciata una pipeline in background vengono mostrati il numero di job in background sulla
macchina e il PID dell'ultimo processo della pipeline. In maniera informale un job è definibile come un'attività
derivata da un comando dato attraverso una shell.
Un processo eseguito in foreground interagisce in maniera diretta con l'utente (browser, editor di testo).
Un processo in background è invece un processo che non interagisce direttamente con l'utente e tipicamente
fornisce un servizio non direttamente visibile all'utente (servizio di sistema, demone). La gestione del
background abilita il multitasking.
yes
Stampa il carattere “y”, o la stringa specificata indefinitamente sullo standard output, finché non viene terminato.
SINTASSI: $ yes [stringa]
Notare la differenza di esecuzione in foreground e background:
$ yes > /dev/null
$ yes > /dev/null &
/dev/null è un black hole, un cestino senza fondo. Si usa quando c'è un output ripetuto che non interessa
all'utente.
sleep
Sospende la shell per i secondi specificati.
SINTASSI: $ sleep num_secondi
$ sleep 20
pwd
ls -l
echo è tardi
wait
Sospende l'esecuzione del processo padre di quello passato in argomento, finché quello in argomento non
termina l'esecuzione. Il comando viene usato per forzare il controllo dell'output del figlio prima che riparta il
processo padre. Senza argomento, sospende il padre finché non terminano tutti i figli. Per uscire dal wait si
utilizza Ctrl+C.
SINTASSI: $ wait [PID]
$ sleep 20 &
[1] 2972
$ wait 2972
jobs
Mostra i processi attualmente in background.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 44
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
SINTASSI: $ jobs [opzioni]
Opzioni:
-l
Visualizzazione estesa delle informazioni di ogni processo di stato
-p
Mostra solo il PID del processo leader del job selezionato
user@ubuntu:~$ jobs
[1]+ Running sleep 15 &
user@ubuntu:~$ jobs -l
[1]+ 17245 Running sleep 15 &
user@ubuntu:~$ jobs -p
17245
fg
Porta in foreground un job che prima era in background. Se non viene specificato il job su cui agire, riporta in
foreground l'ultimo processo lanciato in background.
SINTASSI: $ fg [num_job]
$ fg 1
Ctrl+Z sospende il processo attualmente in foreground o tutti i processi della pipeline, restituendo il controllo
alla shell. Il job in questione viene messo in background.
bg
Permette di far riprendere in background l'esecuzione di un job sospeso, se il job in questione non è in
attesa di un input o di poter emettere l'output. Senza argomento riporta in background l'ultimo job
sospeso.
SINTASSI: $ bg [num_job]
$ yes > /dev/null &
[1] 2590
$ fg 1
yes > /dev/null
Ctrl+Z
[1]+ Stopped yes > /dev/null
$ bg 1
[1]+ yes > /dev/null &
Provate ad eseguire la stessa sequenza di comandi senza redirigere l'output di yes. Cosa accade?
Ctrl+C termina il processo o la pipeline attualmente in esecuzione in foreground.
Segnali
I segnali sono interrupt software che forniscono una tecnica rudimentale di comunicazione asincrona tra
processi. I segnali ci consentono di gestire eventi asincroni quali ad esempio:
- un utente che interrompe l'esecuzione di un programma utilizzando Ctrl+C;
- la fine prematura di un processo in una pipeline.
I segnali costituiscono un insieme ben definito ed a ciascuno di essi è associata una costante simbolica ed un
intero positivo. I sistemi Linux prevedono 64 segnali diversi:
1-31: segnali standard;
32-63: segnali “real-time”;
0: utilizzato per controllare se si hanno i permessi sufficienti per inviare un segnale ad un processo.
Le costanti simboliche hanno tutte il prefisso SIG, sono definite nell'header signal.h e descritte nella pagina di
manuale signal(7).
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 45
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
Distinguiamo le seguenti categorie di segnali in base alla loro origine:
- Segnali provenienti dal terminale: generati quando l'utente utilizza alcune combinazioni di tasti quali Ctrl+C
(SIGINT) o Ctrl+Z (SIGSTOP).
- Segnali derivanti da eccezioni hardware: generati dall'hardware quando si verificano eventi quali la divisione
per 0 o il tentativo di accesso ad un'area di memoria non valida; gli eventi vengono rilevati dal kernel che invia il
segnale corrispondente al processo che ha causato le eccezioni (ad esempio SIGSEGV).
- Segnali provenienti dalla funzione kill(2) (e dal comando kill(1)) kill verso un determinato PID.
- Segnali collegati ad eventi software: generati quando accade un evento di cui un processo deve essere
informato; è il caso, ad esempio, di un processo che scrive in una pipeline mentre il processo che legge è già
terminato (set | less); in tale ipotesi il primo riceve un segnale SIGPIPE quando il secondo termina.
La generazione di un segnale e la sua notifica passano attraverso il kernel che li gestisce utilizzando una coda di
segnali pendenti. La notifica è un evento asincrono rispetto alla generazione e dipende dal kernel. Sui sistemi
Linux un segnale standard (non real time) viene inserito nella coda dei segnali pendenti solo se non è già
presente. In pratica inviando n volte lo stesso segnale standard ad un processo: la prima istanza viene inserita in
coda, mentre quelle successive vengono scartate fintanto che la prima è in coda.
Il processo che riceve il segnale può decidere di gestirlo in 3 modi:
- ignorare il segnale;
- catturare il segnale specificando una funzione detta signal handler da eseguire;
- eseguire l'azione di default associata al segnale (molto spesso la terminazione del processo).
I segnali SIGKILL (9) e SIGSTOP (19) non possono essere né catturati né ignorati ma eseguono sempre l'azione
di default. Le azioni di default sono specificate nella pagina di manuale signal(7).
Regole di protezione: per inviare un segnale utilizzando la system call kill (ed il comando kill) è necessario che
l'uid (real o effective) del processo mittente sia uguale all'uid (real o effective) del processo destinatario. L'utente
root può inviare segnali a tutti i processi.
kill
Il comando kill permette di inviare un segnale ad un processo, indicando direttamente il PID del processo. Se
non si specifica nessun segnale viene inviato SIGTERM (15), che è catturabile.
SINTASSI: $ kill [opzioni] [PID]
Opzioni:
-s nome_segnale
-nome_segn
-num_segn
-l
Invia il segnale nome_segnale al processo con #id PID
Elenca tutti i segnali ed i loro valori numerici (64 diversi segnali)
$ kill -SIGINT 1722
$ kill -INT 1722
$ kill -2 1722
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 46
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI
A.A. 2012-2013
(Prof. G. Piscitelli)
pkill
Consente di inviare un segnale ad un processo specificando il nome del programma piuttosto che il pid.
$ pkill -9 a.out
Invia il segnale SIGTERM a tutte le istanze di a.out a cui l'utente ha il permesso di inviare segnali.
killall
Si comporta esattamente come il comando kill ma non riceve come argomento uno o più PID. Come il comando
kill, se non è specificato nessun segnale di default esso è SIGTERM (15).
SINTASSI: $ killall [opzioni] [nome_proc]
Opzioni:
-u [utente]
-i
-nome_segn
-num_segn
Manda il segnale di terminazione a tutti i processi relativi all'utente specificato.
Chiede conferma prima di inviare il segnale, processo per processo.
$ killall gdm
Termina tutti i processi della sessione grafica, questi infatti sono tutti figli del processo gdm.
Terminazione di un processo
Un processo single-threaded può terminare l'esecuzione normalmente in 3 modi:
- eseguendo return dalla funzione main;
- invocando la funzione exit;
- invocando la system call _exit o la funzione _Exit;
oppure non normalmente in 2 modi:
- invocando la system call abort che genera SIGABRT;
- ricevendo un segnale che ne causa la terminazione.
Lo stato di terminazione può essere definito dall’utente utilizzando return o exit e varianti o assegnato dal kernel,
se l’utente non lo fa esplicitamente o in caso di terminazione con errore.
Fino a quando il genitore non preleva le informazioni sulla terminazione del figlio questi assume lo stato di
zombie ed il PID del processo rimane utilizzato (visualizzabile con ps).
Quando un processo termina prima dei suoi figli, gli orfani diventano figli del nonno o di init, che preleva lo
stato di terminazione di ogni figlio terminato per consentire al kernel di rilasciare i descrittori di processo.
Il diagramma descrive il tipico ciclo di vita di un processo dalla sua creazione alla sua terminazione.
Esercitazioni comandi shell Bash (Ing. S. Giannini)
Pagina 47