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