Lezione sull'utilizzo di base di Linux (approfondimento)
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 folder o cartelle), 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 dinn
.~
: 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 voltacd <nuovadirectory>
: cambia directory correntepwd
: visualizza il percorso della directory correntemkdir <nuovadirectory>
: crea una nuova directoryrmdir <directory>
: cancella la directory specificata (se è vuota)cp <fileorigine> <filedestinazione>
: copia un file dall'origine alla destinazionemv <fileorigine> <filedestinazione>
: sposta un file dall'origine alla destinazione (come cp ma cancella l'originale)rm <file>
: cancella il file specificatotouch <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 fileprova.txt
nella home directory diamato
./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 fileprova.txt
nella home directory diamato
.../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 dils
e di tutte le opzioni previste.--version
: visualizza la versione del programmals
.
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 -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.
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.
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 inroot
.
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.