Questo non è un corso completo su Unix, per cui ci limiteremo ad illustrare soltanto alcuni aspetti del sistema operativo. Per avere maggiori informazioni, si possono consultare una delle varie guide disponibili su Internet. Di particolare interesse è la guida "Appunti di Informatica Libera", di Daniele Giacomini, un corso omni-comprensivo, dove trovate veramente di tutto.

Tutte le lezioni sono pensate per la distribuzione Ubuntu 22.04, che è quella installata in aula informatizzata. Cambiando distribuzione, alcuni dettagli potrebbero essere differenti, in particolare per quanto concerne le interfacce grafiche (Graphical User Interface, GUI). In generale, questo è il risultato di uno dei grandi vantaggi (e svantaggi) di Linux, ovvero l'estrema configurabilità: due macchine che eseguono Linux possono apparire completamente diverse l'una dall'altra. Il vantaggio è l'estrema adattabilità alle esigenze dell'utilizzatore, lo svantaggio è che l'utente inesperto si trova disorientato passando da un computer Linux a un altro.

L'utilizzo generale della GUI di Linux non è dissimile da quello di Windows. Ovviamente non ci si può aspettare di trovare gli stessi programmi che si hanno su Windows, ma quasi sempre ce n'è di equivalenti. Non ci dilunghiamo quindi sul funzionamento generale ed andiamo ad analizzare le differenze maggiori tra i due sistemi.

Nelle spiegazioni che seguono, si suppone che la lingua dell'utente sia impostata in inglese.

L'albero delle directory

La memoria di massa di un computer è, come quella principale, una sequenza di byte. Essa è però organizzata in unità più piccole, chiamate file. I file sono a loro volta organizzati in directory (anche detti foldercartelle), a formare una struttura (chiamata albero) che parte da una directory principale o directory radice e prosegue per varie sotto-directory.

Per avere accesso a directory e file presenti nel computer, basta lanciare l'applicazione Files se disponibile nella bara di accesso rapido alle applicazioni di sinistra, oppure cliccare su Attività e quindi digitare Files. Quella che viene aperte è la home directory dell'utente. Ogni utente ha una home directory, che può gestirsi come vuole, e dove può salvare tutti i propri dati. Modifiche alla propria home directory non influenzano le home directory degli altri utenti.

Diamo ora una occhiata rapida all'albero delle directory completo di un sistema Linux. A differenza di Windows, che è strutturato in modo da avere (più o meno) una directory per ogni programma, in Linux la struttura del file-system è molto più articolata. Per iniziarne l'esplorazione basta selezionare, a sinistra nella applicazione Files,  la voce Other Locations e quindi Computer.

/
+--- bin
+--- boot
+--- etc
+--- home
     +--- amato
          +--- Desktop
+--- labeconomia +--- gamato + Desktop
+--- lib +--- media +--- cdrom +--- floppy +--- proc +--- root +--- sbin +--- sys +--- tmp +--- usr +--- bin +--- lib +--- var

Abbiamo qui indicato solo le directory più importanti. Spieghiamo brevemente la loro funzione:

  • / è la directory principale, o directory radice. Notare che, a differenza di Windows, il simbolo per la radice è lo stesso simbolo usato per la divisione e non la barra retroversa \.
  • /bin contiene i programmi basilari per l'interazione con il sistema operativo. I vari comandi ls, ps, mkdir (che vedremo in seguito) si trovano tutti in /bin.
  • /boot contiene il kernel del sistema operativo, e serve soltanto durante la fase di partenza del sistema.
  • /etc contiene i file di configurazione globali del sistema (ogni utente poi ha dei file di configurazione propri che stanno nella propria home directory). Di solito ogni programma ha uno o più file di configurazione in /etc che possono essere manipolati semplicemente come file di testo (a differenza di Windows, dove spesso la configurazione dei programmi è nascosta nel "registro di configurazione", che può essere visualizzato e manipolato solo col programma "regedit").
  • /home contiene le home directory dei vari utenti.
  • /home/<nomeutente> nelle installazioni tradizionali di Linux, è la home directory dell'utente <nomeutente>. È questa directory che viene aperta quando si fa partire l'applicazione Files.

    Nel caso dell'installazione di Linux effettuta in aula informatizzata, le home directory non risiedono in /home/<nomeutente> ma in /home/LABECONOMIA/<nomeutente>.

  • /home/<nomeutente>/Desktop corrisponde al desktop (scrivania) dell'utente <nomeutente>. Qualunque cosa si trovi in questa directory appare anche nello sfondo del piano di lavoro. In generale ogni utente si gestisce la proprio home directory come vuole, ma la sottodirectory Desktop ha questo caratteristica particolare.

    Analogamente per /home/LABECONOMIA/<nomeutente>/Desktop nel caso della installazione effettuata in aula informatizzata.

  • /lib contiene le librerie più importanti per il sistema. Una libreria è un insieme di funzioni che possono essere usate da tutti i programmi. Così, se una applicazione ha bisogno di utilizzare delle funzioni di crittografia, può utilizzare la libreria libcrypt. Le librerie corrispondono alle DLL in Windows.
  • /media contiene varie sotto-directory, corrispondenti ai dispositivi removibili (cdrom, memoria usb, ...) collegati al sistema. Linux, a differenza di Windows, non ha il concetto di "lettera di dispositivo". Tutti i file di tutte le memorie di massa vengono visti all'interno dello stesso albero di directory. Quando si inserisce un dispositivo removibile (come una penna USB) viene creata una cartella dentro /media, e in quella cartella è visibile il contenuto del dispositivo.
  • /proc e /sys contengono dei file speciali di interesse al sistema operativo. Ad esempio /proc/cpuinfo contiene informazioni sulla/e cpu presente/i nel sistema. Siccome non si tratta di file normali, non è possibili visualizzarli semplicemente con un doppio-click. Vedremo nella sezione dedicata alla shell come fare per visualizzarli.
  • /root è la home directory dell'utente root. L'utente root, presente in ogni sistema Unix, è il super-utente. Ha dei diritti speciali, in quanto può accedere a qualunque file e dispositivo presente nel computer.
  • /sbin contiene come /bin dei programmi fondamentali per il sistema, ma tipicamente pensati per essere usati dal super-utente (anche se spesso sono utilizzabili anche da un utente comune). Ad esempio /sbin/ifconfig vi fa vedere l'elenco delle periferiche per la connessione di rete attivate sul computer.
  • /usr contiene molte directory simili a quelle presente nella radice. Abbiamo così /usr/bin, /usr/sbin, /usr/lib. La differenza è che i programmi e le librerie presenti in /usr non sono così fondamentali come quelle presenti direttamente in /bin, /sbin  o /lib. Ad esempio, OpenOffice (un software libero simile a Microsoft Office) si trova in /usr/bin/openoffice. A dire il vero, nelle versioni moderne di Linux, /bin, /sbin e /usr/sbin sono collegamenti alla stessa directory.
  • /tmp contiene dei file temporanei usati da vari programmi.
  • /var contiene i dati stabili (non temporanei) dei vari programmi presenti nel sistema.

Attenzione. Ricordate che quando trovate scritta una cosa del tipo <nomeutente>, non vuol dire che bisogna digitare la stringa nomeutente tra i simboli di minore e maggiore (chiamati anche parentesi angolari), ma che al posto di <nomeutente> va sostituito il nome di un utente specifico. Così, /home/<nomeutente> va digitato in realtà come /home/amato, /home/rossi o simili.

Normalmente un utente (che non sia root) può leggere quasi tutti i file presenti nel computer, ma può scrivere soltanto nella sua home directory e nella directory /tmp.

La shell

Nei sistemi Unix, la shell è il programma più importante, dopo il sistema operativo vero e proprio (detto di solito kernel). È il mezzo con cui si comunica con il sistema e attraverso il quale si avvia e si controlla l'esecuzione degli altri programmi. Shell vuol dire "conchiglia" e il nome deriva dal fatto che è la superficie con cui l'utente entra in contatto quando vuole interagire con il sistema: la shell racchiude il kernel.

Una volta, prima dell'avvento delle interfacce grafiche, la shell era l'unico mezzo per comunicare con il sistema operativo. Oggi non è più così, ma la shell, per chi la sa usare, conserva ancora dei vantaggi rispetto all'interfaccia grafica:

  • per la maggior parte dei compiti, è più veloce dare un comando con la shell che aprire finestre e finestrelle, anche perché non bisogna mai spostare le mani dalla tastiera per raggiungere il mouse;
  • è programmabile: la shell è  un vero e proprio linguaggio di programmazione con il quale è possibile automatizzare l'esecuzione di vari compiti;
  • alcune attività di basso livello richiedono l'uso della shell, persino in ambiente Windows;
  • è utilizzabile da un computer remoto, e in questo modo si ha l'accesso totale alla macchina, che può essere amministrata senza bisogno di essere presenti fisicamente nello stesso luogo.

La shell è disponibile anche per sistemi Windows, anzi, le versioni moderne di Windows ne mettono a disposizione più di una. Quella più vecchia per motivi storici si chiama Prompt dei comandi. Tuttavia, essa è molto meno potente che nei sistemi Unix, per cui è di solito meno utilizzata. Quella più moderna e molto più potente prende il nome di Windows PowerShell. Purtroppo, i comandi sono completamente diversi da quelli della shell di Linux.

In realtà ache nei sistemi Unix esistono varie shell dei comandi, ma le due più utilizzate sono sicuramente la bash (utilizzata generalmente nei sistemi Linux) e zsh (usata in MacOS). Noi studieremo la bash perché è quella standard di Linux, installata nei computer dell'aula informatica.

Il prompt dei comandi

Per avviare la shell, basta selezionare Activities e digitare Terminal. Appare una finestra simile a questa:



La scritta gamato@ai-remote:~$ è il prompt dei comandi: indica che la shell è attiva e pronta ad accettare richieste dall'utente. Riconosciamo le seguenti componenti nel prompt:

  • gamato: il nome dell'utente che sta utilizzando la shell, ed è (di solito) il nome con cui avete fatto il login al sistema.
  • ai-remote: il nome del computer.

    Nel caso dell'aula informatizzata, i computer hanno nomi del tipo ai-nn con un numero al posto di nn.

  • ~: la directory corrente.  Il simbolo ~ indica la "home directory" dell'utente in corso (in questo caso l'utente amato) ed è una abbreviazione per il percorso /home/<nomeutente> (nel caso di una installazione tradizionale) o /home/LABECOBOMIA/<nomeutente> (nel caso della installazione in aula informatizzata).
  • $: indica che l'utente amato è un utente normale. Se fosse un super-utente, dotato di privilegi particolari per l'amministrazione di sistema, il $ sarebbe sostituito da #.

Attenzione. È possibile modificare il prompt rispetto a quello di default, per cui non fate troppo affidamento su questa descrizione.

Dal prompt è possibile digitare i comandi che si vogliano inviare al sistema, utilizzando anche i tasti standard per l'editing: Canc, Backspace, Inizio, Fine, Freccia sx, Freccia dx. I tasti Freccia su e giù consentono invece di scorrere i comandi già immessi precedentemente, che possono poi essere modificati.

Alcuni comandi

Dalla shell è possibile inviare dei comandi al sistema operativo. Ecco alcuni esempi:

  • ls: visualizza il contenuto della directory corrente. Colori diversi indicano tipi di file diversi. Ad esempio, le directory sono in blu.
  • cat <nomefile>: visualizza il contenuto del file <nomefile>
  • less <nomefile>: visualizza il contenuto del file <nomefile>, una pagina alla volta
  • cd <nuovadirectory>: cambia directory corrente
  • pwd: visualizza il percorso della directory corrente
  • mkdir <nuovadirectory>: crea una nuova directory
  • rmdir <directory>: cancella la directory specificata (se è vuota)
  • cp <fileorigine> <filedestinazione>: copia un file dall'origine alla destinazione
  • mv <fileorigine> <filedestinazione>: sposta un file dall'origine alla destinazione (come cp ma cancella l'originale)
  • rm <file>: cancella il file specificato
  • touch <file>: crea un file vuoto se non esiste già, altrimenti aggiorna la data di ultima modifica del file.

La struttura generale di un comando è

    <nomeprogramma> <lista di argomenti>

Tipicamente un comando della shell non è altro che il nome di un programma che il sistema operativo deve eseguire: ls, cat, cp, mv sono tutti programmi, e abbiamo visto che risiedono nelle directory /bin, /sbin, /usr/bin e simili. Ma anche programmi più "corposi" possono essere eseguiti semplicemente digitandone il nome dalla shell.

Percorsi assoluti e relativi

Abbiamo visto che molti comandi hanno come argomento un nome di file. Ma che struttura ha un nome di file Linux? Nel vecchio sistema operativo DOS, il nome aveva una struttura fissa di 8 caratteri, un punto, e altri 3 caratteri (detti estensione). L'estensione serviva a identificare il tipo di file: .jpg per file immagini JPEG, .txt per file di testo puri, .doc per file Word, etc..

Nei sistemi operativi moderni un nome di file è una stringa di caratteri qualunque, e può contenere quanti punti si desidera (anche nessuno). L'estensione non è necessaria, ma spesso la si aggiunge per facilitare la vita all'utilizzatore del computer, che così è in grado di riconoscere il tipo di ogni file. Anche alcuni programmi si basano sull'estensione di un file per decidere come trattarlo. Notare che ormai l'estensione può anche essere più lunga di 3 caratteri: ad esempio .java è l'estensione standard per i file sorgente Java.

Tuttavia, specificare semplicemente il nome di un file non è sufficiente. Infatti, all'interno del file system possono esserci molti file con lo stesso nome, ma che stanno in directory diverse. Come si fa, allora, a indicare con esattezza un file specifico, in modo che non sorgano ambiguità? Bisogna utilizzare i pathname (nomi dei percorsi) che possono essere di due tipi: assoluti o relativi.

Un percorso assoluto è una stringa del tipo:

     /<nomedir>/<nomedir>/<nomedir>/<nomefile>

che inizia con la barra di divisione, ha una serie di componenti separati da barre e termina con un nome di file. La sequenza dei vari <nomedir> è la sequenza di directory dentro le quali il sistema deve entrare, partendo dalla radice, per raggiungere la directory dove si trova il <nomefile> desiderato. Ad esempio:

  • /home/amato/prova.txt si riferisce a un file prova.txt nella home directory di amato.
  • /abcd si riferisce a un file di nome abcd (senza estensione) dentro la directory radice.

Sono importanti alcune cose:

  • il percorso assoluto deve iniziare con la barra di divisione;
  • la barra da utilizzare è quella per la divisione (/) e non la barra retroversa (\) che si usa invece nei sistemi Windows;
  • è necessario specificare la sequenza completa di tutte le directory da attraversare per arrivare al file desiderato.

Ogni processo (programma in esecuzione) in Linux ha una directory corrente.  Quando si specifica un nome di file direttamente, senza percorso, il file viene cercato in questa directory. Per cambiare directory corrente nella shell di Linux, si può usare il comando cd (change dir). Più in generale, la directory corrente serve come punto di riferimento per i percorsi relativi.

Un percorso relativo è una stringa di questo tipo:

     <nomedir>/<nomedir>/<nomedir>/<nomefile>

quindi è simile a un percorso assoluto ma non ha la barra iniziale. Anche il significato è simile a quello di un percorso assoluto, con la differenza che la directory da cui iniziare la ricerca del file non è la directory radice ma la directory corrente. Nei percorsi relativi si una spesso una directory speciale, la directory .. (due punti), che indica la directory padre di quella corrente, consentendo quindi di risalire l'albero delle directory. Ad esempio, se la directory corrente è /home, allora:

  • amato/prova.txt si riferisce a un file prova.txt nella home directory di amato.
  • ../abcd si riferisce a un file di nome abcd (senza estensione) dentro la directory radice.

Di solito ovunque si può inserire il nome di un file, si può inserire un percorso assoluto o relativo. Ma quale conviene usare tra i due? Quando si usa la shell in maniera interattiva, come facciamo noi in questa lezione, si può usare quello che ci torna più comodo. Quando però si scrivono dei programmi che hanno bisogno di accedere a vari file ad essi correlati, è meglio utilizzare percorsi relativi. In questo modo, sarà poi più facile spostare tutto il software da una directory ad un altra senza comprometterne il funzionamento.

Ad esempio, supponiamo di aver scritto un programma vis che ha bisogno di alcune immagini per funzionare. Decidiamo di mettere il programma vis nella directory /home/amato/prg e le immagini in una sottodirectory, ad esempio /home/amato/prg/img. Quando nel programma abbiamo bisogno di riferirci ad una immagine, è meglio se usiamo un percorso relativo alla directory /home/amato/prg. Così, l'immagine titolo.jpg dovrà essere riferita con il percorso img/titolo.jpg. In questo modo, quando ci porteremo il programma a casa nel nostro computer, potremo decidere di mettere il tutto (il programma vis e la sottodirectory img) nella directory /usr/local/mioprog e il programma continuerà a funzionare a dovere. La vecchia immagine /home/amato/prg/img/titolo.jpg non esiste più, ma al suo posto abbiamo /usr/local/mioprog/img/titolo.jpg e, partendo da /usr/local/mioprog il percorso relativo img/titolo.jpg  punta propro a quest'ultima.

Comandi e opzioni

A molti dei comandi visti finora è possibile aggiungere delle opzioni per alterarne il funzionamento. Ad esempio, ls può prendere come argomento i seguenti parametri (e tanti altri che qui non cito):

  • -a: visualizza tutti i file, anche quelli nascosti. In Linux un file nascosto è un file che inizia con il punto. ('a' sta per all)
  • -l : visualizza, per ogni file, un dettaglio dei suoi attributi (lunghezza in byte, data di ultima modifica, utente e gruppo, diritti di accesso). ('l' sta per 'long')

Quelle che abbiamo visto qua sopra sono le "opzioni corte". Esse hanno tutte la stessa forma: il segno meno seguito da una lettera. Alcuni programmi supportano anche delle opzioni lunghe. Ad esempio per ls abbiamo:

  • --all: equivalente a -a
  • --help: visualizza una spiegazione succinta del funzionamento di ls e di tutte le opzioni previste.
  • --version: visualizza la versione del programma ls.

Le opzioni possono essere combinate tra di loro. Ad esempio ls -a -l visualizza tutti i file, compresi quelli nascosti, e visualizza per ognuno i suoi attributi. Stesso risultato da ls --all -l. Un altro modo di combiare le opzioni corte è usare un unico simbolo - e, in sequenza, le lettere corrispondenti alle varie opzioni. Ad esempio ls -al ha lo stesso effetto di ls -a -l.

Nota. Le opzioni --help e --version sono comuni a molti programmi. Se non si sa cosa fa il programma chown, il comando chown --help è un buon modo per scoprirlo.

Completamento automatico

Una caratteristica utile della shell di Linux è il completamente automatico. In varie circostante potete premere il tasto <TAB> e la shell completa quello che state scrivendo nella maniera più ovvia. Il tasto <TAB> (tabulazione) si trova quasi sempre a sinistra, sotto la barra retroversa (\), e su di esso sono disegnate due frecce puntate in direzioni opposte. Ad esempio, se siete nella situazione

    gamato@ai-remote:~$ pass

e premete <TAB>, la stringa pass viene completata in passwd (il comando per cambiare la propria password). Questo perché passwd è l'unico comando che inizia con pass. Analogamente, se nella directory corrente c'è il file "prova" e voi premete <TAB> quando avete digitato

    gamato@ai-remote:~$ cat pr

allora pr viene completato in prova. In generale, quasi su ogni sistema è vero quanto segue:

  • se premete <TAB>; sulla prima parola di una riga di comando, la shell tenta di completare la stringa immessa con un comando valido;
  • se premete <TAB> sulle parole successive alla prima in una riga di comando, la shell tenta di completare la stringa con un nome di file valido.

Talvolta premendo <TAB> non succede niente: vuol dire che c'è ambiguità nel modo in cui si può completare la stringa. Ad esempio, se abbiamo anche il file prato oltre a prova, premere <TAB> dopo pr è ambiguo perché pr potrebbe essere completato in due modi diversi.

In questo caso, si può premere <TAB> due volte di seguito per avere l'elenco dei possibili completamenti. Ad esempio, con

    gamato@ai-remote:~$ rm

premendo <TAB><TAB> si ha l'elenco dei comandi che iniziano con rm:

    rm              rmail.sendmail  rmic            rmiregistry
  rmail           rmdir           rmid

Il <TAB> può essere usato per spostarsi velocemente nell'albero delle directory. Se si vuole visualizzare il file /proc/cpuinfo (che contiene informazioni sulla CPU usata dal computer) il comando da dare è cat /proc/cpuinfo. Si può scrivere questo comando molto più velocemente digitando: cat /p<TAB>/cp<TAB>. Se invece volete visualizzare un file in /etc/network ma non vi ricordate quale, potete provare con cat /etc/network/ <TAB><TAB><TAB> che visualizza l'elenco dei file in /etc/network. 

La funzione di completamento automatico è veramente comoda. Una volta che ci si è famirializzato, è difficile farne a meno.

Attenzione. Questo che abbiamo appena visto è un altro tipico utilizzo delle parentesi angolari. Quando l'oggetto tra i simboli di minore e maggiore è il nome di un tasto, come nel caso di <TAB>, vuol dire che bisogna premere il tasto corrispondente sulla tastiera. Questo è un po' in contrasto con quanto visto precedentemente sull'uso delle parentesi angolari, ma di solito non ci dovrebbero essere ambiguità sul loro significato.

Immissione caratteri speciali

Spesso è necessario inserire dei caratteri che non sono presenti nella tastiera. Come si fa in questo caso? Il trucco tipico di Windows (<Alt>+il codice ascii sul tastierino numerico) su Linux non funziona. In realtà, i caratteri più comuni possono essere digitati con alcune combinazioni di tasti standard:

  • <AltGr> + apostrofo = apice
  • <AltGr> + ì = ~
  • <AltGr> + e = €
  • <AltGr> + é = <Shift> + <AltGr> + è = {
  • <AltGr> + * = <Shift> + <AltGr> + più = }

Per chi non lo sapesse, il tasto <Shift> è quello che si usa per fare le maiuscole,  <AltGr> è il tasto <Alt> posto a destra della barra spaziatrice.

Aiuto, non mi ricordo cosa fa un comando

Nessuno è ingrado di ricordarsi tutti i possibili comandi e le differenti opzioni disponibili in ambiente Unix. Per fortuna la documentazione in materia è estensiva. Abbiamo già visto l'opzione --help che è possibile fornire a molti comandi per farci restituire la spiegazione del suo funzionamento e delle opzioni che supporta. La spiegazione che si ottiene è però spesso troppo stringata, utile quando il comando lo si conosce già e semplicemente non ci si ricorda il formato di qualche opzione, ma non quando si vuole imparare come utilizzarlo.

Per quest'ultimo scopo è molto più utile il comando man. Si usa generalmente in questo modo:

  • man <comando>: visualizza il manuale utente per il comando.

Ad esempio man rmdir visualizza il manuale del comando rmdir.

La lettura del manuale non è sempre agevole e bisogna abituarsi un po', anche perché spesso le spiegazioni sono molto tecniche. Le due parti più importanti sono tipicamente SYNOPSIS che dà la sintassi del comando e DESCRIPTION che spiega cosa fa il comando e il significato di tutte le opzioni disponibili.

File, utenti, diritti

Unix è un sistema operativo multi-utente. Vuol dire che più persone possono utilizzare il computer, anche contemporaneamente, e il sistema deve garantire un certo livello di sicurezza: impedire, ad esempio, che i file privati di un utente possano essere letti da un altro senza autorizzazione.

Noi descriveremo il sistema di gestione dei diritti standard di Linux. Ultimamente ci sono stati vari sviluppi per aumentare ulteriormente la sicurezza e la protezione del sistema: tra questi SELinux (Security Ehanced Linux) che è presente di default in alcune distribuzioni (ad esempio nella Fedora) ma non nella Ubuntu.

Utenti e gruppi

Due sono i concetti principali per tutte le politiche di sicurezza: l'utente e il gruppo. Quando si effettua il login, bisogna specificare la username con cui ci si collega e la password relativa. Un elenco di tutti gli utenti del sistema si può trovare, di solito, nel file /etc/passwd (che non commenteremo oltre), mentre un elenco dei gruppi si trova in /etc/group. Per sapere l'utente, il gruppo corrente e i gruppi a cui appartiene, basta dare il comando:

  • id: restituisce utente corrente, gruppo corrente e elenco dei gruppi a cui l'utente appartine.
Ad esempio, il risultato di id gamato potrebbe essere:

     uid=1578600001(gamato) gid=1578600001(gamato) groups=1578600001(gamato),1578600005(teachers),1578600000(admins)
dove i vari campi hanno il seguente significato:
  • uid=1578600001(amato): l'identificatore utente (user id) attuale è 1578600001 e il nome simbolico corrispondente è gamato.
  • gid=1578600001(amato): l'identificatore di gruppo (group id) attuale è 1578600001, il cui nome simbolico è gamato. Anche se in questo caso identificatori di utente e gruppo coincidono questo non è assicurato.
  • groups=1578600001(gamato),1578600005(teachers),1578600000(admins),1578600009(wireshark),1578634591(aiaco): l'utente attuale appartiene ai gruppi gamato, teachers, admins

Il gruppo corrente (gid) determina il gruppo con cui viene creato un nuovo file, mentre l'elenco dei gruppi determina i diritti di accesso dell'utente.

File e diritti

È possibile specificare i diritti di accesso degli utenti ai file in base ai due concetti di utente e di gruppo. Ogni file presente sul sistema appartiene ad un utente e a un gruppo ben specifico: si chiamano i proprietari del file.

Le operazioni che è possibile compiere su un file si possono dividere in  3 grossi gruppi:

  • lettura
  • scrittura
  • esecuzione

Ognuna di queste operazioni può essere concessa o negata a tre diversi tipi di utente:

  • al proprietario del file
  • ad un utente che appartiene al gruppo proprietario del file
  • ad un utente diverso da quelli di sopra.

È così possibile specificare che il file pippo.sh può essere letto e scritto dal suo proprietario, solo letto da un altro utente del suo gruppo, e completamente inaccessibile a un'altra persona.

Ma come si fa a sapere chi è il proprietario di un file e quali sono i permessi di accesso? Dalla interfaccia grafica basta cliccare col tasto destro sul file che ci interessa e selezionare Properties dal menù contestuale che viene fuori. Selezionando la cartellina Permissions si otterrano tutte le informazioni volute e sarà anche possibile modificarle.


Per quanto riguarda la linea di comando, per vedere i permessi di un file è possibile usare il comando ls con l'opzione -l. Per ogni file compare, sul lato sinistro, una stringa del tipo "-rwxrwxrwx". Il primo carattere contiene informazioni sul tipo di file (è - per un file normale e d per una directory). I caratteri successivi vanno letti a blocchi di 3, e contengono l'informazione sui diritti per il proprietario, il gruppo, e gli altri utenti rispettivamente. Se il carattere r, w o x compare vuol dire che i diritti relativi sono stati concessi, se al suo posto compare - allora sono stati negati. Ad esempio la stringa "-rwxrw-r--" indica un file che può essere manipolato come si vuole dal suo proprietario, letto ed eseguito dal suo gruppo e solo letto dagli altri utenti. È anche possibile modificare i permessi dalla shell con il comando chmod, ma la sintassi è un po' complessa, per cui lascio agli interessati scroprire come.

Risultato di ls con l'opzione -a


I diritti di lettura, scrittura ed esecuzione si possono concedere anche a delle directory. Ma mentre sembra chiaro cosa vuol dire lettura e scrittura per una directory, cosa vuol dire "esecuzione" in questo caso?

Avere il diritto di esecuzione su una directory vuol dire essere in grado di entrare in una directory.  È possibile anche accedere ai file che stanno in quella directory, purché se ne conosca il nome!! Tuttavia il diritto di esecuzione non ci consente di esaminare il contenuto di una directory con ls. Quest'ultima operazione è possibile solo se sulla directory abbiamo il diritto di lettura.

Diventare super-utenti

Abbiamo già detto che tra tutti gli utenti ce n'è uno particolare, denominato root, che ha il ruolo di super-utente. A lui non si applicano le normali restrizioni di accesso che hanno gli altri utenti, ma può accedere a tutti i file presenti sul sistema.

Sulla Ubuntu non è possibile fare il login direttamente come super-utente: bisogna prima fare il login come utente normale e poi, se si è abilitati, si può diventare super-utenti. Per far ciò, bisogna dare dalla shell il comando:

  • sudo -i: se abilitati, cambia l'identità dell'utente in root.

Il sistema potrebbe chiedere la propria password e, se tutto va bene, vi fa diventare root (la nuova identità è riconoscibile dal fatto che il prompt della shell termina con un #). A quel punto, qualunque comando inserito da quella shell verrà eseguito con i diritti di root.

Se invece volete dare un solo comando come super utente, per poi tornare ad operare come un utente normale, si può usare il comando:

  • sudo <comando>: il comando indicato viene eseguito con i permessi da super utente.

Anche in questo caso il sistema potrebbe chiedere di reimmettere la password.

Installazione di programmi

Se il software che vogliamo installare fa parte della distribuzione standard di Ubuntu, possiamo installarlo lanciando l'applicazione Ubuntu Software dal menù Activities.

Nel caso in cui il software cercato non faccia parte della distribuzione standard, occorrerà procurarselo in qualche modo, tipicamente scaricandolo da Internet. Esistono vari modi e formati in cui il software può essere distribuito, ma per la Ubuntu il formato più comodo è il deb. Un file in formato deb (chiamato pacchetto) è un file compresso (simile a un file ZIP) che contiene delle informazioni speciali per l'installazione e disinstallazione del software. Per installare un pacchetto deb basta fare un doppio-click su di esso. Per questa operazione, ovviamente, bisognerà godere dei diritti di amministratore.

Installazione software necessario per il corso

Al software che viene automaticamente installato con il sistema operativo, bisogna aggiungere anche Visual Studio Code

Esercizi

Seguono una serie di esercizi da svolgere in laboratorio ed eventualmente da completare a casa (o in aula informatica, al di fuori dell'orario delle lezioni).

Esercizio 1

Visualizzare il contenuto del file /proc/cpuinfo.

Esercizio 2

Esaminare l'elenco delle periferiche PCI presenti nel sistema eseguendo il programma /usr/bin/lspci.

Esercizio 3

Utilizzando i comandi della shell, creare all'interno della vostra home directory una cartella dal nome prova e, dentro quest'ultima, una ulteriore cartella dal nome prova-nidificata. Creare dentro prova-nidificata un file di testo di nome provatesto.txt con un contenuto a piacere (come editor di testi si può usare il programma Text Editor). Controllare che il contenuto sia leggibile usando il comando cat. A questo punto spostare il file provatesto.txt nella directory prova con il nuovo nome provatesto2.txt, e cancellare la directory prova-nidificata.

Esercizio 4

Questo esercizio è da considerare la continuazione dell'esercizio precedente.

Creare la directory prova-nidificata2 dentro la directory prova e prova-nidificata3 dentro prova-nidificata2. Creare un file di testo prova-file dentro prova-nidificata3 con un contenuto a piacere. Il metodo standard che abbiamo visto per cancellare unaa irectory dalla shell è quello di cancellare prima i file che essa contiene con rm e poi la cartella stessa con rmdir. Senza seguire questa procedura, consultare la documentazione sul comando rm e capire come cancellare, con un unico comando, la directory prova e tutte le sue sottodirectory.

Ultime modifiche: domenica, 1 ottobre 2023, 22:07