glripetizioni

Linux da terminale: comandi base e permessi chmod

Comandi base di Linux da terminale (ls, cd, cp, mv, grep), pipe, redirezione e permessi rwx con chmod numerico: la procedura e gli errori da evitare.

di Gaetano Livornese

  • #informatica
  • #quarta superiore
  • #tecnico
  • #linux
  • #terminale
  • #permessi

Se sei in quarta in un istituto tecnico a indirizzo informatico, in questi giorni il docente di Sistemi e reti (o di Informatica) sta probabilmente portando la classe davanti a un terminale Linux. La verifica, pratica più scritta, arriva fra sei-otto settimane. Il copione è quasi sempre lo stesso: ti danno una macchina virtuale, una lista di operazioni da fare e, sul foglio, una serie di righe di comandi a cui rispondere con «cosa fa» oppure «che permessi ha adesso questo file».

Il terminale spaventa perché non perdona: un errore di battitura non ti dà un suggerimento, ti dà un messaggio e basta. La buona notizia è che il programma di quarta usa un insieme piccolo di comandi e un solo concetto che richiede ragionamento, i permessi. Qui li prendo uno alla volta.

Dove sei e cosa c’è: pwd, ls, cd

Una sessione tipica comincia così. Il simbolo $ è il prompt, non va scritto.

$ pwd
/home/studente
$ ls
documenti  progetti
$ cd progetti
$ pwd
/home/studente/progetti

pwd stampa la directory corrente. ls elenca il contenuto. cd cambia directory: cd .. sale di un livello, cd da solo ti riporta nella home, cd / va alla radice. Un percorso che inizia con / è assoluto, partendo dalla radice. Senza quella barra iniziale è relativo, cioè parte da dove sei.

ls ha opzioni che in verifica compaiono sempre. ls -l mostra il formato lungo con permessi, proprietario, dimensione e data. ls -a mostra anche i file nascosti, quelli il cui nome inizia con un punto. Si possono unire: ls -la.

Creare, copiare, spostare, cancellare

$ mkdir esercizi
$ touch note.txt
$ cp note.txt copia.txt
$ mv copia.txt vecchia.txt
$ rm vecchia.txt

mkdir crea una directory, touch crea un file vuoto (o aggiorna la data di uno esistente), cp origine destinazione copia, mv origine destinazione sposta o rinomina (è lo stesso comando: rinominare è spostare nella stessa directory), rm cancella. Due note su rm: non esiste cestino, un file cancellato è andato; e rm -r cancella una directory con tutto il contenuto, perciò va scritto con attenzione. Per creare un percorso annidato, mkdir -p a/b/c crea tutte le directory intermedie in un colpo solo. Per copiare una directory serve cp -r.

Per leggere un file: cat note.txt lo stampa tutto. Prendiamo un file note.txt di tre righe:

ciao
mondo
ciao linux

wc -l note.txt conta le righe e risponde 3 note.txt.

grep, pipe e redirezione

grep cerca un testo dentro un file e stampa le righe che lo contengono. Con -n mostra anche il numero di riga:

$ grep -n ciao note.txt
1:ciao
3:ciao linux

La pipe | prende l’output di un comando e lo passa come input al successivo. Per contare le righe che contengono «ciao»:

$ cat note.txt | grep ciao | wc -l
2

La redirezione manda l’output in un file invece che a schermo. > sovrascrive, >> aggiunge in coda:

$ echo uno > a.txt
$ echo due >> a.txt
$ cat a.txt
uno
due
$ echo tre > a.txt
$ cat a.txt
tre

L’ultimo passaggio è la trappola preferita dei docenti: un solo > al posto di >> e «uno» e «due» sono spariti. Esiste anche 2>, che redirige i messaggi di errore: ls /inesistente 2> err.txt non stampa niente a schermo e scrive l’errore nel file.

I permessi: la parte che si chiede sempre

Ogni file ha tre categorie di utenti: il proprietario (user), il gruppo (group) e tutti gli altri (others). Per ciascuna ci sono tre permessi: lettura r, scrittura w, esecuzione x. Nel formato lungo di ls -l il primo campo li mostra:

$ ls -l
total 4
-rw-r--r-- 1 studente studente 22 Oct 12 09:10 note.txt
-rw-r--r-- 1 studente studente  0 Oct 12 09:10 script.sh

La stringa -rw-r--r-- si legge così: il primo carattere è il tipo (- file normale, d directory), poi tre gruppi da tre. rw- per il proprietario (legge e scrive), r-- per il gruppo (solo legge), r-- per gli altri (solo legge). Poi vengono il numero di collegamenti, proprietario, gruppo, dimensione in byte, data e nome.

Per i file, x significa poter eseguire il file come programma. Per le directory significa poterci entrare (con cd) e accedere ai file che contiene. Senza x su una directory non ci entri, anche se hai r.

chmod in forma numerica

Ogni permesso vale un numero: r = 4, w = 2, x = 1. Si sommano per categoria e si ottengono tre cifre, una per proprietario, gruppo e altri. Conviene saperlo a memoria, la tabella è corta:

CifraBinarioPermessiSomma
7111rwx4+2+1
6110rw-4+2
5101r-x4+1
4100r--4
0000---0

Quindi 644 è rw-r--r-- e 755 è rwxr-xr-x. Prova pratica: se lancio ./script.sh su un file senza x, ottengo un errore.

$ ./script.sh
bash: ./script.sh: Permission denied
$ chmod 755 script.sh
$ ls -l script.sh
-rwxr-xr-x 1 studente studente 0 Oct 12 09:10 script.sh

Ora il proprietario può eseguirlo, gruppo e altri possono leggerlo ed eseguirlo, ma solo il proprietario può modificarlo. Con chmod 640 note.txt si ottiene -rw-r-----: il proprietario legge e scrive, il gruppo solo legge, gli altri non hanno accesso.

Esiste anche la forma simbolica: chmod u+x file aggiunge l’esecuzione al proprietario, chmod go-r file toglie la lettura a gruppo e altri, chmod a+r file dà la lettura a tutti. Qui u, g, o, a indicano le categorie (a sta per all) e +, -, = l’operazione. Le due forme sono equivalenti e in verifica ti chiedono spesso di passare dall’una all’altra.

chown e sudo

chown cambia proprietario e gruppo: sudo chown studente:studente note.txt. Il comando sudo esegue una riga con i privilegi dell’amministratore (root), ed è necessario per cambiare il proprietario di un file. Regola pratica: usalo solo quando il comando senza sudo dà «Permission denied» e sai perché lo stai dando. Un sudo rm -r scritto con distrazione è il modo più rapido di perdere un sistema.

Gli errori tipici in verifica

  1. Confondere > e >>. Il primo svuota il file prima di scrivere, il secondo aggiunge in fondo.
  2. Leggere i permessi nell’ordine sbagliato. Sono sempre proprietario, gruppo, altri. rwxr-x--- non è 755: è 750, perché gli altri hanno ---.
  3. Dimenticare x sulle directory. Con una directory senza x non ci si entra e non si raggiungono i file che contiene. Per una directory di lavoro la combinazione normale è 755.
  4. Pensare che mv e cp siano diversi per la destinazione. cp a b lascia a dov’è. mv a b no: dopo il comando a non esiste più con quel nome.
  5. Dimenticare la differenza tra percorso assoluto e relativo. cd documenti funziona solo se documenti è nella directory corrente; cd /documenti cerca dalla radice.
  6. Scrivere maiuscole a caso. Linux distingue: Note.txt e note.txt sono due file diversi.

Esercizi svolti

Esercizio 1: cosa fa questo comando? Dato il file note.txt di sopra, cosa stampa grep -c ciao note.txt?

-c conta le righe che contengono la parola invece di stamparle. Le righe 1 e 3 contengono «ciao»: risposta 2. Lo stesso risultato che avevamo ottenuto con grep ciao note.txt | wc -l. Nota che conta le righe, non le occorrenze: una riga con «ciao ciao» conterebbe una volta sola.

Esercizio 2: dai permessi al numero e viceversa.

a) Un file ha -rw-r-----. Che numero è? Proprietario rw- = 4+2 = 6, gruppo r-- = 4, altri --- = 0. Risposta: 640.

b) Scrivi la stringa dei permessi per chmod 750. 7 = rwx, 5 = r-x, 0 = ---. Risposta: rwxr-x---.

c) Quale numero corrisponde a rwxrw-r--? Proprietario 7, gruppo rw- = 6, altri r-- = 4. Risposta: 764.

Esercizio 3: dal permesso attuale al comando. Un file ha -rw-r--r-- (cioè 644). Voglio che il proprietario possa anche eseguirlo e che gruppo e altri non abbiano alcun accesso. Scrivi il comando in forma simbolica e numerica.

Parto da rw-r--r--. Aggiungo x al proprietario: rwx. Tolgo r a gruppo e altri: --- e ---. Ottengo rwx------, cioè 7 seguito da 0 e 0. In simbolico: chmod u+x,go-r file. In numerico: chmod 700 file. Controllo: 4+2+1 = 7 per il proprietario, zero per gli altri due. Quadra.

Come prepararti nelle prossime settimane

Su informatica non c’è ancora una simulazione dedicata: la prova pratica si prepara in un solo modo, davanti a un terminale. Se non hai Linux in casa, una macchina virtuale con una distribuzione qualsiasi (o il sottosistema Linux di Windows) basta e avanza. Il mio suggerimento è creare una directory di prova e rifare da zero tutti i comandi di questo post, guardando ogni volta ls -l prima e dopo. Chi arriva in verifica avendo visto cambiare i permessi sullo schermo non ha bisogno di ricordare una tabella: la ricostruisce. Altro materiale sulla materia è nella pagina informatica.

Nello stesso periodo, in Sistemi e reti, il programma passa di solito per indirizzi IP e subnetting e per il modello ISO/OSI e TCP/IP: sono argomenti separati, ma la stessa verifica può metterli insieme. Se poi ti avvicini al quinto anno, il filo continua con VLAN e sicurezza. Per chi sente che la parte di programmazione è ancora un po’ fragile, ho scritto anche Python da zero.

Se vuoi capire dove sei, scrivimi dalla pagina contatti e facciamo una diagnosi gratuita: guardiamo insieme i comandi che ti sembrano più oscuri, e vediamo se il problema è nei permessi, nella redirezione o nella lettura dell’esercizio.

Continua a leggere

Vuoi applicare quello che hai letto?

Parliamone 30 minuti gratis: guardiamo insieme dove sei bloccato e ti dico onestamente come posso aiutarti.

Oppure scrivimi su WhatsApp.