
Il terminale Linux è l’interfaccia più diretta per amministrare, diagnosticare e automatizzare un sistema GNU/Linux. Anche negli ambienti desktop moderni, conoscere la riga di comando permette di intervenire in modo preciso su file, processi, servizi, rete, pacchetti software e log di sistema. Questo articolo propone un percorso tecnico operativo pensato per chi parte da zero, ma vuole arrivare a utilizzare strumenti più avanzati coerenti con le competenze richieste in ambito Linux Essentials e LPIC-1.
Gli esempi sono applicabili alle principali distribuzioni desktop e server: Ubuntu, Fedora e openSUSE. Molti comandi sono comuni perché appartengono all’ambiente GNU/Linux standard; le principali differenze riguardano soprattutto il gestore pacchetti, alcune configurazioni di rete e gli strumenti predefiniti per il firewall.
Aprire il terminale e capire dove ci si trova
Su Ubuntu, Fedora e openSUSE il terminale può essere aperto dal menu applicazioni cercando “Terminale”, “Console”, “Konsole” o “GNOME Terminal”. Una volta aperto, ci si trova davanti a una shell, generalmente Bash, che interpreta i comandi digitati dall’utente.
Il prompt mostra spesso nome utente, nome host e directory corrente. Il simbolo $ indica di norma un utente normale, mentre # indica una shell con privilegi amministrativi. È buona pratica lavorare come utente normale e usare privilegi elevati solo quando necessario.
pwd whoami hostname date uname -a
pwd mostra la directory corrente, whoami indica l’utente attivo, hostname restituisce il nome della macchina, date visualizza data e ora, mentre uname -a fornisce informazioni sul kernel.
Ottenere aiuto sui comandi
Prima di eseguire comandi sconosciuti, soprattutto se modificano file o configurazioni, è opportuno consultarne la documentazione. Linux integra diversi livelli di help: opzioni rapide, manuali, pagine info e documentazione locale.
ls --help man ls info coreutils 'ls invocation' type ls which ls apropos network
man è uno degli strumenti fondamentali per l’amministrazione Linux. Le pagine di manuale sono divise in sezioni: ad esempio, i comandi utente sono spesso nella sezione 1, le chiamate di sistema nella sezione 2, i file di configurazione nella sezione 5 e i comandi amministrativi nella sezione 8.
man 5 passwd man 8 useradd
type permette di capire se un comando è un eseguibile, un alias, una funzione shell o un builtin. Questo è utile quando un comando si comporta diversamente da quanto atteso.
Sintassi dei comandi e opzioni
La forma generale di un comando Linux è composta da nome del comando, opzioni e argomenti. Le opzioni brevi usano spesso un solo trattino, mentre quelle lunghe usano due trattini.
comando -o argomento comando --opzione-lunga argomento ls -l /etc ls --long /etc
Molti comandi accettano più opzioni combinate. Ad esempio, ls -la equivale spesso a ls -l -a. Non tutti i comandi seguono esattamente le stesse convenzioni, quindi la consultazione di man resta essenziale.
Navigare nel filesystem
Il filesystem Linux è organizzato ad albero, con radice /. Le directory principali hanno ruoli specifici: /home contiene le home degli utenti, /etc i file di configurazione, /var dati variabili come log e cache, /usr programmi e librerie, /tmp file temporanei.
pwd ls ls -l ls -la cd /etc cd ~ cd .. cd -
cd ~ riporta alla home dell’utente, cd .. sale di un livello, mentre cd - torna alla directory precedente. Questi movimenti sono fondamentali per operare rapidamente tra percorsi diversi.
Percorsi assoluti e relativi
Un percorso assoluto parte sempre da /, mentre un percorso relativo parte dalla directory corrente. Capire questa differenza evita errori quando si copiano, spostano o cancellano file.
/etc/hosts /home/mario/documenti/report.txt ./script.sh ../backup/archivio.tar.gz
Il prefisso ./ indica la directory corrente. È spesso usato per eseguire script presenti nella directory in cui ci si trova.
./install.sh
Creare, copiare, spostare e cancellare file
Le operazioni di base sui file sono tra le prime competenze richieste a chi usa Linux da terminale. I comandi principali sono touch, mkdir, cp, mv, rm e rmdir.
mkdir laboratorio cd laboratorio touch file1.txt cp file1.txt file2.txt mv file2.txt note.txt rm note.txt cd .. rmdir laboratorio
rmdir rimuove solo directory vuote. Per rimuovere una directory con contenuto si usa rm -r, ma il comando va eseguito con attenzione perché non prevede un cestino.
rm -r directory_da_rimuovere rm -ri directory_da_rimuovere
L’opzione -i chiede conferma prima della cancellazione ed è utile durante l’apprendimento o quando si lavora su dati importanti.
Globbing e caratteri jolly
La shell può espandere pattern prima di eseguire un comando. Questa funzionalità è chiamata globbing ed è molto utile per operare su gruppi di file.
ls *.txt ls file?.log ls report[0-9].txt cp *.conf backup/ rm *.tmp
Il carattere * rappresenta zero o più caratteri, ? rappresenta un singolo carattere, mentre le parentesi quadre definiscono classi o intervalli. Prima di usare pattern con rm, è consigliabile verificarne l’espansione con ls.
Visualizzare file di testo
Molti file di configurazione Linux sono file di testo. Saperli leggere velocemente è fondamentale per amministrare il sistema.
cat /etc/os-release less /etc/passwd head /etc/passwd tail /etc/passwd tail -f /var/log/syslog
Su Fedora e openSUSE alcuni log tradizionali possono non essere presenti nello stesso percorso di Ubuntu, perché systemd-journald è spesso il riferimento principale. In questi casi si usa journalctl.
journalctl journalctl -xe journalctl -f
Redirezioni, pipe e stream standard
Ogni comando lavora normalmente con tre stream: standard input, standard output e standard error. Le redirezioni consentono di salvare output su file, leggere input da file o separare gli errori dall’output normale.
ls -l > elenco.txt ls -l >> elenco.txt sort < nomi.txt comando 2> errori.log comando > output.log 2> errori.log comando > tutto.log 2>&1
La pipe | collega l’output di un comando all’input di un altro. È uno dei meccanismi più potenti della shell Unix.
ps aux | less cat /etc/passwd | cut -d: -f1 | sort journalctl -p warning | tail -50
Filtri di testo: grep, sort, cut, uniq, wc
I filtri di testo consentono di analizzare file e output di comandi. Sono strumenti essenziali per troubleshooting, scripting e analisi rapida dei dati.
grep root /etc/passwd grep -i error applicazione.log grep -r "Listen" /etc sort nomi.txt sort nomi.txt | uniq sort nomi.txt | uniq -c wc -l access.log cut -d: -f1 /etc/passwd
grep cerca stringhe o espressioni regolari, sort ordina righe, uniq elimina o conta righe duplicate adiacenti, wc conta righe, parole e byte, mentre cut estrae campi da righe strutturate.
Espressioni regolari di base
Le espressioni regolari permettono ricerche più precise rispetto alla semplice corrispondenza testuale. Sono usate da strumenti come grep, sed e awk.
grep '^root' /etc/passwd grep 'bash$' /etc/passwd grep '[0-9]' file.txt grep -E 'error|warning|critical' applicazione.log grep -E '^[a-z_][a-z0-9_-]*:' /etc/passwd
Il simbolo ^ indica l’inizio della riga, $ la fine, le parentesi quadre definiscono insiemi di caratteri e |, con grep -E, rappresenta un’alternativa logica.
Cercare file con find e locate
find esegue ricerche dinamiche nel filesystem e può applicare azioni ai file trovati. locate, quando disponibile, usa invece un database aggiornato periodicamente ed è molto veloce.
find /etc -name "*.conf" find /var/log -type f -name "*.log" find /home -type f -size +100M find /tmp -type f -mtime +7 find . -type f -name "*.tmp" -delete locate sshd_config
Prima di usare -delete, è buona pratica eseguire lo stesso comando senza cancellazione per verificare l’elenco dei file interessati.
find . -type f -name "*.tmp" find . -type f -name "*.tmp" -delete
Archivi e compressione con tar
tar è usato per creare archivi, spesso compressi con gzip, bzip2 o xz. È uno strumento frequente in backup, distribuzione di sorgenti e migrazione di configurazioni.
tar -cvf archivio.tar directory/ tar -czvf archivio.tar.gz directory/ tar -cjvf archivio.tar.bz2 directory/ tar -cJvf archivio.tar.xz directory/ tar -tvf archivio.tar.gz tar -xzvf archivio.tar.gz tar -xzvf archivio.tar.gz -C /percorso/destinazione
Le opzioni più comuni sono -c per creare, -x per estrarre, -t per elencare, -v per output verboso, -f per indicare il file archivio, -z per gzip, -j per bzip2 e -J per xz.
Permessi, proprietari e gruppi
Linux usa un modello di permessi basato su utente proprietario, gruppo proprietario e altri utenti. I permessi principali sono lettura, scrittura ed esecuzione.
ls -l chmod u+x script.sh chmod 644 file.txt chmod 755 script.sh chown mario:mario file.txt chgrp amministrazione documento.txt
Nel formato numerico, lettura vale 4, scrittura vale 2 ed esecuzione vale 1. Quindi 644 significa lettura e scrittura per il proprietario, sola lettura per gruppo e altri. 755 significa lettura, scrittura ed esecuzione per il proprietario, lettura ed esecuzione per gruppo e altri.
chmod 600 chiave_privata chmod 700 directory_privata chmod -R 755 sito/
L’opzione ricorsiva -R va usata con cautela, soprattutto su directory di sistema.
Utenti, gruppi e identità
L’amministrazione degli utenti richiede privilegi elevati. Su Ubuntu il gruppo amministrativo predefinito è spesso sudo, mentre su Fedora e openSUSE è comune l’uso del gruppo wheel.
id groups getent passwd getent group sudo useradd -m nuovo_utente sudo passwd nuovo_utente sudo usermod -aG sudo nuovo_utente sudo usermod -aG wheel nuovo_utente
usermod -aG aggiunge l’utente a un gruppo senza rimuoverlo dagli altri gruppi. Omettere -a può causare la perdita delle appartenenze precedenti.
Privilegi amministrativi con sudo
sudo consente di eseguire comandi con privilegi elevati mantenendo tracciabilità e controllo. Non è consigliabile lavorare stabilmente come root se non strettamente necessario.
sudo comando sudo -v sudo -l sudoedit /etc/hosts
sudoedit è preferibile per modificare file di configurazione perché apre l’editor in modo più sicuro rispetto all’esecuzione diretta dell’editor come root.
Variabili d’ambiente e PATH
Le variabili d’ambiente influenzano il comportamento della shell e dei programmi. Una delle più importanti è PATH, che contiene l’elenco delle directory in cui la shell cerca gli eseguibili.
echo $SHELL echo $HOME echo $PATH export EDITOR=vim type systemctl
Per aggiungere temporaneamente una directory al PATH:
export PATH="$HOME/bin:$PATH"
Per rendere la modifica persistente per l’utente corrente, si può inserirla in ~/.bashrc o in un file equivalente usato dalla shell.
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc source ~/.bashrc
History, completamento e produttività
La shell conserva una cronologia dei comandi. Usarla correttamente accelera il lavoro e riduce errori di digitazione.
history history | grep ssh !! !123 Ctrl+r
Il tasto Tab completa comandi, file e directory. Se ci sono più corrispondenze, una seconda pressione di Tab mostra le alternative. Questo riduce il rischio di errori su percorsi lunghi.
Gestione dei processi
Un processo è un programma in esecuzione. La gestione dei processi è una competenza centrale per troubleshooting e amministrazione.
ps ps aux top htop pgrep ssh pidof systemd
ps aux mostra una lista dettagliata dei processi. top fornisce una vista interattiva in tempo reale. htop, se installato, offre un’interfaccia più leggibile.
sleep 300 & jobs fg bg kill PID kill -TERM PID kill -KILL PID pkill nome_processo
SIGTERM richiede la terminazione ordinata del processo. SIGKILL forza l’arresto e dovrebbe essere usato solo quando il processo non risponde.
Priorità dei processi con nice e renice
Linux permette di modificare la priorità relativa dei processi tramite il valore nice. Un valore nice più alto indica minore priorità CPU; un valore più basso indica maggiore priorità.
nice -n 10 comando_lungo ps -o pid,ni,comm -p PID sudo renice -n 5 -p PID top
Aumentare la priorità di un processo, riducendo il valore nice, richiede generalmente privilegi amministrativi.
Pacchetti software su Ubuntu, Fedora e openSUSE
La differenza più visibile tra le distribuzioni riguarda il gestore pacchetti. Ubuntu usa APT con pacchetti DEB, Fedora usa DNF con pacchetti RPM, openSUSE usa Zypper con pacchetti RPM.
# Ubuntu sudo apt update sudo apt upgrade sudo apt install nome_pacchetto sudo apt remove nome_pacchetto apt search parola_chiave apt show nome_pacchetto # Fedora sudo dnf check-update sudo dnf upgrade sudo dnf install nome_pacchetto sudo dnf remove nome_pacchetto dnf search parola_chiave dnf info nome_pacchetto # openSUSE sudo zypper refresh sudo zypper update sudo zypper install nome_pacchetto sudo zypper remove nome_pacchetto zypper search parola_chiave zypper info nome_pacchetto
Prima di installare software su sistemi di produzione è opportuno verificare repository abilitati, dipendenze e impatto degli aggiornamenti.
Servizi di sistema con systemd
Ubuntu, Fedora e openSUSE usano systemd come sistema di init e gestione servizi. Lo strumento operativo principale è systemctl.
systemctl status ssh sudo systemctl start ssh sudo systemctl stop ssh sudo systemctl restart ssh sudo systemctl reload ssh sudo systemctl enable ssh sudo systemctl disable ssh systemctl is-enabled ssh systemctl list-units --type=service
Il nome dei servizi può variare. Ad esempio, il servizio SSH può chiamarsi ssh su Ubuntu e sshd su Fedora e openSUSE.
# Ubuntu systemctl status ssh # Fedora / openSUSE systemctl status sshd
Log di sistema con journalctl
journalctl consente di leggere i log raccolti da systemd-journald. È molto utile per diagnosticare servizi che non partono, errori di boot o problemi applicativi.
journalctl journalctl -b journalctl -u ssh journalctl -u sshd journalctl -p err journalctl --since "1 hour ago" journalctl -f
Per analizzare un servizio problematico, una sequenza operativa efficace è controllare stato del servizio, ultimi log e configurazione.
systemctl status nome_servizio journalctl -u nome_servizio -n 100 sudo systemctl restart nome_servizio journalctl -u nome_servizio -f
Rete: indirizzi, route, porte e connessioni
I comandi moderni per la diagnostica di rete includono ip, ss, ping, traceroute, dig e nmcli.
ip addr ip route ping -c 4 8.8.8.8 ping -c 4 mst-tutorial.it ss -tulpen resolvectl status nmcli device status nmcli connection show
ss -tulpen mostra socket TCP e UDP in ascolto con informazioni su processo e porta. È utile per verificare se un servizio è realmente esposto sulla rete.
ss -tulpen | grep :22 ss -tulpen | grep :80 ss -tulpen | grep :443
Firewall: UFW e firewalld
Ubuntu usa spesso UFW come interfaccia semplificata al firewall. Fedora e openSUSE usano frequentemente firewalld. La logica è simile: definire quali servizi o porte possono ricevere traffico in ingresso.
# Ubuntu con UFW sudo ufw status verbose sudo ufw allow ssh sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable # Fedora / openSUSE con firewalld sudo firewall-cmd --state sudo firewall-cmd --get-active-zones sudo firewall-cmd --add-service=ssh --permanent sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --add-service=https --permanent sudo firewall-cmd --reload
Prima di modificare regole firewall da remoto, soprattutto via SSH, è essenziale assicurarsi che l’accesso amministrativo non venga bloccato.
Editor da terminale
Prima o poi sarà necessario modificare file di configurazione. Gli editor più comuni sono nano, vim e, in ambienti KDE, anche kate o kwrite per uso grafico.
nano file.txt vim file.txt sudoedit /etc/hosts
nano è più immediato per i neofiti. vim richiede apprendimento, ma è estremamente potente ed è spesso disponibile anche su sistemi minimali.
sed e awk per elaborazione avanzata del testo
sed è orientato alla trasformazione di stream testuali, mentre awk è efficace nell’elaborazione di dati strutturati a colonne o campi.
sed 's/vecchio/nuovo/g' file.txt
sed -n '1,20p' file.txt
sed '/^#/d' configurazione.conf
awk -F: '{print $1}' /etc/passwd
awk '{print $1, $5}' access.log
awk '$9 == 404 {print $0}' access.log
Questi strumenti sono molto utili quando si devono estrarre informazioni da log, configurazioni o output di altri comandi senza aprire editor o fogli di calcolo.
xargs e sostituzione di comando
xargs costruisce comandi usando come argomenti l’output ricevuto in input. È utile insieme a find, grep e altri filtri.
find . -name "*.log" | xargs grep -i "error" find . -name "*.bak" -print0 | xargs -0 rm
La sostituzione di comando consente di inserire l’output di un comando dentro un altro comando.
echo "Kernel in uso: $(uname -r)" mkdir "backup-$(date +%Y%m%d)" tar -czvf "etc-$(date +%Y%m%d).tar.gz" /etc
Script Bash di base
Uno script Bash permette di automatizzare sequenze di comandi. Ogni script dovrebbe avere una prima riga shebang, permessi di esecuzione e controlli minimi sugli errori.
#!/usr/bin/env bash set -euo pipefail echo "Backup della directory /etc" DEST="$HOME/backup-etc-$(date +%Y%m%d).tar.gz" tar -czf "$DEST" /etc echo "Archivio creato: $DEST"
Dopo aver salvato lo script, è possibile renderlo eseguibile ed eseguirlo.
chmod +x backup-etc.sh ./backup-etc.sh
L’opzione set -euo pipefail rende lo script più rigoroso: interrompe l’esecuzione in caso di errore, variabili non definite o errori nelle pipeline.
Condizioni e cicli in Bash
Le strutture condizionali e i cicli permettono di creare script realmente utili per controlli, manutenzione e automazione.
#!/usr/bin/env bash FILE="/etc/passwd" if [[ -f "$FILE" ]]; then echo "$FILE esiste" else echo "$FILE non esiste" fi
#!/usr/bin/env bash for file in *.log; do echo "Analisi di $file" grep -i "error" "$file" || true done
Le virgolette intorno alle variabili sono importanti: evitano problemi con spazi, caratteri speciali e valori vuoti.
Backup operativo con rsync
rsync è uno strumento potente per sincronizzare file localmente o via rete. È efficiente perché trasferisce solo le differenze quando possibile.
rsync -av documenti/ backup/documenti/ rsync -av --delete documenti/ backup/documenti/ rsync -avz documenti/ utente@server:/backup/documenti/
L’opzione --delete elimina dalla destinazione i file non più presenti nella sorgente. Va usata solo quando si è sicuri della direzione della sincronizzazione.
Dischi, filesystem e spazio disponibile
Per analizzare spazio disco, mount point e dispositivi di blocco si usano strumenti come df, du, lsblk e mount.
df -h du -sh * du -sh /var/log lsblk blkid mount findmnt
df -h mostra lo spazio disponibile sui filesystem montati. du -sh misura lo spazio usato da file o directory. lsblk mostra la struttura dei dischi e delle partizioni.
Uso prudente di dd
dd è uno strumento potente per copiare dati a basso livello. Può essere usato per creare immagini disco, scrivere ISO su dispositivi USB o clonare supporti. È anche pericoloso: un parametro errato può sovrascrivere dati importanti.
lsblk sudo dd if=immagine.iso of=/dev/sdX bs=4M status=progress conv=fsync
Prima di usare dd, verificare sempre il dispositivo di destinazione con lsblk. Non copiare mai comandi di questo tipo senza adattare consapevolmente of=.
SSH e amministrazione remota
SSH consente di accedere in modo sicuro a sistemi remoti. È uno strumento essenziale per server, workstation e ambienti cloud.
ssh utente@server ssh -p 2222 utente@server scp file.txt utente@server:/tmp/ rsync -avz directory/ utente@server:/tmp/directory/
Per generare una coppia di chiavi SSH:
ssh-keygen -t ed25519 -C "utente@workstation" ssh-copy-id utente@server ssh utente@server
L’autenticazione con chiave è preferibile alla sola password, soprattutto su sistemi esposti in rete.
Workflow pratico di troubleshooting
Un approccio operativo efficace consiste nel raccogliere informazioni, isolare il problema, verificare log e modificare una variabile alla volta. Ad esempio, se un servizio web non risponde:
systemctl status nginx journalctl -u nginx -n 100 ss -tulpen | grep ':80' curl -I http://localhost ip addr ip route sudo firewall-cmd --list-all sudo ufw status verbose
Se il servizio non è attivo, il problema è locale al demone o alla configurazione. Se è attivo ma non ascolta sulla porta corretta, bisogna verificare la configurazione. Se ascolta localmente ma non è raggiungibile da fuori, il problema può essere firewall, routing, DNS o configurazione di binding.
Errori comuni da evitare
Molti incidenti da terminale derivano da comandi eseguiti senza verificare directory corrente, pattern globbing o destinazione. Alcune abitudini riducono drasticamente il rischio operativo.
pwd ls -la echo *.log find . -name "*.tmp" cp -av sorgente destinazione rm -ri directory
Prima di cancellare, controllare. Prima di sovrascrivere, fare una copia. Prima di modificare file in /etc, salvare una versione di backup.
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.bak sudoedit /etc/ssh/sshd_config sudo sshd -t sudo systemctl restart sshd
Quando disponibile, usare sempre il comando di validazione della configurazione prima di riavviare un servizio. Per SSH, ad esempio, sshd -t verifica la sintassi della configurazione.
Percorso consigliato di apprendimento
Un percorso pragmatico parte dai comandi di navigazione e gestione file, passa a pipe e filtri, introduce permessi e utenti, poi affronta processi, servizi, log, rete e scripting. La progressione consigliata è:
pwd, cd, ls touch, mkdir, cp, mv, rm cat, less, head, tail grep, sort, uniq, cut, wc >, >>, 2>, | find, tar, gzip chmod, chown, chgrp ps, top, kill, nice, renice systemctl, journalctl ip, ss, ping, nmcli apt, dnf, zypper bash, sed, awk, xargs, rsync
L’obiettivo non è memorizzare ogni opzione, ma capire come combinare i comandi. La forza del terminale Linux non sta nel singolo comando, ma nella capacità di costruire pipeline, automatizzare procedure e diagnosticare problemi in modo ripetibile.




