Linux Tutorial – Puntata 23

di jolek78

Care/i fruitrici e fruitori del blog, in questi post – ogni domenica mattina – si parlerà del sistema operativo GNU/Linux e degli strumenti per utilizzarlo al massimo delle potenzialità. Cercheremo di spiegare come funziona, cosa è il kernel, come costruirsi una vpn, come settare un firewall e giocare col terminale, usare adb e altro. Se il capitalismo della sorveglianza ci vuole passivi consumatori-consumatrici di servizi noi si risponde con un po’ di “cultura informatica” e un MARAMEO (quasi affettuoso). Buona lettura!

Siamo in agosto, siamo tutti stanchi e questo jolek78 mi si presenta ancora sul blog con un ulteriore episodio su linux e le sue meraviglie. Ma che vuole da noi lettori? Son qui per leggere di politica, fantascienza e società, mica per leggere d’informatica, giusto? A quel punto jolek78 si alzo’ dalla poltrona un po’ sgarrupata comprata in un mercatino Oxfam nella lontana Scozia e disse “ah, perché non viviamo forse in un mondo informatizzato? e le nostre scelte quotidiane non influenzano forse quello che fanno o non fanno le big corporations delle quali noi ci lamentiamo ogni giorno?” Bentornati a tutti. Qui non si fa la rivoluzione, ma si propone una alternativa che, come avrete capito, c’e’, è viva e lotta con noi. E parlando appunto di alternative, oggi cominceremo una serie di puntate dedicate ad alcuni tool storici che su linux servono per estrarre informazioni dal contesto, per trovare un file, per selezionare delle colonne o delle righe da un log, per scaricare ed estrarre informazioni da un sito web. Oggi cominceremo in maniera semplice, e parleremo del tool che ho amato di più negli ultimi anni: find. Tenete a mente che la puntata precedente, in cui si parlava delle espressioni regolari, serviva appunto come introduzione a questa serie di puntate.

FIND

Questo e’ un tool piuttosto noto fin dai tempi in cui il papa’ di Linux, Unix, era l’unico attore in campo. Find serve essenzialmente per fare ricerche all’interno del filesystem, e per trovare, attraverso delle parole chiave, dei file o delle directory. Il concetto di base è molto semplice dunque. Vediamo ora come lo fa.

FIND(1)                                    General Commands Manual                                   FIND(1)

NAME
       find - search for files in a directory hierarchy

SYNOPSIS
       find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

DESCRIPTION
       This  manual  page documents the GNU version of find.  GNU find searches the directory tree rooted at
       each given starting-point by evaluating the given expression from left to  right,  according  to  the
       rules  of precedence (see section OPERATORS), until the outcome is known (the left hand side is false
       for and operations, true for or), at which point find moves on to the next file name.  If  no  start‐
       ing-point is specified, `.' is assumed.

       If  you are using find in an environment where security is important (for example if you are using it
       to search directories that are writable by other users), you should  read  the  `Security  Considera‐
       tions'  chapter  of  the findutils documentation, which is called Finding Files and comes with findu‐
       tils.  That document also includes a lot more detail and discussion than this manual page, so you may
       find it a more useful source of information.

Dalle prime sezioni del manuale si può vedere che il suo utilizzo pratico viene effettuato in maniera tradizionale, cioè nome del programma + opzioni. Vediamo ora pero’ la pratica. Creiamo prima di tutto un file all’interno della directory temporanea, facciamo finta di averne dimenticato il nome, e andiamolo a cercare. A preposito, vi ricordate che qui avevamo già creato un file con la novella di Coleridge “The rhyme of the ancient mariner“? Stupiti? Anche la puntata su IPFS fa parte del progetto tutorial… Beh, allora, siccome ce l’abbiamo già, copiamolo nella directory temporanea.

bottega@bottegadelbarbieri  ~  cd /tmp/
bottega@bottegadelbarbieri  /tmp  cp /home/bottega/th 
the-rhyme-mariner-in.txt  the-rhyme-mariner.txt     
bottega@bottegadelbarbieri  /tmp  cp /home/bottega/the-rhyme-mariner.txt .
'/home/bottega/the-rhyme-mariner.txt' -> './the-rhyme-mariner.txt'

-name

Con una ricerca semplice, con l’utente bottega, riceviamo un output pieno di errori. Ma è ovvio, non siamo root

bottega@bottegadelbarbieri  /tmp  find /*  -name '*mariner*'
[...]
find: ‘/proc/588/fdinfo’: Permission denied
find: ‘/proc/588/ns’: Permission denied
find: ‘/proc/598/task/598/fd’: Permission denied
find: ‘/proc/598/task/598/fdinfo’: Permission denied
[...]
/home/bottega/the-rhyme-mariner-in.txt
/home/bottega/the-rhyme-mariner.txt
/tmp/the-rhyme-mariner.txt

2> /dev/null

Proviamo ora a fare la stessa operazione ma andando di root e buttando tutti gli errori in /dev/null

bottega@bottegadelbarbieri  /tmp  sudo find /*  -name '*mariner*' 2>/dev/null 
[sudo] password for bottega: 
/home/bottega/the-rhyme-mariner-in.txt
/home/bottega/the-rhyme-mariner.txt
/tmp/the-rhyme-mariner.txt

-type || -exec {} \;

Carino vero? Ma si può fare di meglio. Specificando la tipologia di file e  usando il parametro -exec, e facendogli eseguire un altro comando:

bottega@bottegadelbarbieri  /tmp  sudo find /*  -name '*mariner*' -type f -exec ls -lhai {} \; 2>/dev/null
522252 -rw-rw-r-- 1 bottega bottega 20K May 16 03:41 /home/bottega/the-rhyme-mariner-in.txt
523058 -rw-rw-r-- 1 bottega bottega 20K May 16 03:02 /home/bottega/the-rhyme-mariner.txt
657134 -rw-rw-r-- 1 bottega bottega 20K Aug 14 16:35 /tmp/the-rhyme-mariner.txt

Se invece vogliamo vedere anche la dimensione di quei file:

bottega@bottegadelbarbieri  /tmp  sudo find /*  -name '*mariner*' -type f -exec du -shx {} \; 2>/dev/null
20K	/home/bottega/the-rhyme-mariner-in.txt
20K	/home/bottega/the-rhyme-mariner.txt
20K	/tmp/the-rhyme-mariner.txt

Dunque:

find        > cerchiamo il file
/*          > lo cerchiamo dalla / directory in poi
-name       > cerchiamo il file solamenente tramite il suo nome
-type       > cerchiamo soltanto i files
-exec       > eseguiamo un altro comando
{}          > chiudi il comando di exec
\;          > chiudi il comando find
2>/dev/null > butta lo stderr in null

-size

Ora. Ricordate che tante puntate fa avevamo creato un random file e uno sparse file da un giga per dimostrare la differenza fra il comando df e du?

bottega@bottegadelbarbieri  ~  sudo find /* -name '*.file' -type f -size +900M -exec du -shx --apparent-size  {} \; 2>/dev/null 
1.0G	/home/bottega/random.file
1.0G	/home/bottega/sparse.file

Dunque:

-size +900M      > cerca tutti i file che abbiamo dimensioni superiori ai 900 mega

-perm

E ricordate che in un’altra puntata, quando parlavamo dello stdin stderr stdout avevamo creato uno script in bash (.sh) con permessi di esecuzione per testare l’output? Ora provioamo a cercarlo:

bottega@bottegadelbarbieri  ~  find /home/bottega/  -name '*.sh' -perm 775 -exec ls -lha   {} \;
-rwxrwxr-x 1 bottega bottega 72 May 16 00:20 /home/bottega/script-std.sh

Dunque:

-perm 775 > cerca tutti i file con permessi lettura scrittura esecuzione che corrispondano a 755

E indovinate un po’? Se volessimo rimuovere tutti i bash script, con permessi 775 dentro la directory bottega? Basterebbe mettere il comando rm (rimuovi) dopo il parametro -exec. Benvenuto monsieur De La Palice.

bottega@bottegadelbarbieri  ~  find /home/bottega/  -name '*.sh' -perm 775 -exec rm  {} \;
bottega@bottegadelbarbieri  ~  find /home/bottega/  -name '*.sh' -perm 775 -exec ls  {} \;
bottega@bottegadelbarbieri  ~  

-user || -group

Possiamo pero’ cercare anche i file che appartengono ad un determinato utente o gruppo:

bottega@bottegadelbarbieri  ~  find /home/bottega/* -type f -user bottega -exec ls -lh {} \;
-rw-r--r-- 1 bottega bottega 12K Jul 10 19:46 /home/bottega/Documents/.lorem-ipsum.txt.swp
-rw-rw-r-- 1 bottega bottega 456 Jul 10 19:44 /home/bottega/Documents/lorem-ipsum.txt
-rw-r--r-- 1 bottega bottega 344 May 16 03:39 /home/bottega/magic.mgc
-rw-rw-r-- 1 bottega bottega 90 Aug 7 18:17 /home/bottega/names.txt
-rw-rw-r-- 1 bottega bottega 117K Feb 27 09:31 /home/bottega/Pictures/052-wallpaper.jpg
-rw-rw-r-- 1 bottega bottega 1.0G Mar 9 23:35 /home/bottega/random.file
-rw-rw-r-- 1 bottega bottega 1.0G Mar 10 00:12 /home/bottega/sparse.file
-rw-r--r-- 1 bottega bottega 7.3K Apr 9 2020 '/home/bottega/Templates/OpenDocument Text.odt'
-rw-r--r-- 1 bottega bottega 0 Apr 9 2020 '/home/bottega/Templates/Plain Text.txt'
-rw-r--r-- 1 bottega bottega 6.7K Apr 9 2020 '/home/bottega/Templates/OpenDocument Spreadsheet.ods'
-rw-rw-r-- 1 bottega bottega 51K May 16 02:14 /home/bottega/test-err.txt
-rw-rw-r-- 1 bottega bottega 1.1K May 16 03:06 /home/bottega/test-out.txt
-rw-rw-r-- 1 bottega bottega 34 May 16 03:05 /home/bottega/test.txt
-rw-rw-r-- 1 bottega bottega 20K May 16 03:41 /home/bottega/the-rhyme-mariner-in.txt
-rw-rw-r-- 1 bottega bottega 20K May 16 03:02 /home/bottega/the-rhyme-mariner.txt

Dunque:

-user      > cerca tutti i file che apparengono ad un determinato utente
-group     > cerca tutti i file che apparengono ad un determinato gruppo

-mtime

Facciamo finta ora di essere in un caso tutto particolare, dove vogliamo trovare alcuni file di log vecchi e che, per qualche ragione, vogliamo visualizzarli. I log files li vedremo meglio quando parleremo dei comandi tail e grep, ma per ora:

bottega@bottegadelbarbieri  ~  sudo su - 
root@bottegadelbarbieri:~# cd /var/log/
root@bottegadelbarbieri:/var/log# find . -name 'syslog*'  -exec ls -lhai {} \;
130950 -rw-r----- 1 syslog adm 174K Aug 14 18:25 ./syslog
152358 -rw------- 1 syslog adm 253K Feb 27 09:04 ./installer/syslog
135961 -rw-r----- 1 syslog adm 7.1K Aug  7 09:42 ./syslog.4.gz
136340 -rw-r----- 1 syslog adm 21K Jul 24 07:31 ./syslog.6.gz
132423 -rw-r----- 1 syslog adm 23K Aug 14 00:00 ./syslog.1
132604 -rw-r----- 1 syslog adm 6.2K Jul 18 00:00 ./syslog.7.gz
133348 -rw-r----- 1 syslog adm 56K Jul 25 00:00 ./syslog.5.gz
133395 -rw-r----- 1 syslog adm 4.6K Aug  8 00:00 ./syslog.3.gz
135442 -rw-r----- 1 syslog adm 6.1K Aug 13 20:10 ./syslog.2.gz

Possiamo a questo punto usare un altro parametro per trovarli:

root@bottegadelbarbieri:/var/log# find . -name 'syslog*' -mtime +10 -exec ls -lhai {} \;
152358 -rw------- 1 syslog adm 253K Feb 27 09:04 ./installer/syslog
136340 -rw-r----- 1 syslog adm 21K Jul 24 07:31 ./syslog.6.gz
132604 -rw-r----- 1 syslog adm 6.2K Jul 18 00:00 ./syslog.7.gz
133348 -rw-r----- 1 syslog adm 56K Jul 25 00:00 ./syslog.5.gz

Dunque:

-mtime    > fammi vedere i file che sono piu' vecchi di una certa quantita' di giorni

Alla prossima settimana!
jolek78

>> Indice <<
Puntata 22 < > Puntata 24

Il logo “Tux Linux” e’ stato realizzato e distribuito dall’artista deiby-ybied su Deviantart in licenza Creative Commons BY-NC-SA 3.0

jolek78 on Email
jolek78
Un tizio che pensava di essere uno scienziato. Si ritrovò divulgatore scientifico. Poi si addormentò su un aereo e si risvegliò informatico. Ma era sempre lui.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *