Linux Tutorial – Puntata 11

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!

Bentornati a tutti. Uno dei motivi per cui si è deciso di creare questa sorta di tutorial sul sistema operativo più diffuso al mondo, era perché avrei potuto entrare nei dettagli tecnici passo per passo, esplorando zone, luoghi del sistema, e facendo esempi. Quando ho cominciato a esplorare la directory /dev mi sono accorto che in essa erano presenti tre files fondamentali, che appartengono non solo alla storia di linux, ma anche alla storia di tutta l’informatica in generale. I tre files di cui sto parlando sono 3: stdin, stdout e stderr. Quindi, allacciatevi le cinture anche questa domenica perché stiamo per cominciare. Happy coding 🙂

bottega@bottegadelbarbieri  /dev  ls -ltr |grep std
lrwxrwxrwx 1 root root 15 May 8 14:38 stdout -> /proc/self/fd/1
lrwxrwxrwx 1 root root 15 May 8 14:38 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 May 8 14:38 stderr -> /proc/self/fd/2
bottega@bottegadelbarbieri  /dev 

DEV (3)
Prima di tutto passiamo alle definizioni:

stdin >> standard input
stdout >> standard output
stderr >> standard error

in numeri

0 >> stdin
1 >> stdout
2 >> stderr

Quelli che abbiamo elencato precedentemente sono definiti streams, cioè flussi di dati che viaggiano da una parte all’altra. In parole povere, lo stdin è lo stream che viaggia dalla nostra tastiera al nostro computer (in), lo stdout è lo stream che viaggia dal comando impartito al risultato ottenuto (out), mentre lo stderr altro non e’ che il precedente ma nel caso in cui il risultato ottenuto sia un errore (err). Essi, come si puo’ vedere precedentemente, altro non sono che link simbolici che partono dalla directory /proc.

STDOUT
Primo esperimento. Creiamo un piccolo script in bash denominato script-std.sh che ci possa permettere di fare alcune operazioni. Spostiamoci quindi nella nostra /home directory e creiamo un file generico test-out.txt su cui inviare i nostri stream:

bottega@bottegadelbarbieri  ~  cd
bottega@bottegadelbarbieri  ~  touch test-out.txt
bottega@bottegadelbarbieri  ~  vim script-std.sh

Quindi:

1 #!/bin/bash
2 file=test.txt
3 echo "test stdin stdout stderr $file" 1>$file

Diamo i permessi di esecuzione, ed eseguiamo lo script

bottega@bottegadelbarbieri  ~  chmod +x script-std.sh
bottega@bottegadelbarbieri  ~  ./script-std.sh

Se andiamo a visualizzare il file col comando cat vedremo:

bottega@bottegadelbarbieri  ~  cat test-out.txt
test stdin stdout stderr test.txt

In parole povere, abbiamo rediretto il testo fra virgolette dopo echo all’interno del file test-out.txt. Questo viene definito lo stdout, ovvero l’uscita di un comando che, nella fattispecie, abbiamo esportato attraverso il simbolo 1>.

Stessa cosa succede se, facendola molto meno complicata, vogliamo ridirezionare l’output del comando ls -ltr all’interno del file medesimo. Questa volta pero’ teniamo a mente che, invece di una sola freccia >, che vorrebbe dire semplicemente scrivere, dobbiamo inserire una doppia freccia >>, e cioè aggiungere, cosi’ da evitare di sovrascrivere il file sopracitato. Inseriamo un simbolo divisorio, e successivamente visualizziamo:

bottega@bottegadelbarbieri  ~  echo "----------------------" 1>>test-out.txt 
bottega@bottegadelbarbieri  ~  ls -ltr 1>>test-out.txt
bottega@bottegadelbarbieri  ~  cat test-out.txt 
test stdin stdout stderr test.txt
----------------------
total 1048628
drwxr-xr-x 2 bottega bottega 4096 Feb 27 09:10 Videos
drwxr-xr-x 2 bottega bottega 4096 Feb 27 09:10 Public
drwxr-xr-x 2 bottega bottega 4096 Feb 27 09:10 Music
drwxr-xr-x 2 bottega bottega 4096 Feb 27 09:10 Documents
drwxr-xr-x 2 bottega bottega 4096 Feb 27 09:10 Desktop
drwxr-xr-x 2 bottega bottega 4096 Feb 27 09:10 Templates
drwxr-xr-x 2 bottega bottega 4096 Feb 27 09:31 Pictures
drwxr-xr-x 2 bottega bottega 4096 Feb 28 12:28 Downloads
-rw-rw-r-- 1 bottega bottega 1073741824 Mar 9 23:35 random.file
-rw-rw-r-- 1 bottega bottega 1073741824 Mar 10 00:12 sparse.file
drwxrwxr-x 2 bottega bottega 4096 Apr 25 06:17 tmp
drwxrwxr-x 2 bottega bottega 4096 May 9 00:41 output
-rwxrwxr-x 1 bottega bottega 72 May 16 00:20 script-std.sh
-rw-rw-r-- 1 bottega bottega 57 May 16 01:09 test.txt
bottega@bottegadelbarbieri  ~ 

Come si puo’ vedere ora abbiamo ora due output esportati nel file, uno in coda all’altro.

STDERR
Secondo esperimento. Creiamo un file chiamato test-err.txt col comando touch, e, con l’utente bottega, proviamo a cercarlo con find all’interno di tutto il sistema. Siccome pero’ il nostro utente non ha permessi di root, ricevemo un errore tutte le volte che il comando provera’ a scandagliare qualsiasi directory che non faccia parte di /home/bottega. Ergo: proviamo a esportare qualsiasi messaggio di errore in uscita all’interno del file con il parametro 2>>

bottega@bottegadelbarbieri  ~  touch test-out.txt 
bottega@bottegadelbarbieri  ~  find /* -name "test*" 2>>test-err.txt

Visualizziamo ora le prime 20 righe del file, e vediamo se avevamo ragione:

bottega@bottegadelbarbieri  ~  cat test-err.txt |head -n 20
find: ‘/boot/efi’: Permission denied
find: ‘/boot/lost+found’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
find: ‘/etc/cups/ssl’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/home/bottega_test/.cache’: Permission denied
find: ‘/home/bottega_test/.config/pulse’: Permission denied
find: ‘/lost+found’: Permission denied
find: ‘/proc/tty/driver’: Permission denied
find: ‘/proc/1/task/1/fd’: Permission denied
find: ‘/proc/1/task/1/fdinfo’: Permission denied
find: ‘/proc/1/task/1/ns’: Permission denied
find: ‘/proc/1/fd’: Permission denied
find: ‘/proc/1/map_files’: Permission denied
find: ‘/proc/1/fdinfo’: Permission denied
find: ‘/proc/1/ns’: Permission denied
find: ‘/proc/2/task/2/fd’: Permission denied
find: ‘/proc/2/task/2/fdinfo’: Permission denied
find: ‘/proc/2/task/2/ns’: Permission denied
find: ‘/proc/2/fd’: Permission denied
bottega@bottegadelbarbieri  ~ 

Stessa cosa succede se proviamo a eseguire un comando random non presente nel sistema, aggiungendo il messaggio di errore in coda al file appena creato. Successivamente, visualizziamo le ultime linee del file con tail:

bottega@bottegadelbarbieri  ~  echo "-----------------------" 1>>test-err.txt
bottega@bottegadelbarbieri  ~  qualcosa-da-eseguire 2>>test-err.txt

bottega@bottegadelbarbieri  ~  tail test-err.txt
find: ‘/var/cache/cups’: Permission denied
find: ‘/var/cache/apparmor/83ba7c1a.0’: Permission denied
find: ‘/var/cache/private’: Permission denied
find: ‘/var/spool/rsyslog’: Permission denied
find: ‘/var/spool/cups’: Permission denied
find: ‘/var/spool/cron/crontabs’: Permission denied
find: ‘/var/log/speech-dispatcher’: Permission denied
find: ‘/var/log/private’: Permission denied
-----------------------
qualcosa-da-eseguire: command not found

STDIN
Terzo esperimento. Proviamo a ridirezionare l’input di un comando all’interno di un nuovo file. Per fare questo giocheremo un po’ con uno dei poemi più belli che siano stati scritti: “La ballata del vecchio Marinaio” di Coleridge. Scriviamo dunque il file col comando vim

bottega@bottegadelbarbieri  ~  vim the-rhyme-mariner.txt
bottega@bottegadelbarbieri  ~ 

Se andiamo a visualizzare le informazioni del file col comando stat:

bottega@bottegadelbarbieri  ~  stat the-rhyme-mariner.txt 
File: the-rhyme-mariner.txt
Size: 20272 Blocks: 40 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 523058 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ bottega) Gid: ( 1000/ bottega)
Access: 2021-05-16 03:16:25.113521516 +0100
Modify: 2021-05-16 03:02:52.957931967 +0100
Change: 2021-05-16 03:02:52.957931967 +0100
Birth: -

Proviamo ora a esportare l’input di cat e di wc -l dal vecchio file all’interno di un nuovo file col simbolo <:

bottega@bottegadelbarbieri  ~  cat < the-rhyme-mariner.txt > the-rhyme-mariner-in.txt
bottega@bottegadelbarbieri  ~  wc -l < the-rhyme-mariner.txt >> the-rhyme-mariner-in.txt

bottega@bottegadelbarbieri  ~  tail the-rhyme-mariner-in.txt
Is gone: and now the Wedding-Guest
Turned from the bridegroom's door.

He went like one that hath been stunned,
And is of sense forlorn:
A sadder and a wiser man,
He rose the morrow morn.


783
bottega@bottegadelbarbieri  ~ 

Terzo esperimento riuscito.
Ora basta pero’. Correte ad ascoltarvi l’audiobook di Coleridge e rilassatevi. Ne varrà la pena

http://listentogenius.com/recordings2/RimeAncientMariner.mp3

 

Alla prossima settimana!
jolek78

>> Indice <<
Puntata 10 < > Puntata 12

Il logo “tux-linux-by-deiby-ybied” e’ stato realizzato da laboratoriolinux in licenza Creative Commons BY-NC-SA 2.0

jolek78
Un tizio che pensava di essere uno scienziato. Si ritrovò divulgatore scientifico. Poi si addormentò e si svegliò informatico. Ma era sempre lui.

Lascia un commento

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