SlideShare una empresa de Scribd logo
1 de 9
Descargar para leer sin conexión
Uno sguardo approfondito alla
                                redirezione dell'I/O con Bash
                                                        di Roberto Polli



Redirigere l’I/O
La redirezione dell'I/O è il processo atto a controllare l'Input/Output di un programma. Quando
si scrive un programma o uno script è possibile leggere dalla console e scrivere sullo schermo.
I file standard usati per l'I/O sono tre: il programma legge da standard input, scrive il risultato
delle operazioni su standard output e invia messaggi di errore a standard error.


Su un sistema Unix, i processi identificano ogni file con un numero intero progressivo: il file
descriptor. Questo numero è univoco all'interno di ogni processo. Quando un processo apre un
file, gli assegna un nuovo file descriptor. STDIN, STDOUT e STDERR sono associati rispettivamente
ai primi tre interi: 0, 1 e 2.


Su Linux è possibile trovare i file descriptor di un processo tramite il filesystem /proc.


Ad esempio elencando i file descriptor del processo con pid 1201 si può notare che oltre a quelli
di default ce n'è un altro: crond.pid. Ciò significa che il processo con pid 1201 ha aperto il file
/var/run/crond.pid.


# ls /proc/1201/fd/ -l
total 0
lr-x------ 1 root root 64 2011-06-10 08:43 0 -> /dev/null
l-wx------ 1 root root 64 2011-06-10 08:43 1 -> /dev/null
l-wx------ 1 root root 64 2011-06-10 08:43 2 -> /dev/null
lrwx------ 1 root root 64 2011-06-10 08:43 3 -> /var/run/crond.pid


L'unicità dei file descriptor è relativa al processo: se un altro processo apre lo stesso file (ex.
/var/run/crond.pid) gli potrà assegnare un altro intero (es. 5).




BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680
E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it
Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v.
Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
Es: questo comando mostra tutti i processi che usano /etc/passwd mostrando il loro pid e i
corrispondenti file descriptor. Consultare #man find per ulteriori informazioni sul comando find.


#sudo find /proc/ -lname /etc/passwd -a ! -path *task* 2>/dev/null
/proc/2374/fd/14
/proc/5848/fd/43


La redirezione dell'I/O si verifica quando si dirotta il flusso di dati su file differenti. Il comando
precedente ne contiene un esempio. L'ultima parte “2>/dev/null” indica a Bash di redirigere i
messaggi di errore di #find su /dev/null.


Flusso standard di Bash
Il flusso I/O standard di Bash è verificabile nel lavoro quotidiano, ad es. lanciando il comando
#ls.


#ls -l /etc/passwd unexistent.txt
ls: cannot access unexistent.txt: No such file or directory
-rw-r--r-- 1 root root 1953 2011-04-18 18:45 passwd


Le righe di output inviate alla console sono parte di due flussi differenti: il primo – contenente un
messaggio di errore – è inviato a STDERR, mentre il                              secondo – essendo il vero output del
comando – è inviato a STDOUT. Su un terminale, sia STDOUT che STDERR sono inviati solitamente
allo stesso schermo.



Piping e redirezione dell’output
Nel lavoro quotidiano è consuetudine “mettere in pipe” i comandi, ad esempio:


# cat /etc/passwd | grep “wheel”


Il piping è una forma di redirezione dell'I/O: in questo caso l'output di #cat viene inviato all'input
di #grep – o più precisamente associa lo STDIN di #grep allo STDOUT di #cat.


Un'altra modalità spesso utilizzata è la redirezione verso un file. Questa può essere fatta in
modalità APPEND (accodamento) o TRUNCATE (troncamento). Il troncamento si effettua con



BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680
E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it
Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v.
Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
“>”. L'output di #grep è scritto su /tmp/grep.out. Se il file non esiste, verrà creato, se esiste sarà
invece sovrascritto.


# grep wheel /etc/group > /tmp/grep.out


oppure – poiché “1” rappresenta il file descriptor STDOUT:


# grep wheel /etc/group 1> /tmp/grep.out


La modalità APPEND usa l'operatore “>>”. In questo caso l'output è accodato al file in
questione:


# grep users /etc/group >> /tmp/grep.out


Le ultime versioni di Bash (con le vecchie versioni non funziona) permettono di redirigere
contemporaneamente STDOUT e STDERR in due modi:
         mediante l'operatore >&
          # find /proc >& /dev/null


         mediante l'operatore |&
          #find /proc |& grep task


Andando in profondità
Detto ciò sembra che la redirezione sia una cosa immediata ma in realtà non è proprio così.
Analizzando cosa accade al seguente comando si ha che:


#ls -d /etc/ unexisting.txt > /tmp/ls.out
ls: cannot access unexisting.out: No such file or directory


Come previsto STDOUT finisce nel file /tmp/ls.out, mentre STDERR viene stampato a schermo
segnalando che il file unexisting.txt non esiste.
Ora facciamo pulizia nel nostro ambiente e modifichiamo un po' il comando. Proviamo a
indovinare il risultato: quale sarà il contenuto di STDOUT/STDERR?


#rm -f unexisting.out;
#ls -l unexisting.out > unexisting.out

BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680
E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it
Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v.
Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
Cos'è accaduto? Perché il risultato è diverso dal comando precedente? Sembra che la
redirezione dell'I/O con Bash non sia completamente trasparente. Infatti essa è soggetta
all'implementazione di Bash. Usando un tool come #strace, possiamo analizzare le operazioni
effettuate da Bash.


Strace world
Strace è un potente tool per tracciare le system call. Mostra cosa fa un programma e può
essere utilizzato per capire cos'è accaduto durante l'esecuzione di un comando.
Il primo tentativo porterebbe ad utilizzarlo nel seguente modo:


# strace ls unexisting.out > unexisting.out


Questo tipo di utilizzo è sbagliato, in quanto staremmo semplicemente redirigendo l'output di


# strace ls unexisting.out


nel file unexisting.out.


E' comunque interessante vedere il risultato del comando precedente. L'output a schermo è
molto “verboso” – circa 188 linee. Quanto basta per imparare che anche un comando
semplice come #ls non è poi così semplice.


La prima call esegue il comando ls:


execve("/bin/ls", ["ls", "unexisting.out"], [/* 46 vars */]) = 0
brk(0)                                                                 = 0x7f9000


seguono le syscall contenute in ls per caricare le librerie condivise…


access("/etc/ld.so.nohwcap", F_OK)                                     = -1 ENOENT (No such file or
directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7f32158f6000
access("/etc/ld.so.preload", R_OK)                                     = -1 ENOENT (No such file or
directory)

BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680
E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it
Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v.
Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
open("/etc/ld.so.cache", O_RDONLY)                                     = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=126913, ...}) = 0
mmap(NULL, 126913, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f32158d7000
close(3)                                                               = 0
...


… per usare SELinux e altra roba…


open("/lib/libselinux.so.1", O_RDONLY)                                 = 3
mprotect(0x7f3214905000, 4096, PROT_READ) = 0
mprotect(0x7f3214b09000, 4096, PROT_READ) = 0
...
open("/proc/filesystems", O_RDONLY)                                    = 3


… per usare le librerie di localizzazione…


open("/usr/lib/locale/locale-archive", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
open("/usr/lib/locale/en_GB.utf8/LC_IDENTIFICATI/ON", O_RDONLY) = 3
...


…infine (e solo infine) per operare su STDOUT scrivendo il risultato della system call stat() - quella
usata da #ls.


stat("unexisting.out", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
lstat("unexisting.out", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
fstat(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7f3215774000
write(1, "unexisting.outn", 15)                                       = 15


L’ultima operazione prevede la chiusura di tutti i file descriptor.


close(1)                                                               = 0
close(2)                                                               = 0



BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680
E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it
Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v.
Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
Per avere un output più breve è possibile evitare il caricamento di tutte le librerie di
localizzazione e salvare circa 70 syscall() impostando una variabile di ambiente:


#export LANG=C


Suggerimento: meno syscall() vuol dire comandi più veloci: se si sta parsando un file ASCII di
qualche Gb, è bene ricordarsi di fare #export LANG=C!


Strace su una shell
Ora che si è compreso l'output di strace, si può procedere applicandolo su Bash. Apriamo un
nuovo terminale e tracciamo le syscall utilizzate dal processo Bash:


terminalA# echo "Bash pid is $$"
Bash pid is 2043
terminalB# strace -p 2043
Process 2043 attached - interrupt to quit
read(0,


Ora terminalB traccerà ogni tasto che si preme sul terminalA, così è possibile saltare un sacco di
righe tipo la seguente:


rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo
...}) = 0


Per farlo ovviamente si redirige l'output di strace sul comando grep, tagliando le righe che non
interessano utilizzando il nuovo operatore |&:


# strace -p 2043 |& egrep -v 'rt_sig|ioctl'


Ecco l'output ripulito:


pipe([3, 4])                                                           = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,
child_tidptr=0x7f1347e1c9d0) = 4381
setpgid(4381, 4381)                                                    = 0


BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680
E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it
Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v.
Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
close(3)                                                               = 0
close(4)                                                               = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WSTOPPED|WCONTINUED, NULL)
= 4381
--- SIGCHLD (Child exited) @ 0 (0) ---
wait4(-1, 0x7fff4cf1bc5c, WNOHANG|WSTOPPED|WCONTINUED, NULL) = -1 ECHILD (No
child processes)
write(2, "33]0;rpolli@rpolli: /tmp7rpolli@r"..., 47) = 47


Fino a qui non è apparso nessun riferimento al comando ls, né ad unexisting.out! E’ comunque
evidente che Bash:
     1. crea una pipe() con i file descriptor 3 e 4;
     2. forka() creando un nuovo processo figlio;
     3. aspetta che il figlio ritorni con la syscall wait();
     4. ritorna al prompt.


Il figlio di una shell
Tracciamo ancora più in profondità, dicendo a #strace di seguire (follow) i processi figli della
shell. Per farlo bisogna usare l'opzione “-f”:


# strace -f -p 2043 |& egrep -v 'rt_sig|ioctl'


Vediamo quindi che il processo figlio fa qualcosa in più rispetto a prima – quando si limitava ad
eseguire la exec() del comando ls:


[pid      4469] open("unexisting.out", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid      4469] dup2(3, 1)                                             = 1
[pid      4469] close(3)                                               = 0
[pid      4469] execve("/bin/ls", ["ls", "--color=auto", "unexisting.out"], [/*
46 vars */]) = 0
[pid      4469] brk(0)                                                 = 0xeeb000


In pratica:
     1. crea il file unexisting.out - spiegando così perchè #ls trova il file;
     2. maneggia i file descriptor 3 (associato ad unexisting.out) ed 1 (che è STDOUT) con
          l'operatore dup2();


BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680
E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it
Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v.
Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
3. prosegue come le analisi precedenti.


Maneggiare i file descriptor
Guardando la #man di dup2():


int dup2(int oldfd, int newfd);
..
dup2() makes newfd be the copy of oldfd, closing newfd first if necessary...


Questo vuol dire che dopo il fork(), il processo figlio crea un nuovo file unexisting.out, gli assegna
il file descriptor numero 3 e invoca la system call dup2() che:
     1. chiude il file descriptor #1 del processo figlio – standard output;
     2. duplica il file descriptor #3 associandolo al file descriptor #1: da quel momento ogni
          chiamata che utilizzerà il file descriptor #1 verrà effettuata sul file associato al file
          descriptor #3 – ossia unexisting.out;
     3. chiude il file descriptor #3 poiché il file unexisting.out è oramai associato allo STDOUT (file
          descriptor #1).




BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680
E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it
Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v.
Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
Licenza d'uso “Attribuzione - Non commerciale - Non opere derivate”, secondo i criteri
internazionali Creative Commons (http://creativecommons.org/licenses/by-nc-nd/2.5/it/)




BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680
E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it
Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v.
Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015

Más contenido relacionado

Destacado

2 Linux Comandi Essenziali
2 Linux Comandi Essenziali2 Linux Comandi Essenziali
2 Linux Comandi EssenzialiMauro Ferrigno
 
3 Linux Espressioni Regolari
3 Linux Espressioni Regolari3 Linux Espressioni Regolari
3 Linux Espressioni RegolariMauro Ferrigno
 
7 Linux Comandi Di Sistema
7 Linux Comandi Di Sistema7 Linux Comandi Di Sistema
7 Linux Comandi Di SistemaMauro Ferrigno
 
4 Linux Gestione Utenti
4 Linux Gestione Utenti4 Linux Gestione Utenti
4 Linux Gestione UtentiMauro Ferrigno
 
6 Linux Gestioni Pacchetti Debian
6 Linux Gestioni Pacchetti Debian6 Linux Gestioni Pacchetti Debian
6 Linux Gestioni Pacchetti DebianMauro Ferrigno
 
La shell Bash - Comandi base - Comandi avanzati - Espressioni regolari
 La shell Bash - Comandi base - Comandi avanzati - Espressioni regolari La shell Bash - Comandi base - Comandi avanzati - Espressioni regolari
La shell Bash - Comandi base - Comandi avanzati - Espressioni regolariFulvio Corno
 
Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...
 Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti... Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...
Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...Fulvio Corno
 
4 Linux Gestione Utenti
4 Linux Gestione Utenti4 Linux Gestione Utenti
4 Linux Gestione UtentiMauro Ferrigno
 
12 Linux Network Netmask
12 Linux Network Netmask12 Linux Network Netmask
12 Linux Network NetmaskMauro Ferrigno
 
Leadership Models for Open Source Communities
Leadership Models for Open Source CommunitiesLeadership Models for Open Source Communities
Leadership Models for Open Source CommunitiesPaolo Sammicheli
 
8 Linux Comandi Di Sistema
8 Linux Comandi Di Sistema8 Linux Comandi Di Sistema
8 Linux Comandi Di SistemaMauro Ferrigno
 
corso di amministrazione di sistema GNU/Linux, lezione 2
corso di amministrazione di sistema GNU/Linux, lezione 2corso di amministrazione di sistema GNU/Linux, lezione 2
corso di amministrazione di sistema GNU/Linux, lezione 2Fabio Mosti
 
Lezione corso Base GNU/Linux
Lezione corso Base GNU/LinuxLezione corso Base GNU/Linux
Lezione corso Base GNU/LinuxAlex Palesandro
 

Destacado (20)

2 Linux Comandi Essenziali
2 Linux Comandi Essenziali2 Linux Comandi Essenziali
2 Linux Comandi Essenziali
 
3 Linux Espressioni Regolari
3 Linux Espressioni Regolari3 Linux Espressioni Regolari
3 Linux Espressioni Regolari
 
7 Linux Comandi Di Sistema
7 Linux Comandi Di Sistema7 Linux Comandi Di Sistema
7 Linux Comandi Di Sistema
 
4 Linux Gestione Utenti
4 Linux Gestione Utenti4 Linux Gestione Utenti
4 Linux Gestione Utenti
 
6 Linux Gestioni Pacchetti Debian
6 Linux Gestioni Pacchetti Debian6 Linux Gestioni Pacchetti Debian
6 Linux Gestioni Pacchetti Debian
 
9 Linux Cron
9 Linux Cron9 Linux Cron
9 Linux Cron
 
La shell Bash - Comandi base - Comandi avanzati - Espressioni regolari
 La shell Bash - Comandi base - Comandi avanzati - Espressioni regolari La shell Bash - Comandi base - Comandi avanzati - Espressioni regolari
La shell Bash - Comandi base - Comandi avanzati - Espressioni regolari
 
Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...
 Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti... Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...
Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...
 
11 Linux Network
11 Linux Network11 Linux Network
11 Linux Network
 
4 Linux Gestione Utenti
4 Linux Gestione Utenti4 Linux Gestione Utenti
4 Linux Gestione Utenti
 
12 Linux Network Netmask
12 Linux Network Netmask12 Linux Network Netmask
12 Linux Network Netmask
 
5 Linux Filesystem
5 Linux Filesystem5 Linux Filesystem
5 Linux Filesystem
 
Leadership Models for Open Source Communities
Leadership Models for Open Source CommunitiesLeadership Models for Open Source Communities
Leadership Models for Open Source Communities
 
Comandi bash
Comandi bashComandi bash
Comandi bash
 
Bpm 2015 03-21-v1
Bpm 2015 03-21-v1Bpm 2015 03-21-v1
Bpm 2015 03-21-v1
 
Shell unix
Shell unixShell unix
Shell unix
 
8 Linux Comandi Di Sistema
8 Linux Comandi Di Sistema8 Linux Comandi Di Sistema
8 Linux Comandi Di Sistema
 
Corso Bash
Corso BashCorso Bash
Corso Bash
 
corso di amministrazione di sistema GNU/Linux, lezione 2
corso di amministrazione di sistema GNU/Linux, lezione 2corso di amministrazione di sistema GNU/Linux, lezione 2
corso di amministrazione di sistema GNU/Linux, lezione 2
 
Lezione corso Base GNU/Linux
Lezione corso Base GNU/LinuxLezione corso Base GNU/Linux
Lezione corso Base GNU/Linux
 

Similar a Ridirezionamento di I/O con Bash: un breve approfondimento

Installazione di Joomla nel cloud di Red Hat
Installazione di Joomla nel cloud di Red HatInstallazione di Joomla nel cloud di Red Hat
Installazione di Joomla nel cloud di Red HatBabel
 
Multithreading, multiprocessing e Asincronia
Multithreading, multiprocessing e AsincroniaMultithreading, multiprocessing e Asincronia
Multithreading, multiprocessing e AsincroniaSebastiano Merlino (eTr)
 
Lezioni di programmazione in c i file By Cristian Randieri - www.intellisyste...
Lezioni di programmazione in c i file By Cristian Randieri - www.intellisyste...Lezioni di programmazione in c i file By Cristian Randieri - www.intellisyste...
Lezioni di programmazione in c i file By Cristian Randieri - www.intellisyste...Cristian Randieri PhD
 
MINI CORSO INFORMATICO exchange .pptx
MINI CORSO INFORMATICO exchange .pptxMINI CORSO INFORMATICO exchange .pptx
MINI CORSO INFORMATICO exchange .pptxssuser1cba1b
 
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"Camelug Fava
 
Comunicazione tra procesi Linux
Comunicazione tra procesi LinuxComunicazione tra procesi Linux
Comunicazione tra procesi LinuxMarco Buttolo
 
Nagios in alta affidabilità con strumenti open source
Nagios in alta affidabilità con strumenti open sourceNagios in alta affidabilità con strumenti open source
Nagios in alta affidabilità con strumenti open sourceBabel
 
Linux Day Torino 2015 applicazioni per iniziare
Linux Day Torino 2015   applicazioni per iniziareLinux Day Torino 2015   applicazioni per iniziare
Linux Day Torino 2015 applicazioni per iniziareFrancesco Tucci
 
Sicurezza flessibile con SELinux: architettura e configurazione
Sicurezza flessibile con SELinux: architettura e configurazioneSicurezza flessibile con SELinux: architettura e configurazione
Sicurezza flessibile con SELinux: architettura e configurazioneBabel
 
Data Hiding
Data HidingData Hiding
Data HidingNaLUG
 
Data hiding - metodologie e strumenti open source
Data hiding - metodologie e strumenti open sourceData hiding - metodologie e strumenti open source
Data hiding - metodologie e strumenti open sourceMarco Ferrigno
 
Attacchi alle applicazioni basati su buffer overflow
Attacchi alle applicazioni basati su buffer overflowAttacchi alle applicazioni basati su buffer overflow
Attacchi alle applicazioni basati su buffer overflowGiacomo Antonino Fazio
 
RiminiLUG. Mini Corso su Linux p2: Networking & Terminal
RiminiLUG. Mini Corso su Linux p2: Networking & TerminalRiminiLUG. Mini Corso su Linux p2: Networking & Terminal
RiminiLUG. Mini Corso su Linux p2: Networking & TerminalAlessandro Carichini
 
Marco Signorelli 19 09 2008 Ordine Degli Avvocati Di Bergamo
Marco Signorelli   19 09 2008 Ordine Degli Avvocati Di BergamoMarco Signorelli   19 09 2008 Ordine Degli Avvocati Di Bergamo
Marco Signorelli 19 09 2008 Ordine Degli Avvocati Di BergamoAndrea Rossetti
 
1informaticadibase 110602151357 Phpapp02
1informaticadibase 110602151357 Phpapp021informaticadibase 110602151357 Phpapp02
1informaticadibase 110602151357 Phpapp02Formazioneenna Enna
 

Similar a Ridirezionamento di I/O con Bash: un breve approfondimento (20)

Installazione di Joomla nel cloud di Red Hat
Installazione di Joomla nel cloud di Red HatInstallazione di Joomla nel cloud di Red Hat
Installazione di Joomla nel cloud di Red Hat
 
Multithreading, multiprocessing e Asincronia
Multithreading, multiprocessing e AsincroniaMultithreading, multiprocessing e Asincronia
Multithreading, multiprocessing e Asincronia
 
Lezioni di programmazione in c i file By Cristian Randieri - www.intellisyste...
Lezioni di programmazione in c i file By Cristian Randieri - www.intellisyste...Lezioni di programmazione in c i file By Cristian Randieri - www.intellisyste...
Lezioni di programmazione in c i file By Cristian Randieri - www.intellisyste...
 
Openmoko
OpenmokoOpenmoko
Openmoko
 
MINI CORSO INFORMATICO exchange .pptx
MINI CORSO INFORMATICO exchange .pptxMINI CORSO INFORMATICO exchange .pptx
MINI CORSO INFORMATICO exchange .pptx
 
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
 
Comunicazione tra procesi Linux
Comunicazione tra procesi LinuxComunicazione tra procesi Linux
Comunicazione tra procesi Linux
 
Nagios in alta affidabilità con strumenti open source
Nagios in alta affidabilità con strumenti open sourceNagios in alta affidabilità con strumenti open source
Nagios in alta affidabilità con strumenti open source
 
Linux Day Torino 2015 applicazioni per iniziare
Linux Day Torino 2015   applicazioni per iniziareLinux Day Torino 2015   applicazioni per iniziare
Linux Day Torino 2015 applicazioni per iniziare
 
Sicurezza flessibile con SELinux: architettura e configurazione
Sicurezza flessibile con SELinux: architettura e configurazioneSicurezza flessibile con SELinux: architettura e configurazione
Sicurezza flessibile con SELinux: architettura e configurazione
 
Data Hiding
Data HidingData Hiding
Data Hiding
 
X2 Linux Riassunti
X2 Linux RiassuntiX2 Linux Riassunti
X2 Linux Riassunti
 
Data hiding - metodologie e strumenti open source
Data hiding - metodologie e strumenti open sourceData hiding - metodologie e strumenti open source
Data hiding - metodologie e strumenti open source
 
Attacchi alle applicazioni basati su buffer overflow
Attacchi alle applicazioni basati su buffer overflowAttacchi alle applicazioni basati su buffer overflow
Attacchi alle applicazioni basati su buffer overflow
 
RiminiLUG. Mini Corso su Linux p2: Networking & Terminal
RiminiLUG. Mini Corso su Linux p2: Networking & TerminalRiminiLUG. Mini Corso su Linux p2: Networking & Terminal
RiminiLUG. Mini Corso su Linux p2: Networking & Terminal
 
unreal IRCd 3281
unreal IRCd 3281unreal IRCd 3281
unreal IRCd 3281
 
Marco Signorelli 19 09 2008 Ordine Degli Avvocati Di Bergamo
Marco Signorelli   19 09 2008 Ordine Degli Avvocati Di BergamoMarco Signorelli   19 09 2008 Ordine Degli Avvocati Di Bergamo
Marco Signorelli 19 09 2008 Ordine Degli Avvocati Di Bergamo
 
1informaticadibase 110602151357 Phpapp02
1informaticadibase 110602151357 Phpapp021informaticadibase 110602151357 Phpapp02
1informaticadibase 110602151357 Phpapp02
 
Informatica di base
Informatica di baseInformatica di base
Informatica di base
 
Informatica di base
Informatica di baseInformatica di base
Informatica di base
 

Más de Babel

Sophos Complete Security: arte e scienza della sicurezza
Sophos Complete Security: arte e scienza della sicurezzaSophos Complete Security: arte e scienza della sicurezza
Sophos Complete Security: arte e scienza della sicurezzaBabel
 
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...Babel
 
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...Babel
 
Intercettazioni: guida alle nuove norme per i provider
Intercettazioni: guida alle nuove norme per i providerIntercettazioni: guida alle nuove norme per i provider
Intercettazioni: guida alle nuove norme per i providerBabel
 
Dalla virtualizzazione al private cloud: Il Patronato INCA rinnova la fiducia...
Dalla virtualizzazione al private cloud: Il Patronato INCA rinnova la fiducia...Dalla virtualizzazione al private cloud: Il Patronato INCA rinnova la fiducia...
Dalla virtualizzazione al private cloud: Il Patronato INCA rinnova la fiducia...Babel
 
Will iPython replace Bash?
Will iPython replace Bash?Will iPython replace Bash?
Will iPython replace Bash?Babel
 
La gestione integrata della sicurezza in ANSA: dal firewalling all'UTM
La gestione integrata della sicurezza in ANSA: dal firewalling all'UTMLa gestione integrata della sicurezza in ANSA: dal firewalling all'UTM
La gestione integrata della sicurezza in ANSA: dal firewalling all'UTMBabel
 
Installare i server via rete con Cobbler
Installare i server via rete con CobblerInstallare i server via rete con Cobbler
Installare i server via rete con CobblerBabel
 
Shell Control Box - Il Gusto della Sicurezza
Shell Control Box - Il Gusto della SicurezzaShell Control Box - Il Gusto della Sicurezza
Shell Control Box - Il Gusto della SicurezzaBabel
 
Tracciamento delle attività di amministrazione mediante i BalaBit Shell Contr...
Tracciamento delle attività di amministrazione mediante i BalaBit Shell Contr...Tracciamento delle attività di amministrazione mediante i BalaBit Shell Contr...
Tracciamento delle attività di amministrazione mediante i BalaBit Shell Contr...Babel
 
La Desktop Virtualization
La Desktop VirtualizationLa Desktop Virtualization
La Desktop VirtualizationBabel
 
Crittografia e integrazione dei sistemi con Python
Crittografia e integrazione dei sistemi con PythonCrittografia e integrazione dei sistemi con Python
Crittografia e integrazione dei sistemi con PythonBabel
 
Intercettazioni e posta elettronica: le misure di sicurezza per i gestori
Intercettazioni e posta elettronica: le misure di sicurezza per i gestoriIntercettazioni e posta elettronica: le misure di sicurezza per i gestori
Intercettazioni e posta elettronica: le misure di sicurezza per i gestoriBabel
 
Babel presenta: Opsview
Babel presenta: OpsviewBabel presenta: Opsview
Babel presenta: OpsviewBabel
 
Monitoraggio di infrastrutture IT mediante Opsview Enteprise V4
Monitoraggio di infrastrutture IT mediante Opsview Enteprise V4Monitoraggio di infrastrutture IT mediante Opsview Enteprise V4
Monitoraggio di infrastrutture IT mediante Opsview Enteprise V4Babel
 
OpenVAS, lo strumento open source per il vulnerability assessment
OpenVAS, lo strumento open source per il vulnerability assessmentOpenVAS, lo strumento open source per il vulnerability assessment
OpenVAS, lo strumento open source per il vulnerability assessmentBabel
 
Testing with MySQL embedded
Testing with MySQL embeddedTesting with MySQL embedded
Testing with MySQL embeddedBabel
 
Il fenomeno dello spam: origine e contromisure
Il fenomeno dello spam: origine e contromisureIl fenomeno dello spam: origine e contromisure
Il fenomeno dello spam: origine e contromisureBabel
 
Il software open source: regole e licenze
Il software open source: regole e licenzeIl software open source: regole e licenze
Il software open source: regole e licenzeBabel
 
Git: un'introduzione pratica
Git: un'introduzione praticaGit: un'introduzione pratica
Git: un'introduzione praticaBabel
 

Más de Babel (20)

Sophos Complete Security: arte e scienza della sicurezza
Sophos Complete Security: arte e scienza della sicurezzaSophos Complete Security: arte e scienza della sicurezza
Sophos Complete Security: arte e scienza della sicurezza
 
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...
 
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...
L’innovazione a difesa della tradizione: il caso dell’Archivio Storico della ...
 
Intercettazioni: guida alle nuove norme per i provider
Intercettazioni: guida alle nuove norme per i providerIntercettazioni: guida alle nuove norme per i provider
Intercettazioni: guida alle nuove norme per i provider
 
Dalla virtualizzazione al private cloud: Il Patronato INCA rinnova la fiducia...
Dalla virtualizzazione al private cloud: Il Patronato INCA rinnova la fiducia...Dalla virtualizzazione al private cloud: Il Patronato INCA rinnova la fiducia...
Dalla virtualizzazione al private cloud: Il Patronato INCA rinnova la fiducia...
 
Will iPython replace Bash?
Will iPython replace Bash?Will iPython replace Bash?
Will iPython replace Bash?
 
La gestione integrata della sicurezza in ANSA: dal firewalling all'UTM
La gestione integrata della sicurezza in ANSA: dal firewalling all'UTMLa gestione integrata della sicurezza in ANSA: dal firewalling all'UTM
La gestione integrata della sicurezza in ANSA: dal firewalling all'UTM
 
Installare i server via rete con Cobbler
Installare i server via rete con CobblerInstallare i server via rete con Cobbler
Installare i server via rete con Cobbler
 
Shell Control Box - Il Gusto della Sicurezza
Shell Control Box - Il Gusto della SicurezzaShell Control Box - Il Gusto della Sicurezza
Shell Control Box - Il Gusto della Sicurezza
 
Tracciamento delle attività di amministrazione mediante i BalaBit Shell Contr...
Tracciamento delle attività di amministrazione mediante i BalaBit Shell Contr...Tracciamento delle attività di amministrazione mediante i BalaBit Shell Contr...
Tracciamento delle attività di amministrazione mediante i BalaBit Shell Contr...
 
La Desktop Virtualization
La Desktop VirtualizationLa Desktop Virtualization
La Desktop Virtualization
 
Crittografia e integrazione dei sistemi con Python
Crittografia e integrazione dei sistemi con PythonCrittografia e integrazione dei sistemi con Python
Crittografia e integrazione dei sistemi con Python
 
Intercettazioni e posta elettronica: le misure di sicurezza per i gestori
Intercettazioni e posta elettronica: le misure di sicurezza per i gestoriIntercettazioni e posta elettronica: le misure di sicurezza per i gestori
Intercettazioni e posta elettronica: le misure di sicurezza per i gestori
 
Babel presenta: Opsview
Babel presenta: OpsviewBabel presenta: Opsview
Babel presenta: Opsview
 
Monitoraggio di infrastrutture IT mediante Opsview Enteprise V4
Monitoraggio di infrastrutture IT mediante Opsview Enteprise V4Monitoraggio di infrastrutture IT mediante Opsview Enteprise V4
Monitoraggio di infrastrutture IT mediante Opsview Enteprise V4
 
OpenVAS, lo strumento open source per il vulnerability assessment
OpenVAS, lo strumento open source per il vulnerability assessmentOpenVAS, lo strumento open source per il vulnerability assessment
OpenVAS, lo strumento open source per il vulnerability assessment
 
Testing with MySQL embedded
Testing with MySQL embeddedTesting with MySQL embedded
Testing with MySQL embedded
 
Il fenomeno dello spam: origine e contromisure
Il fenomeno dello spam: origine e contromisureIl fenomeno dello spam: origine e contromisure
Il fenomeno dello spam: origine e contromisure
 
Il software open source: regole e licenze
Il software open source: regole e licenzeIl software open source: regole e licenze
Il software open source: regole e licenze
 
Git: un'introduzione pratica
Git: un'introduzione praticaGit: un'introduzione pratica
Git: un'introduzione pratica
 

Ridirezionamento di I/O con Bash: un breve approfondimento

  • 1. Uno sguardo approfondito alla redirezione dell'I/O con Bash di Roberto Polli Redirigere l’I/O La redirezione dell'I/O è il processo atto a controllare l'Input/Output di un programma. Quando si scrive un programma o uno script è possibile leggere dalla console e scrivere sullo schermo. I file standard usati per l'I/O sono tre: il programma legge da standard input, scrive il risultato delle operazioni su standard output e invia messaggi di errore a standard error. Su un sistema Unix, i processi identificano ogni file con un numero intero progressivo: il file descriptor. Questo numero è univoco all'interno di ogni processo. Quando un processo apre un file, gli assegna un nuovo file descriptor. STDIN, STDOUT e STDERR sono associati rispettivamente ai primi tre interi: 0, 1 e 2. Su Linux è possibile trovare i file descriptor di un processo tramite il filesystem /proc. Ad esempio elencando i file descriptor del processo con pid 1201 si può notare che oltre a quelli di default ce n'è un altro: crond.pid. Ciò significa che il processo con pid 1201 ha aperto il file /var/run/crond.pid. # ls /proc/1201/fd/ -l total 0 lr-x------ 1 root root 64 2011-06-10 08:43 0 -> /dev/null l-wx------ 1 root root 64 2011-06-10 08:43 1 -> /dev/null l-wx------ 1 root root 64 2011-06-10 08:43 2 -> /dev/null lrwx------ 1 root root 64 2011-06-10 08:43 3 -> /var/run/crond.pid L'unicità dei file descriptor è relativa al processo: se un altro processo apre lo stesso file (ex. /var/run/crond.pid) gli potrà assegnare un altro intero (es. 5). BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680 E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v. Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
  • 2. Es: questo comando mostra tutti i processi che usano /etc/passwd mostrando il loro pid e i corrispondenti file descriptor. Consultare #man find per ulteriori informazioni sul comando find. #sudo find /proc/ -lname /etc/passwd -a ! -path *task* 2>/dev/null /proc/2374/fd/14 /proc/5848/fd/43 La redirezione dell'I/O si verifica quando si dirotta il flusso di dati su file differenti. Il comando precedente ne contiene un esempio. L'ultima parte “2>/dev/null” indica a Bash di redirigere i messaggi di errore di #find su /dev/null. Flusso standard di Bash Il flusso I/O standard di Bash è verificabile nel lavoro quotidiano, ad es. lanciando il comando #ls. #ls -l /etc/passwd unexistent.txt ls: cannot access unexistent.txt: No such file or directory -rw-r--r-- 1 root root 1953 2011-04-18 18:45 passwd Le righe di output inviate alla console sono parte di due flussi differenti: il primo – contenente un messaggio di errore – è inviato a STDERR, mentre il secondo – essendo il vero output del comando – è inviato a STDOUT. Su un terminale, sia STDOUT che STDERR sono inviati solitamente allo stesso schermo. Piping e redirezione dell’output Nel lavoro quotidiano è consuetudine “mettere in pipe” i comandi, ad esempio: # cat /etc/passwd | grep “wheel” Il piping è una forma di redirezione dell'I/O: in questo caso l'output di #cat viene inviato all'input di #grep – o più precisamente associa lo STDIN di #grep allo STDOUT di #cat. Un'altra modalità spesso utilizzata è la redirezione verso un file. Questa può essere fatta in modalità APPEND (accodamento) o TRUNCATE (troncamento). Il troncamento si effettua con BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680 E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v. Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
  • 3. “>”. L'output di #grep è scritto su /tmp/grep.out. Se il file non esiste, verrà creato, se esiste sarà invece sovrascritto. # grep wheel /etc/group > /tmp/grep.out oppure – poiché “1” rappresenta il file descriptor STDOUT: # grep wheel /etc/group 1> /tmp/grep.out La modalità APPEND usa l'operatore “>>”. In questo caso l'output è accodato al file in questione: # grep users /etc/group >> /tmp/grep.out Le ultime versioni di Bash (con le vecchie versioni non funziona) permettono di redirigere contemporaneamente STDOUT e STDERR in due modi:  mediante l'operatore >& # find /proc >& /dev/null  mediante l'operatore |& #find /proc |& grep task Andando in profondità Detto ciò sembra che la redirezione sia una cosa immediata ma in realtà non è proprio così. Analizzando cosa accade al seguente comando si ha che: #ls -d /etc/ unexisting.txt > /tmp/ls.out ls: cannot access unexisting.out: No such file or directory Come previsto STDOUT finisce nel file /tmp/ls.out, mentre STDERR viene stampato a schermo segnalando che il file unexisting.txt non esiste. Ora facciamo pulizia nel nostro ambiente e modifichiamo un po' il comando. Proviamo a indovinare il risultato: quale sarà il contenuto di STDOUT/STDERR? #rm -f unexisting.out; #ls -l unexisting.out > unexisting.out BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680 E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v. Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
  • 4. Cos'è accaduto? Perché il risultato è diverso dal comando precedente? Sembra che la redirezione dell'I/O con Bash non sia completamente trasparente. Infatti essa è soggetta all'implementazione di Bash. Usando un tool come #strace, possiamo analizzare le operazioni effettuate da Bash. Strace world Strace è un potente tool per tracciare le system call. Mostra cosa fa un programma e può essere utilizzato per capire cos'è accaduto durante l'esecuzione di un comando. Il primo tentativo porterebbe ad utilizzarlo nel seguente modo: # strace ls unexisting.out > unexisting.out Questo tipo di utilizzo è sbagliato, in quanto staremmo semplicemente redirigendo l'output di # strace ls unexisting.out nel file unexisting.out. E' comunque interessante vedere il risultato del comando precedente. L'output a schermo è molto “verboso” – circa 188 linee. Quanto basta per imparare che anche un comando semplice come #ls non è poi così semplice. La prima call esegue il comando ls: execve("/bin/ls", ["ls", "unexisting.out"], [/* 46 vars */]) = 0 brk(0) = 0x7f9000 seguono le syscall contenute in ls per caricare le librerie condivise… access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f32158f6000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680 E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v. Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
  • 5. open("/etc/ld.so.cache", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=126913, ...}) = 0 mmap(NULL, 126913, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f32158d7000 close(3) = 0 ... … per usare SELinux e altra roba… open("/lib/libselinux.so.1", O_RDONLY) = 3 mprotect(0x7f3214905000, 4096, PROT_READ) = 0 mprotect(0x7f3214b09000, 4096, PROT_READ) = 0 ... open("/proc/filesystems", O_RDONLY) = 3 … per usare le librerie di localizzazione… open("/usr/lib/locale/locale-archive", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/locale.alias", O_RDONLY) = 3 open("/usr/lib/locale/en_GB.utf8/LC_IDENTIFICATI/ON", O_RDONLY) = 3 ... …infine (e solo infine) per operare su STDOUT scrivendo il risultato della system call stat() - quella usata da #ls. stat("unexisting.out", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 lstat("unexisting.out", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 fstat(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3215774000 write(1, "unexisting.outn", 15) = 15 L’ultima operazione prevede la chiusura di tutti i file descriptor. close(1) = 0 close(2) = 0 BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680 E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v. Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
  • 6. Per avere un output più breve è possibile evitare il caricamento di tutte le librerie di localizzazione e salvare circa 70 syscall() impostando una variabile di ambiente: #export LANG=C Suggerimento: meno syscall() vuol dire comandi più veloci: se si sta parsando un file ASCII di qualche Gb, è bene ricordarsi di fare #export LANG=C! Strace su una shell Ora che si è compreso l'output di strace, si può procedere applicandolo su Bash. Apriamo un nuovo terminale e tracciamo le syscall utilizzate dal processo Bash: terminalA# echo "Bash pid is $$" Bash pid is 2043 terminalB# strace -p 2043 Process 2043 attached - interrupt to quit read(0, Ora terminalB traccerà ogni tasto che si preme sul terminalA, così è possibile saltare un sacco di righe tipo la seguente: rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0 Per farlo ovviamente si redirige l'output di strace sul comando grep, tagliando le righe che non interessano utilizzando il nuovo operatore |&: # strace -p 2043 |& egrep -v 'rt_sig|ioctl' Ecco l'output ripulito: pipe([3, 4]) = 0 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1347e1c9d0) = 4381 setpgid(4381, 4381) = 0 BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680 E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v. Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
  • 7. close(3) = 0 close(4) = 0 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WSTOPPED|WCONTINUED, NULL) = 4381 --- SIGCHLD (Child exited) @ 0 (0) --- wait4(-1, 0x7fff4cf1bc5c, WNOHANG|WSTOPPED|WCONTINUED, NULL) = -1 ECHILD (No child processes) write(2, "33]0;rpolli@rpolli: /tmp7rpolli@r"..., 47) = 47 Fino a qui non è apparso nessun riferimento al comando ls, né ad unexisting.out! E’ comunque evidente che Bash: 1. crea una pipe() con i file descriptor 3 e 4; 2. forka() creando un nuovo processo figlio; 3. aspetta che il figlio ritorni con la syscall wait(); 4. ritorna al prompt. Il figlio di una shell Tracciamo ancora più in profondità, dicendo a #strace di seguire (follow) i processi figli della shell. Per farlo bisogna usare l'opzione “-f”: # strace -f -p 2043 |& egrep -v 'rt_sig|ioctl' Vediamo quindi che il processo figlio fa qualcosa in più rispetto a prima – quando si limitava ad eseguire la exec() del comando ls: [pid 4469] open("unexisting.out", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 [pid 4469] dup2(3, 1) = 1 [pid 4469] close(3) = 0 [pid 4469] execve("/bin/ls", ["ls", "--color=auto", "unexisting.out"], [/* 46 vars */]) = 0 [pid 4469] brk(0) = 0xeeb000 In pratica: 1. crea il file unexisting.out - spiegando così perchè #ls trova il file; 2. maneggia i file descriptor 3 (associato ad unexisting.out) ed 1 (che è STDOUT) con l'operatore dup2(); BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680 E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v. Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
  • 8. 3. prosegue come le analisi precedenti. Maneggiare i file descriptor Guardando la #man di dup2(): int dup2(int oldfd, int newfd); .. dup2() makes newfd be the copy of oldfd, closing newfd first if necessary... Questo vuol dire che dopo il fork(), il processo figlio crea un nuovo file unexisting.out, gli assegna il file descriptor numero 3 e invoca la system call dup2() che: 1. chiude il file descriptor #1 del processo figlio – standard output; 2. duplica il file descriptor #3 associandolo al file descriptor #1: da quel momento ogni chiamata che utilizzerà il file descriptor #1 verrà effettuata sul file associato al file descriptor #3 – ossia unexisting.out; 3. chiude il file descriptor #3 poiché il file unexisting.out è oramai associato allo STDOUT (file descriptor #1). BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680 E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v. Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015
  • 9. Licenza d'uso “Attribuzione - Non commerciale - Non opere derivate”, secondo i criteri internazionali Creative Commons (http://creativecommons.org/licenses/by-nc-nd/2.5/it/) BABEL S.r.l. - P.zza S.Benedetto da Norcia 33 - 00040, Pomezia (RM) - Tel:. +39 06.9826.9600 - Fax. +39 06.9826.9680 E-Mail: info@babel.it – PEC: babel@pec.babel.it – WEB: http://www.babel.it Reg. Imprese di Roma N° 06062681009 - N.R.E.A. 953123 - P.I. e C.F. 06062681009 Cap. Soc. € 102.774,00 i.v. Società soggetta alla direzione e coordinamento della Par-tec S.p.A - Società iscritta al registro delle Imprese di Milano al numero 1293820015