Sei sulla pagina 1di 97

DTI / ISIN / Titolo principale della presentazione 1

Ambienti Operativi: Bash

Amos Brocco, Docente-Ricercatore, DTI / ISIN

26 settembre 2014
2

Unix

• Bell labs, anni 60


• Obiettivi:
– ambiente di programmazione
– semplice interfaccia utente
– semplici utility che possono essere combinate per realizzare
potenti funzioni
– file system gerarchico (ad albero)
– semplice interfacciamento con le periferiche
– sistema multi-user e multi-tasking
• Fine anni 80: standard POSIX (Portable Operating System
Interface for Unix)
3

Unix
4

Linux

• Creato da Linux Torvalds nel 1991


• Nato come “clone” di Minix
• Versione 1.0 rilasciata nel 1994
• Combinata con i tools del sistema operativo GNU e altre
applicazioni sotto forma di distribuzioni
– Debian
– Slackware
– RedHat / Fedora
– Ubuntu
– OpenSUSE
5

Shell Unix

• La maggior parte delle shell Unix sono programmabili, ovvero


permettono l'esecuzione di semplici programmi detti script
– Permettono di automatizzare compiti ricorrenti
– Permettono di estendere la shell con nuove funzionalità
• Diverse shell disponibili: sh, bash, csh, tcsh, ksh,...
• Essenza della filosofia Unix
– L’utente sa quello che fa
– Combinare piccole funzionalità per ottenerne di più
complesse
6

Tipi di shell

• Interattiva, non-interattiva
– Interattiva: presenta un prompt, e accetta i comandi dell'utente
– Non-interattiva: viene usata per eseguire degli script

• Shell di login (accesso) o no


– Login: eseguita automaticamente dopo il login locale o remoto
– Non login: viene eseguita esplicitamente (per es. per eseguire uno script)

– Cambiare la shell di login


[X] bash
linux1.dti.supsi.ch> echo $SHELL
/bin/tcsh
linux1.dti.supsi.ch> chsh
Modifica shell per utente in corso.
Parola d'ordine:
Nuova shell [/bin/tcsh]: /bin/bash
Shell modificata.
linux1.dti.supsi.ch>
7

Bash

• Bash
– rilasciata nel 1989
– sviluppata da Brian Fox
– parte del progetto GNU
– sintassi derivata dalla Bourne shell (sh), dal nome del suo creatore; il nome Bash sta per
“Bourne Again Shell”
– Ispirata C shell, Korn shell, e altre
8

Login e logout

• Unix (e quindi Linux) è un sistema operativo multiutente


– Per poter utilizzare il sistema è necessario fornire delle credenziali per identificarsi
– Questa procedura è effettuata tramite un'interfaccia grafica (login manager) o da shell

• Login: Procedura di accesso e autenticazione


– Richiede:

un nome utente (che identifica la persona che vuole autenticarsi)

una parola chiave di accesso (password)

[X] bash
host login: utente
Password:

• Logout: Procedura di de-autenticazione


– L'utente termina la sua sessione di lavoro
9

Utenti e gruppi

• Ogni utilizzatore è identificato da un nome utente


– Il sistema identifica gli utenti con un identificatore numerico (UID)
– Unix memorizza la lista degli utenti del sistema nel file /etc/passwd

• Gli utenti possono essere organizzati in gruppi


– La lista dei gruppi è memorizzata in /etc/groups
– Ogni gruppo ha un nome (es. Impiegati) e un identificatore numerico (GID)
– Un utente puo` appartenere a più gruppi (es. Impiegati, Contabilità,...)

• È possibile assegnare i privilegi per l'accesso alle


risorse del computer ai singoli utenti o a gruppi
– es. permettere l'accesso al file Finanze.txt solo agli utenti del gruppo Contabilità

• Un utente “amministratore” (nome utente: root) ha tutti i


privilegi sul sistema
10

Il prompt dei comandi

– utente@host:~/Documenti$

Percorso corrente

[X] bash [X] bash [X] bash


utente@host:~/Documenti$ utente@host:~/Documenti$ utente@host:~/Documenti$
echo “Ciao mondo” echo “Ciao mondo” echo “Ciao mondo”
Ciao mondo

Attendi input Esegui Visualizza output


11

I comandi

• I comandi sono caratterizzati da


– Nome del comando (ev. con il suo percorso completo)
– Opzioni o flag (-)

Molte opzioni hanno una versione estesa (--opzione) e una compatta (-o)
– Parametri

[X] bash
utente@host:~/Documenti$ ls -l

Nome del Opzione: -l


comando: ls

– Un comando può essere “interno” (built-in, implementato dal programma della shell) o “esterno”
se è definito in un programma separato
12

Aiuto ai comandi

Come si usa un determinato comando?


man comando help comando

[X] bash
utente@host:~/Documenti$ man ls
LS(1) User Commands LS(1)

NAME
ls - list directory contents

SYNOPSIS
ls [OPTION]... [FILE]...

DESCRIPTION
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor –sort.
...

Qual'è la differenza tra man e help ?


help mostra l'aiuto per i comandi della shell che
sono definiti internamente. Digita help per
consultare la lista dei comandi interni.
13

Aiuto ai comandi: man man sezione termine

• Il manuale è organizzato in sezioni e sottosezioni, ognuna con diverse pagine


– 1 Commands
– 2 System Calls
– 3 Library Functions
– 4 Administrative Files
– 5 Miscellaneous Information
– 6 Games
– 7 I/O and Special Files
– 8 Maintenance Commands
• Se la sezione non è specificata, visualizza la prima occorrenza del termine
• In ogni sezione c'è una pagina intro che ne illustra il contenuto
[X] bash
utente@host:~/Documenti/Privato$ man 6 intro
INTRO(6) Linux Programmer's Manual INTRO(6)

NAME
intro - Introduction to games
14

Struttura di una pagina di man


[X] bash
CAT(1) User Commands CAT(1)

NAME
cat - concatenate files and print on the standard output

SYNOPSIS
cat [OPTION]... [FILE]... Sintassi del comando [] per
DESCRIPTION parametri opzionali
Concatenate FILE(s), or standard input, to standard output.

-A, --show-all Descrizione dei parametri


equivalent to -vET

-b, --number-nonblank
number nonempty output lines

--help display this help and exit

--version
output version information and exit

With no FILE, or when FILE is -, read standard input.

EXAMPLES

cat f - g
Output f's contents, then standard input, then g's
contents.
q per uscire
15

Aiuto ai comandi: whatis, apropos

whatis termine

• Mostra solo la sezione NAME della pagina del manuale (equivale a man -f)
[X] bash
utente@host:~/Documenti/Privato$ whatis cat
cat (1) - concatenate files and print on the standard output

apropos termine
• Cerca i comandi la cui descrizione nel manuale (NAME) contiene le parole
specificate (equivale a man -k)
– Il comando non distingue fra maiuscole e minuscole

[X] bash
utente@host:~/Documenti/Privato$ apropos cat
catman (8) - crea o aggiorna le pagine di manuale preformattate
PAM (7) - Pluggable Authentication Modules for Linux
16

Utenti e gruppi

Qual'è il mio nome utente?


whoami

[X] bash
utente@host:~/Documenti$ whoami
utente

A quali gruppi appartengo?


groups

[X] bash
utente@host:~/Documenti$ groups
utente adm dialout cdrom plugdev lpadmin admin sambashare

Il primo gruppo della


lista è quello corrente
(associato, p.es. ai file
creati)
17

Utenti e gruppi

Come cambio la mia password?


passwd

[X] bash
utente@host:~/Documenti$ passwd
Cambio password per utente.
Password UNIX (attuale):
Inserire nuova password UNIX:
Reinserire la nuova password UNIX:

Come cambio il mio gruppo corrente?


newgrp

[X] bash
utente@host:~/Documenti$ groups
utente adm dialout cdrom plugdev lpadmin admin sambashare
utente@host:~/Documenti$ newgrp adm
utente@host:~/Documenti$ groups
adm utentedialout cdrom plugdev lpadmin admin sambashare
18

Utenti e gruppi

Come mi collego come un altro utente?


su

[X] bash
utente@host:~/Documenti$ su pippo
Password:
pippo@host:~/$

Come mi collego come root?


su

[X] bash
utente@host:~/Documenti$ su
Password:
root@host:~/Documenti#

# indica che sono collegato come root


19

sudo

• L'amministratore di sistema può decidere di assegnare qualche


privilegio in più a certi utenti, permettendogli di eseguire dei
comandi in modalità amministratore
Come eseguo un comando come se fossi root?
sudo

[X] bash
utente@host:~/Documenti$ sudo su
[sudo] password for utente:
root@host:~/Documenti#

Per definire “chi” può usare sudo e per quale comando


bisogna modificare un file di configurazione tramite
visudo
20

Gestione degli utenti

• Gli utenti sono gestiti tramite il file /etc/passwd, mentre i


gruppi con /etc/group
[X] /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh

[X] /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:attila
tty:x:5:
disk:x:6:
lp:x:7:
21

Aggiungere, modificare e rimuovere utenti e gruppi

Come aggiungo un nuovo utente?


useradd

Come rimuovo un utente?


userdel

Come modifico un utente?


usermod

Come aggiungo un nuovo gruppo?


groupadd

Come rimuovo un gruppo?


groupdel

Come modifico un gruppo?


groupmod
22

Filesystem Unix

bin etc home lib tmp usr

utente guest aldo

Documenti Musica
23

Percorso assoluto e relativo

• È possibile specificare un file/directory attraverso il suo


– Percorso assoluto (dalla radice /)
– Percorso relativo (alla directory corrente)

bin etc home lib tmp usr

utente guest aldo

Documenti Musica Esempio:


Directory corrente: /home/utente
Assoluto:
/home/utente/Documenti/Viaggio.ppt
Viaggio.ppt Relativo: Documenti/Viaggio.ppt
24

Navigare nel file system

Qual'è il percorso assoluto corrente?


pwd

[X] bash
utente@host:~/Documenti$ pwd
/home/utente/Documenti
utente@host:~/Documenti$

Quali file/directory ci sono?


ls

[X] bash
utente@host:~/Documenti$ ls
Privato
Spese.odt
Vacanze.ppt
Mappa.jpg
utente@host:~/Documenti$
25

Navigare nel file system

Voglio più informazioni!


ls -a -l

[X] bash
utente@host:~/Documenti$ ls -al
drwxr-xr-x 2 utente gruppo 4096 2011-09-02 10:18 .
drwx------ 36 utente gruppo 12288 2011-09-02 09:46 ..
drwx------ 3 utente gruppo 4096 2011-09-01 10:24 Privato
-rw-r--r-- 1 utente gruppo 83443 2011-09-02 10:18 Spese.odt
-rw-r--r-- 1 utente gruppo 96432 2011-07-15 18:12 Vacanze.ppt
-rw-r--r-- 1 utente gruppo 5674 2010-01-03 22:01 Mappa.jpg

-a, --all do not ignore entries starting with .

-l use a long listing format

-a -l ? Cosa sono?
man ls
26

File nascosti

• I file/directory il cui nome inizia con un punto '.' non sono


tipicamente visualizzati da ls (a meno di utilizzare l'opzione -a)
• Nella home directory sono presenti numerosi file nascosti, che
contengono tipicamente le configurazioni dei programmi utente
27

Navigare nel file system

Cosa sono . e .. ?

. directory corrente

.. directory genitrice (parent directory)

home

utente ..

Documenti .
28

Navigare nel file system


Come mi sposto da una directory a un'altra?
cd
/ [X] bash
home
utente
utente@host:~$ cd Documenti
utente@host:~/Documenti$
3
Documenti
/
[X] bash home

1 utente@host:~/Documenti$ cd ..
utente@host:~$
utente

Documenti

/ [X] bash
home
utente
utente@host:~/Documenti$ cd Privato
utente@host:~/Documenti/Privato$ 4
[X] bash
/

2 utente@host:~$ cd .
utente@host:~$
home
utente

/ Documenti
home Privato
utente
29

Directory home

• Ad ogni utente è assegnata una directory personale chiamata home, di


cui ne è proprietario
– Tipicamente risiede in /home
– È la directory in cui ci si trova dopo il login

• È accessibile in diversi modi:


– Con il comando cd (senza argomenti)
– Con cd $HOME (dove $HOME è una variabile d'ambiente che
contiene il percorso della directory home)
– Con cd ~ (~ è un alias per il percorso della directory home)
30

Proprietà di un file
[X] bash
utente@host:~/Documenti$ ls -l
drwx------ 3 utente gruppo 4096 2011-09-01 10:24 Privato
-rw-r--r-- 1 utente gruppo 83443 2011-09-02 10:18 Spese.odt
-rw-r--r-- 1 utente gruppo 96432 2011-07-15 18:12 Vacanze.ppt

Permessi

Numero di Dimensione
directories
contenute
nella
directory
(incluse . e ..)
Ultima
modifica
31

Creare file e directory

• Creare una directory mkdir

[X] bash
utente@host:~/Documenti$ mkdir Foto

• Creare un file vuoto touch

[X] bash
utente@host:~/Documenti$ touch Bottiglia

• Il vero scopo di touch è quello di aggiornare l'ora e la data di modifica di un file


all'ora e data correnti. Se il file non esiste ne viene creato uno vuoto.
32

Eliminare file e directory

• Cancellare un file rm

[X] bash
utente@host:~/Documenti$ rm Montagna.jpg

• Cancellare una directory rmdir

[X] bash
utente@host:~/Documenti$ rmdir Foto

rmdir non funziona se la directory non è vuota!

rm -r

[X] bash
utente@host:~/Documenti$ rm -r Foto

Ricorsivo
33

Rinominare, copiare, spostare un file


Rinominare =
spostare nella stessa
mv directory, utilizzando
un nome diverso
[X] bash
utente@host:~/Documenti$ mv Vacanze.ppt Montagna.ppt

cp

[X] bash
utente@host:~/Documenti$ cp Spese.odt CopiaSpese.odt
utente@host:~/Documenti$ cp -r Privato BackupPrivato

mv

[X] bash
utente@host:~/Documenti$ mv Copiaspese.odt Privato/
34

Autocompletamento e altre funzioni utili

[X] bash
utente@host:~/Documenti$ pwd
/home/utente/Documenti
utente@host:~/Documenti$ cd Pri TAB
utente@host:~/Documenti$ cd Privato

CTRL P Va al comando precedente

CTRL N Va al comando successivo

CTRL R Ricerca tra i comandi precedentemente utilizzati

history Visualizza lo storico dei comandi utilizzati

!! Riprende l'ultimo comando utilizzato

!n Riprende l'n-esimo comando nello storico

!-n Riprende l'n-ultimo comando nello storico

!bla Riprende più recente che inizia con bla


35

Proprietà di un file

• Visualizzare tutte le proprietà stat

[X] bash
utente@host:~/Documenti$ stat onewire.c
File: "onewire.c"
Dim.: 318 Blocchi: 24 Blocco di IO: 4096 file regolare
Device: 15h/21d Inode: 2364612 Coll.: 1
Accesso: (0664/-rw-rw-r--) Uid: ( 1000/ utente) Gid: ( 1000/ gruppo)
Accesso : 2012-08-28 09:26:43.873617907 +0200
Modifica : 2012-04-03 15:12:19.588511966 +0200
Cambio : 2012-04-03 15:12:19.624511965 +0200
Creazione: -
36

Proprietà di un file

• Visualizzare la dimensione stat -c%s

[X] bash
utente@host:~/Documenti$ stat -c%s onewire.c
318

• Visualizzare il proprietario stat -c%U

[X] bash
utente@host:~/Documenti$ stat -c%U onewire.c
utente

• Visualizzare il gruppo stat -c%G

[X] bash
utente@host:~/Documenti$ stat -c%G onewire.c
gruppo

Per altre opzioni consultate la pagina man di stat!


37

Altri comandi

ls Lista dei files


cd Cambia directory
pwd Directory corrente
cp Copia file
mv Sposta/Rinomina file
echo Scrivi una stringa sullo schermo
date Data corrente
seq Genera sequenza di numeri
find Trova file
grep Trova all'interno di file di testo
cat Visualizza contenuto file
wc Conta parole e linee
less Visualizza il contenuto di un file, pagina per pagina

tree Visualizza il contenuto della directory “ad albero”


38

Accesso ai file

• In un sistema multiutente c'è la necessità di definire delle politiche di accesso ai


dati, ovvero “chi” può accedere ai certi dati presenti sul sistema, e quali privilegi
di accesso può avere (lettura, scrittura, esecuzione)

• Es.
– Non voglio che gli altri utenti possano andare a curiosare nella mia cartella
Documenti
– Voglio dare accesso a chiunque alla cartella File condivisi
39

Permessi

drwxrwxrwx
Permessi altri utenti
(o, other)

Permessi gruppo (g,


group)

Permessi proprietario
(u, user)

Tipo di file
40

Tipi di file

- file regolare
d directory
b dispositivo a blocchi (es. harddisk)
c dispositivo a caratteri (es. porta seriale, mouse,... )
l collegamento simbolico (soft-link)
p named pipe
s Unix socket
41

Permessi base

• lettura (r)
– File: permette di leggerne il contenuto
– Directory: consente di elencare contenuto (file, sotto-directory)

• scrittura (w)
– File: permette di modificarne il contenuto
– Directory: permette di aggiungere o rimuovere contenuto

Posso cancellare file se ho permessi su directory che lo contiene,
non mi serve il permesso di scrittura sul file specifico!
• esecuzione (x)
– File: permette di eseguirli
– Directory: permette di attraversarle per accedere ai file ed alle
sottodirectory

Non permette di elencare contenuto!
42

Permessi avanzati

• set user ID (setuid o suid)


– Il file viene eseguito con i privilegi del proprietario del file e non dell'utente
che esegue il file
– Il permesso di esecuzione del campo proprietario può quindi assumere i
valori:

x : permesso di esecuzione, setuid disabilitato

S : nessun permesso di esecuzione, setuid abilitato

s : permesso di esecuzione, setuid abilitato
43

Permessi avanzati

• set group ID (setgid)


– Se applicato a un file:

Il file viene eseguito con i privilegi del gruppo del proprietario del file e
non con quelli del gruppo dell'utente che esegue il file
– Se applicato a una directory

I nuovi file e sottodirectory creati all'interno sono assegnati al gruppo
della directory anziché al gruppo dell'utente che crea il file o la
directory
– Il permesso di esecuzione del campo gruppo può quindi assumere i valori:

x : permesso di esecuzione, setgid disabilitato

S : nessun permesso di esecuzione, setgid abilitato

s : permesso di esecuzione, setgid abilitato
44

Permessi avanzati

• sticky
– Se applicato a un file: mantieni codice in memoria
– Se applicato ad una directory:

i file contenuti possono essere cancellati e spostati solamente da:
– utenti che ne sono proprietari
– utente proprietario della directory
– amministratore
– Il permesso di esecuzione del campo altri utenti può quindi assumere i
valori:

x : permesso di esecuzione, sticky disabilitato

T : nessun permesso di esecuzione, sticky abilitato

t : permesso di esecuzione, sticky abilitato
45

Cambiare i permessi (chmod) chmod permessi file

• Modalità ottale
[X] bash
utente@host:~/Documenti$ chmod 666 Miofile

• Modalità simbolica
[X] bash
utente@host:~/Documenti$ chmod ugo=rw Miofile

– u=user, g=group, o=others


• Modalità simbolica relativa
– Il cambiamento puo’ essere relativo alle permissions esistenti usando + o - invece di =
[X] bash
utente@host:~/Documenti$ chmod g+x Miofile

• Solo il proprietario può cambiare i permessi di un file!


– Eccezione: l'amministratore di sistema (root)
46

Modalità ottale

• Da una a quattro cifre; le cifre sulla sinistra possono essere omesse (vengono sostituite con 0)
• In ogni posizione i privilegi sono determinati dalla somma dei valori ottali:

Prima cifra: Utente Gruppo Altri


set user ID (4) Seconda cifra: Terza cifra: Quarta cifra:
set group ID (2) leggi (4) leggi (4) leggi (4)
sticky (1) scrivi (2) scrivi (2) scrivi (2)
esegui (1) esegui (1) esegui (1)

• Esempi:
– Utente: R W X, Gruppo: R W, Altri: nessun permesso 0760 (oppure 760)
– Utente: R W X, Gruppo: R, Altri: R 0744 (oppure 744)
– Utente: R W X, Gruppo: R X, Altri: R X + Sticky 1755
47

Cambiare il proprietario e gruppo chown chgrp

• Cambiare proprietario
[X] bash
utente@host:~/Documenti$ chown mario Miofile

• Cambiare gruppo
[X] bash
utente@host:~/Documenti$ chgrp nuovogruppo Miofile

• È possibile utilizzare il parametro -r per applicare i cambiamenti ricorsivamente a


tutti i file e sotto-directory
48

Permessi predefiniti umask

• Alla creazione di un file, Unix assegna i seguenti permessi:


– Per i files ordinari non eseguibili: rw-rw-rw (666)
– Per i files ordinari eseguibili e per directories: rwx rwx rwx (777)

• Il comando umask sottrae il numero ottale che si passa come parametro a


quelle di default:
[X] bash
utente@host:~/Documenti$ umask 0022 Nuovo default per file: 644

• Il cambiamento vale per la sessione.


49

Permessi ancora più avanzati...

• Oltre ai permessi standard è possibile utilizzare un meccanismo


di controllo degli accessi più fine, per esempio, dare o negare
l'accesso a un utente specifico o a un gruppo specifico
– È chiamato Access Control List (ACL)

• Il filesystem utilizzato deve supportare le ACL (ex. Ext2, Ext3,


Ext4, XFS, JFS,...)

• Più informazioni su:


– http://www.vanemery.com/Linux/ACL/linux-acl.html
50

Permessi

• Espliciti: definiti esplicitamente dall'utente

• Ereditati: ereditati dai permessi delle directory superiori


– L'ereditarietà è statica: definita quando il file viene creato (in
Windows invece è dinamica)
– I permessi espliciti sovrascrivono i permessi ereditati

• Effettivi: combinazione di permessi espliciti e impliciti


51

Comandi di base per la gestione delle ACL

• Ottenere i permessi correnti getfacl

[X] bash
utente@host:~/Documenti$ getfacl testi/miofile
# file: testi/miofile
# owner: utente
# group: gruppo
user::rwx
user:hduser:rw-
group::rw-
mask::---
other::---

Nota: Con l'opzione --omit possiamo omettere le informazioni che iniziano con #

• Cambiare i permessi setfacl

[X] bash
utente@host:~/Documenti$ setfacl -m u:hduser:x testi
52

ACL e ls

• Quando definisco dei permessi ACL per un file, l'output di ls


cambia:
[X] bash
utente@host:~/Documenti$ ls -l testi/miofile
-rwxrw----+ 1 utente gruppo 10 ago 29 12:08 miofile

Il + indica che ci sono


dei permessi ACL
definiti
53

Modificare i permessi ACL

• Con il comando setfacl possiamo modificare i permessi


– (simile a chmod)

setfacl -m <regole> <file>

– Le regole indicano la modifica da effettuare, più regole


possono essere inserite separandole con una virgola
– Aggiungendo l'opzione -R possiamo applicare le modifiche
ricorsivamente
54

Permessi per un utente

• user:uid:permessi
– Definisce il permessi per un utente specifico (specificato dal nome o da un id
numerico)
– Se uid non è specificato, cambia i permessi per l'utente proprietario del file
– Invece di user è possibile abbreviare con la sola lettera u
– I permessi sono specificati in modo assoluto simbolico (es. rw-, r-x) o in
forma ottale (es. 6, 5)

[X] bash
utente@host:~/Documenti$ setfacl -m user:giovanni:rwx testo.txt
utente@host:~/Documenti$ setfacl -m u:giovanni:rwx testo.txt
utente@host:~/Documenti$ setfacl -m u:paolo:r-- testo.txt
utente@host:~/Documenti$ setfacl -m u:aldo:rwx testo.txt
utente@host:~/Documenti$ setfacl -m u:raffaello:r-x testo.txt
utente@host:~/Documenti$ setfacl -m u:paperoga:5 testo.txt
utente@host:~/Documenti$ setfacl -m u:1013:6 testo.txt
55

Permessi per un utente

• group:gid:permessi
– Definisce il permessi per un gruppo specifico (specificato dal nome o da un
id numerico)
– Se gid non è specificato, cambia i permessi per il gruppo proprietario del
file
– Invece di group è possibile abbreviare con la sola lettera g
– I permessi sono specificati in modo assoluto simbolico (es. rw-, r-x) o in
forma ottale (es. 6, 5)
[X] bash
utente@host:~/Documenti$ setfacl -m group:studenti:rwx testo.txt
utente@host:~/Documenti$ setfacl -m g:collaboratori:rwx testo.txt
utente@host:~/Documenti$ setfacl -m g:docenti:r-- testo.txt
utente@host:~/Documenti$ setfacl -m g:segretaria:rwx testo.txt
utente@host:~/Documenti$ setfacl -m g:direzione:r-x testo.txt
utente@host:~/Documenti$ setfacl -m g:esterni:5 testo.txt
utente@host:~/Documenti$ setfacl -m g:1034:6 testo.txt
56

Permessi per un utente

• other::permessi
– Definisce il permessi per other (tutti gli altri)
– Invece di other è possibile abbreviare con la sola lettera o
– I permessi sono specificati in modo assoluto simbolico (es. rw-, r-x) o in
forma ottale (es. 6, 5)

[X] bash
utente@host:~/Documenti$ setfacl -m other::--- testo.txt
utente@host:~/Documenti$ setfacl -m g:collaboratori:rwx testo.txt
utente@host:~/Documenti$ setfacl -m g:docenti:r-- testo.txt
utente@host:~/Documenti$ setfacl -m g:segretaria:rwx testo.txt
utente@host:~/Documenti$ setfacl -m g:direzione:r-x testo.txt
utente@host:~/Documenti$ setfacl -m g:esterni:5 testo.txt
utente@host:~/Documenti$ setfacl -m g:1034:6 testo.txt
57

Mask (permessi effettivi)

• Specificando mask: invece di utente, gruppo, o other possiamo


davanti a un comando è possibile definire i permessi massimi
consentiti per tutti gli utenti a parte il proprietario (user) e other
[X] bash
utente@host:~/Documenti$ getfacl Fatture/
# file: Fatture/
# owner: utente
# group: utente
user::rwx
group::rwx
other::r-x
utente@host:~/Documenti$ setfacl -m mask::r-- Fatture/
utente@host:~/Documenti$ getfacl Fatture/
# file: Fatture/
# owner: utente
# group: utente
user::rwx
group::rwx #effective:r--
mask::r--
other::r-x
58

Permessi di default (per le directory)

• Aggiungendo default: davanti a un comando è possibile


definire i permessi predefiniti per i file che verranno creati
all'interno della directory:
[X] bash
utente@host:~/Documenti$ setfacl -m default:other::--- Immagini/
utente@host:~/Documenti$ setfacl -m default:g:collaboratori:rwx Finanze/

• Se non specificati, verranno definiti dei permessi di default anche


per le altre tipologie di accesso (user, group, other)
59

Rimuovere dei permessi

• Con l'opzione -x possiamo rimuovere delle regole di permessi

setfacl -x <regole> <file>

[X] bash
utente@host:~/Documenti$ getfacl bingo
# file: bingo
# owner: utente
Possiamo
# group: utente
user::rw-
specificare
group::rw-
group:whoopsie:-w- regole per utenti,
mask::rw-
other::--- gruppi, other,
utente@host:~/Documenti$ setfacl -x g:whoopsie bingo
utente@host:~/Documenti$ getfacl bingo default,...
# file: bingo
# owner: utente
# group: utente
user::rw-
group::rw-
mask::rw-
other::---
60

Forzare i permessi

• Con l'opzione --set possiamo forzare i permessi (sostituendo


quelli esistenti)

setfacl --set <regole> <file>


[X] bash
utente@host:~/Documenti$ getfacl Rapporto
# file: Rapporto
# owner: utente
# group: utente
user::rw-
group::rw-
other::r--
utente@host:~/Documenti$ setfacl --set u::rwx,g::rwx,g:pulse:rx,o::--- Rapporto
utente@host:~/Documenti$ getfacl Rapporto
# file: Rapporto
# owner: utente
# group: utente
user::rwx
group::rwx
group:pulse:r-x
mask::rwx
other::---
61

Togliere tutte le regole dei permessi

• L'opzione -b rimuove tutte le regole ACL

setfacl -b <file>
62

Trasferire i permessi

• getfacl e setfacl possono essere “collegati” per trasferire i


permessi da un file all'altro:

getfacl <file>
| setfacl –set-file=- <file>
63

ACL dopo la copia e lo spostamento di un file

• Spostamento (mv)
– Se possibile mantiene i permessi ACL, altrimenti avverte
l'utente

• Copia (cp)
– Mantiene i permessi ACL solo se usato con l'opzione -p o -a

• Nota: Il filesystem di destinazione deve supportare ACL!


64

Globbing (wildcard, carattere jolly, metacaratteri)

Voglio la lista di tutti i file con estensione .txt


Globbing! Il globbing consiste nell'utilizzare un pattern con uno o più caratteri wildcard

[X] bash
utente@host:~/Documenti/Privato$ ls *.txt
Alpha.txt Beta.txt Gamma.txt

Cos'è un wildcard?
Un wildcard può essere sostituito da uno o più caratteri

* corrispondenza con zero o più caratteri qualsiasi


? corrispondenza con esattamente un carattere
[] corrispondenza tra un gruppo di caratteri
[a-z] un carattere dalla 'a' alla 'z'
[^abc] non-corrispondenza tra un gruppo di caratteri
65

Classi di caratteri
[[:alnum:]] numeri o lettere (equivalente a [A-Za-z0-9])

[[:alpha:]] lettere (equivalente a [A-Za-z])

[[:blank:]] spazi o tabulazioni

[[:cntrl:]] caratteri di controllo

[[:digit:]] numeri (equivalente a [0-9])

[[:graph:]] caratteri grafici (ASCII 33 - 126)

[[:lower:]] lettere minuscole (equivalente a [a-z])

[[:upper:]] lettere maiuscole (equivalente a [A-Z])

[[:print:]] caratteri grafici più lo spazio (ASCII 32 - 126)

[[:space:]] spazio, tabulatore, ritorno a capo,...

[[:xdigit:]] numero esadecimale (equivalente a [0-9A-Fa-f])


66

Globbing

Elenca tutti i file il cui nome termina con una lettera

[X] bash
utente@host:~/Documenti/Privato$ ls *[a-zA-Z]

• Pattern:

Qualsiasi carattere,
anche ripetuto *[a-zA-Z] “Un carattere dalla 'a' alla 'z' o
dalla 'A' alla 'Z'

• Il pattern matching viene effettuato prima di eseguire il comando


– se il matching è possibile (c'è almeno un file che corrisponde), la lista dei nomi di file
corrispondenti sostituisce il pattern
– Altrimenti, il pattern non viene sostituito
67

Globbing

[X] bash
utente@host:~/Documenti$ touch Timmy.pig Tommy.pig Jimmy.pig

Cos'è touch?
man touch

[X] bash
utente@host:~/Documenti$ ls *.pig
Timmy.pig Tommy.pig Jimmy.pig
utente@host:~/Documenti$ ls T*.pig
Timmy.pig Tommy.pig
utente@host:~/Documenti$ echo “I tre porcellini“ *.pig
I tre porcellini Jimmy.pig Timmy.pig Tommy.pig
utente@host:~/Documenti$ rm *.pig
utente@host:~/Documenti$ ls *.pig
ls: impossibile accedere a *.pig: File o directory non esistente
utente@host:~/Documenti$ echo "I tre porcellini" *.pig
I tre porcellini *.pig

Il globbing viene espanso prima di eseguire il comando:


ls T*.pig diventa ls Timmy.pig Tommy.pig
68

Alternanza

Voglio la lista di tutti i file con estensione .jpg o *.JPG o *.Jpg o *.jPG o ...
Alternanza! Permette di generare un insieme di combinazioni

[X] bash
utente@host:~/Documenti/Privato$ ls *.{j,J}{p,P}{g,G}

{} genera un insieme di combinazioni


Ma se una combinazione non corrisponde a un file ottengo un errore!

[X] bash
utente@host:~/Documenti/Privato$ ls *.{j,J}{p,P}{g,G}
ls: impossibile accedere a *.jpG: File o directory non esistente
ls: impossibile accedere a *.jPg: File o directory non esistente
ls: impossibile accedere a *.jPG: File o directory non esistente
ls: impossibile accedere a *.Jpg: File o directory non esistente
ls: impossibile accedere a *.JpG: File o directory non esistente
ls: impossibile accedere a *.JPg: File o directory non esistente
Alpha.jpg Beta.JPG

shopt -s nullglob
69

Variabili di ambiente

• Le variabili di ambiente possono modificare il comportamento dei programmi


– I valori delle variabili di ambiente vengono “ereditati” dai sotto-processi
– la variabile d'ambiente PATH indica il percorso predefinito per i programmi

Quando viene richiesto di eseguire un comando senza specificarne il
percorso, il comando è ricercato nei percorsi definiti in PATH
[X] bash
utente@host:~/Documenti$ export pi=”Greco”
utente@host:~/Documenti$ bash
utente@host:~/Documenti$ echo $pi
Greco

export nome=valore Definisce una nuova variabile d'ambiente

$nome Accesso a una variabile d'ambiente

[X] bash
utente@host:~/Documenti$ export PATH=~/.local/bin:$PATH
utente@host:~/Documenti$ export PS1=blabla-
blabla-

Anche le variabili di ambiente vengono sostituite con il loro valore prima di


eseguire il comando
70

Variabili

• È possibile definire delle variabili associate a dei valori


– Una variabile è accessibile solo all'interno della stessa shell
• Prima dell'esecuzione di un comando avviene la sostituzione degli eventuali riferimenti a variabili con i
valori delle variabili stesse.

[X] bash
utente@host:~/Documenti$ messaggio=”Ciao mondo”
utente@host:~/Documenti$ echo $messaggio
Ciao mondo

nome=valore Definisce una nuova variabile

$nome Accesso a una variabile


71

Tilde

• Il simbolo tilde ~ viene espanso nel percorso della directory personale (Home) dell'utente corrente
– Viene espanso solo se si trova all'inizio di una parola o se è separato
[X] bash
utente@host:~/Documenti$ cd ~
utente@host:~$ cd ~/Documenti
utente@host:~/Documenti$

• ~+ è il percorso della directory corrente (equivale a pwd)


• ~- è il percorso della directory corrente precedente (prima dell'ultimo cd).
– Se non si è mai cambiata la directory nella shell corrente, ~- non viene espanso!
[X] bash
utente@host:~/Documenti$ echo ~+
/home/utente/Documenti
utente@host:~/Documenti$ cd ~
utente@host:~$ echo ~-
/home/utente/Documenti
72

Command substitution

• C’é la possibilità di includere un comando in un altro e fare in modo che il comando incluso venga
eseguito prima e sostituito sulla linea di comando principale con il suo output.
• Il comando incluso viene delimitato con gli apici “ ` ” oppure con $(...)
[X] bash
utente@host:~/Documenti$ echo `pwd`
/home/utente/Documenti
utente@host:~/Documenti$ echo $(date)
gio 8 set 2011, 16.18.53, CEST
73

Alias

• Un alias permette di assegnare un nuovo nome (in maniera più generale, una qualsiasi sequenza di
caratteri) a un comando

alias nome='sostituzione'

[X] bash
utente@host:~/Documenti$ alias listafile='ls -al'
utente@host:~/Documenti$ listafile
drwxr-xr-x 2 utente gruppo 4096 2011-09-02 10:18 .
drwx------ 36 utente gruppo 12288 2011-09-02 09:46 ..
drwx------ 3 utente gruppo 4096 2011-09-01 10:24 Privato
-rw-r--r-- 1 utente gruppo 83443 2011-09-02 10:18 Spese.odt
-rw-r--r-- 1 utente gruppo 96432 2011-07-15 18:12 Vacanze.ppt
-rw-r--r-- 1 utente gruppo 5674 2010-01-03 22:01 Mappa.jpg
74

stdin, stdout, stderr, redirezione

Sui sistemi Unix i programmi


stdout
hanno accesso a tre stream di stdin
input e output: stderr
– stdin (standard input) [0]

Input dalla tastiera
– stdout (standard output) [1] [X] bash
utente@host:~/Documenti$ cat DOG.txt

Output su schermo
stdout Contenuto del file
– stderr (standard error) [2] Se DOG.TXT
esiste: DOG.TXT


Output degli errori su
schermo stderr cat: DOG.TXT:
Se DOG.TXT File o directory
• Ogni stream è associato a un non esiste: non esistente

numero detto file descriptor (fd)


75

stdin, stdout, stderr, redirezione


[X] bash

Lettura da stdin
utente@host:~/Documenti/Privato$ cat
ciao stdin
ciao
sole
sole CTRL D

Redirezione di stdin da un file

utente@host:~/Documenti/Privato$ cat < leggi.txt stdin


leggi.txt

Redirezione di stdout su un file (sovrascrivi)

utente@host:~/Documenti/Privato$ cat leggi.txt > scrivi.txt stdout


scrivi.txt

Redirezione di stdout su un file (aggiunta)

utente@host:~/Documenti/Privato$ cat leggi.txt >> aggiungi.txt stdout


aggiungi.txt
76

stdin, stdout, stderr, redirezione


[X] bash

Redirezione di stdout e stderr


utente@host:~/Documenti/Privato$ ls *.bogus >& miofile.txt stdout
miofile.txt
stderr
Redirezione di stderr

utente@host:~/Documenti/Privato$ cat leggi.txt 2> out.txt


out.txt
stderr
stdout

Redirezione di stdout a stderr

utente@host:~/Documenti/Privato$ cat leggi.txt 1>&2


Se viene omesso &
Redirezione di stderr a stdout l'output di stdout
viene scritto in un
utente@host:~/Documenti/Privato$ cat leggi.txt 2>&1 file chiamato '2'
77

stdin, stdout, stderr, redirezione

Come creo altri descrittori di input o output?


exec fd<>nomefile exec fd<>&fd

[X] bash
utente@host:~/Documenti$ exec 3<>Datalog.txt
utente@host:~/Documenti$ ls -l /proc/$$/fd
lr-x------. 1 utente utente 64 9 set 16:23 0 -> /dev/pts/1
lrwx------. 1 utente utente 64 9 set 16:23 1 -> /dev/pts/1
lrwx------. 1 utente utente 64 9 set 16:23 2 -> /dev/pts/1
lrwx------. 1 utente utente 64 12 set 10:49 255 -> /dev/pts/1
lrwx------. 1 utente utente 64 9 set 16:23 3 -> /home/utente/Datalog.txt

< sola lettura


> sola scrittura
<> lettura e scrittura
Crea una nuova
shell e esegue il
comando
78

stdin, stdout, stderr, redirezione

Come redirigere l'input dal file descriptor m al file descriptor n?

n<&m

Come redirigere l'output dal file descriptor n al file descriptor m?

n>&m

Come chiudo un file descriptor m?

>&m- <&m-

Come associo un file descriptor n a un comando per l'output?

n> >(comando)

Come associo un file descriptor n a un comando per l'input?

n< <(comando)
79

Esempi di redirezione

[X] bash
utente@host:~/Documenti$ exec 55< <(echo "ciao mondo")
utente@host:~/Documenti$ cat <&55
ciao mondo
utente@host:~/Documenti$ exec 55<&-
utente@host:~/Documenti$ echo "Ambienti operativi" > Corso.txt
utente@host:~/Documenti$ exec 99<>Corso.txt
utente@host:~/Documenti$ ls -l /proc/$$/fd
totale 0
lr-x------. 1 utente utente 64 12 set 11:01 0 -> /dev/pts/3
lrwx------. 1 utente utente 64 12 set 11:01 1 -> /dev/pts/3
lrwx------. 1 utente utente 64 12 set 11:01 2 -> /dev/pts/3
lrwx------. 1 utente utente 64 12 set 11:01 255 -> /dev/pts/3
lrwx------. 1 utente utente 64 12 set 11:36 99 -> /home/utente/Corso.txt
utente@host:~/Documenti$ echo "Redirezione in bash" >&99
utente@host:~/Documenti$ exec 99>&-
utente@host:~/Documenti$ cat Corso.txt
Redirezione in bash
utente@host:~/Documenti$
80

Come leggere le redirezioni

• Da sinistra a destra
• ...Ma attenzione:

“Voglio redirigere stderr su stdout (terminale),


e stdout su /dev/null”
81

Come leggere le redirezioni

• Da sinistra a destra
• ...Ma attenzione:

[X] bash
utente@host:~/Documenti$ ls 2>&1 >/dev/null

stderr è rediretto
all'output
attualmente
collegato a stdout è rediretto
stdout, cioè il a /dev/null
terminale
82

Pipe

• Una pipe è un buffer che permette di “collegare” tra loro più programmi e redirigere stdout verso stdin
– Per creare una pipe si utilizza il carattere | Alt Gr *
1
• Opera in modalità FIFO
– First-in, First-out: “Il primo carattere ad entrare è il primo ad uscire”

[X] bash
utente@host:~/Documenti$ cat dati.txt | grep “Ciao” | wc -l

stdout stdout stdout


stdin stdin stdin
cat grep wc

* Su una tastiera con layout svizzero


francese
83

Pipe

• Come redirigere stderr nella pipe (escludendo l'output “originale” scritto


su stdout) ?
*

[X] bash
utente@host:~/Documenti$ ls nonesistente 2>&1 >/dev/null | grep impossibile

stdout stdout stdout


stdin stdin stdin
ls grep wc
84

Pipe

• Come redirigere stderr nella pipe (escludendo l'output “originale” scritto


su stdout) ?
*

[X] bash
utente@host:~/Documenti$ ls nonesistente 2>&1 >/dev/null | grep impossibile

stderr
stdout

ls
85

Pipe

• Come redirigere stderr nella pipe (escludendo l'output “originale” scritto


su stdout) ?
*

[X] bash
utente@host:~/Documenti$ ls nonesistente 2>&1 >/dev/null | grep impossibile

stderr
stdout

ls

/dev/null
86

Pipe

• Come redirigere stderr nella pipe (escludendo l'output “originale” scritto


su stdout) ?

[X] bash
utente@host:~/Documenti$ ls nonesistente 2>&1 >/dev/null | grep impossibile

stderr
stdout stdout
stdin stdin
ls grep

/dev/null
87

Filtrare l'output di un comando


head

Voglio le prime 50 righe del file DivinaCommedia.txt

[X] bash
utente@host:~/Documenti/Privato$ head -n 50 DivinaCommedia.txt
utente@host:~/Documenti/Privato$ cat DivinaCommedia.txt | head -n 50

Voglio tutto il contenuto di Testo.txt tranne le prime 3 righe

[X] bash
utente@host:~/Documenti/Privato$ cat Testo.txt | head -n-3

tail

Voglio le ultime 50 righe del file DivinaCommedia.txt

[X] bash
utente@host:~/Documenti/Privato$ tail -n 50 DivinaCommedia.txt
utente@host:~/Documenti/Privato$ cat DivinaCommedia.txt | tail -n 50
88

Filtrare l'output di un comando


uniq

Visualizza il contenuto di Dati.txt omettendo le righe adiacenti uguali

[X] bash
utente@host:~/Documenti/Privato$ cat Dati.txt | uniq

tr

Voglio sostituire tutte le 'a' con delle 'b'

[X] bash
utente@host:~/Documenti/Privato$ tr a b
Ciao
Cibo

cut

Voglio estrarre i primi 5 caratteri di ogni linea

[X] bash
utente@host:~/Documenti/Privato$ cut -c 1-5 miofile
89

Filtrare l'output di un comando


grep

Visualizza i files nella directory corrente che contengono la stringa “ciao”

[X] bash
utente@host:~/Documenti/Privato$ ls | grep ciao

Visualizza le righe di Telefono.txt che contengono la parola Giovanni

[X] bash
utente@host:~/Documenti/Privato$ grep Giovanni Telefono.txt

Nota: le potenzialità di grep verranno esplorare nelle lezioni sulle espressioni regolari
90

Cercare un file: find

• Cercare nel filesystem i file con certe caratteristiche

find percorso [espressione]


• Discende ricorsivamente le directory specificate del percorso, cercando tutti i files che rendono vera
l'espressione (formata da una o più opzioni)

[X] bash
utente@host:~/Documenti/Privato$ find . -name "*.odp" Doppio apice per evitare
globbing!
[X] bash
utente@host:~/Documenti/Privato$ find . -type f -name "*.odp"

[X] bash
utente@host:~/Documenti/Privato$ find . -type f -mtime -1 -name "*.odp"

[X] bash
utente@host:~/Documenti/Privato$ find . -type f -mtime -1 -name "*.odp" -exec echo Trovato {} \;
91

Cercare un file: find

[X] bash
utente@host:~/Documenti/Privato$ find . -name "*.odp" -or -name "*.ppt"

[X] bash
utente@host:~/Documenti/Privato$ find . -name "*.odp" -size +200k

[X] bash
utente@host:~/Documenti/Privato$ find . -name "*.odp" -not -user andrea

[X] bash
utente@host:~/Documenti/Privato$ find . -name "*.odp" -perm -o=rw

[X] bash
utente@host:~/Documenti/Privato$ find . ! -name "*.odp" -perm -o=rw

[X] bash
utente@host:~/Documenti/Privato$ find . -name "*.txt" ! -wholename "*/backup/*" -exec cp {} backup/ \;
92

Ordinare l'output di un comando: sort


sort
• Permette di ordinare l'output di un comando o visualizzare il contenuto ordinato di un file

[X] bash
utente@host:~$ cat Nomi.txt
Giovanni
Aldo
Giacomo
due
4
Due
2
1
3
uno
tre
utente@host:~$ sort Nomi.txt
1
2
3
4
Aldo
due
Due
Giacomo
Giovanni
tre
uno
93

Sort
[X] bash
utente@host:~$ cat Nomi.txt | sort
1
2
3
4
Aldo
due
Due
Giacomo
Giovanni
tre
Uno
utente@host:~$ cat Nomi.txt | sort -r
uno
Con l'opzione -r inverte l'ordine
tre
Giovanni
Giacomo
Due
due
Aldo
4
3
2
1
94

Quoting

• Le stringhe possono essere delimitate da tre tipi di apici/virgolette:


– doppie “”

causano l'espansione delle variabili al loro interno
– singole ''

nessuna espansione
– Accenti gravi ` `

eseguono la stringa e ne sostituiscono il valore con l'output del
comando
(equivalente a $(...) )
[X] bash
utente@host:~$ etichetta=”mondo”
utente@host:~$ echo “Ciao $etichetta”
Ciao mondo
utente@host:~$ echo 'Ciao $etichetta'
Ciao $etichetta
95

Escaping

• Possiamo impedire l'espansione delle variabili e il globbing


– Il carattere \ (backslash) viene anteposto al carattere speciale $, ?, *, \, ...
[X] bash
utente@host:~$ etichetta=”mondo”
utente@host:~$ echo “Ciao \$etichetta”
Ciao $etichetta
utente@host:~$ echo *.txt
Esempio.txt Finanze.txt
utente@host:~$ echo \*.txt
*.txt
utente@host:~$ echo “Apici \””
Apici “
96

Esecuzione di un comando in background

• Un comando può essere eseguito in background (secondo


piano)
– L'esecuzione non blocca la shell corrente permettendo
all'utente di continuare a inserire nuovi comandi

[X] bash
utente@host:~$ find . -name Importante > /tmp/Risultati.txt &
[1] 29010
utente@host:~$
97

Valore di ritorno / uscita

• Quando un comando (o processo) termina la sua esecuzione viene


ritornato un valore numerico di uscita / di stato o exit status (da 0 a 255)
– Associato alla variabile $?
– 0 (zero) indica che il comando è terminato correttamente (“nessun
errore”)
– Gli altri valori sono utilizzati per segnalare una condizione d'errore

I codici di errore sono solitamente indicati nel manuale del
comando
[X] bash
utente@host:~$ true
utente@host:~$ echo $?
0
utente@host:~$ false
utente@host:~$ echo $?
1
utente@host:~$ date
utente@host:~$ echo $?
0

Potrebbero piacerti anche