GNU/Linux

Introduzione al terminale Linux

Comandi base e avanzati per Ubuntu, Fedora e openSUSE

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.

Admin | MST-Tutorial

Appassionato di elettronica, elettrotecnica e programmazione. Fondatore di MST-Tutorial, condivido con entusiasmo conoscenze, esperienze e progetti legati all’innovazione tecnologica, con l’obiettivo di rendere accessibili concetti tecnici complessi attraverso tutorial chiari e pratici.

Articoli Correlati

Pulsante per tornare all'inizio