I comandi Linux principali si dividono in gruppi: navigazione (pwd, ls, cd), gestione dei file (cp, mv, rm, mkdir), permessi (chmod, chown), pacchetti (apt), processi (ps, top, kill), ricerca ed elaborazione del testo (find, grep, sed, awk), rete (ip, ss, curl) e servizi (systemctl, journalctl). Di seguito trovi tabelle con i comandi e gli esempi che coprono gran parte del lavoro quotidiano nel terminale.
Questo cheat sheet dei comandi Linux è organizzato per tipo di attività: trovare un file, installare un pacchetto, terminare un processo bloccato, estrarre una riga da un log, verificare una porta. I comandi sono stati provati su Ubuntu e Debian; quasi tutti funzionano anche in altre distribuzioni, con la differenza principale nel gestore dei pacchetti.
Aiuto e suggerimenti
| ead> | | Comando | Cosa fa |
man ls | manuale completo del comando; uscita con q, ricerca con /parola |
ls --help | riepilogo rapido delle opzioni |
type cd | indica se è un comando interno, un alias o un file |
which python3 | percorso dell'eseguibile |
history | cronologia dei comandi; !123 ripete il comando numero 123 |
Ctrl+R | ricerca nella cronologia |
Ctrl+C / Ctrl+D | interrompere un comando / chiudere la shell |
Navigazione nel file system
| ead> | | Comando | Cosa fa |
pwd | directory corrente |
ls -la | tutti i file, inclusi quelli nascosti, con permessi e dimensioni |
ls -lh | dimensioni leggibili (K, M, G) |
ls -lt | ordinamento per data di modifica |
cd /var/log | spostarsi con percorso assoluto |
cd .. / cd ~ / cd - | directory superiore / home / directory precedente |
tree -L 2 | albero delle directory su 2 livelli (pacchetto tree) |
Gestione di file e directory
| ead> | | Comando | Cosa fa |
touch file.txt | crea un file vuoto o aggiorna la data di modifica |
mkdir -p a/b/c | crea le directory insieme a quelle superiori |
cp file.txt backup.txt | copia un file |
cp -r src/ dst/ | copia una directory in modo ricorsivo |
mv old.txt new.txt | rinomina o sposta |
rm file.txt | elimina un file (non va nel cestino) |
rm -r dir/ | elimina una directory con il contenuto; -f non chiede conferma, attenzione |
rmdir dir | elimina una directory vuota |
ln -s /opt/app/current app | crea un collegamento simbolico |
stat file.txt | dettagli: dimensione, permessi, inode, date |
file image.bin | riconosce il tipo di file dal contenuto |
Visualizzazione del contenuto
| ead> | | Comando | Cosa fa |
cat file | mostra il file per intero |
less file | lettura pagina per pagina, ricerca /, uscita q |
head -n 20 file | prime 20 righe |
tail -n 50 file | ultime 50 righe |
tail -f /var/log/syslog | segue il file in tempo reale |
wc -l file | numero di righe |
diff a.conf b.conf | differenze tra due file |
Permessi e proprietari
| ead> | | Comando | Cosa fa |
chmod +x script.sh | concede il permesso di esecuzione |
chmod 644 file | rw-r--r--: il proprietario scrive, gli altri leggono |
chmod 755 dir | rwxr-xr-x: tipico per directory e script |
chmod 600 ~/.ssh/id_ed25519 | solo il proprietario: per le chiavi private |
sudo chown www-data:www-data file | cambia proprietario e gruppo |
sudo chown -R alice /srv/app | cambia il proprietario in modo ricorsivo |
id | il proprio UID, GID e gruppi |
sudo -i | shell di root |
sudo usermod -aG docker alice | aggiunge un utente a un gruppo |
Pacchetti (apt, Debian e Ubuntu)
| ead> | | Comando | Cosa fa |
sudo apt update | aggiorna l'elenco dei pacchetti dai repository |
sudo apt upgrade | aggiorna i pacchetti installati |
sudo apt install nginx | installa un pacchetto |
sudo apt remove nginx | rimuove, mantenendo le configurazioni; purge le rimuove insieme al pacchetto |
sudo apt autoremove | elimina le dipendenze non più necessarie |
apt search htop | cerca un pacchetto |
apt show nginx | descrizione e versione |
dpkg -l | grep nginx | verifica se il pacchetto è installato |
dpkg -L nginx | file installati dal pacchetto |
In RHEL, Fedora e Rocky Linux gli equivalenti sono dnf install, dnf remove, dnf upgrade, rpm -qa.
Ambiente e profilo
| ead> | | Comando | Cosa fa |
echo $PATH | le directory in cui la shell cerca i programmi |
env | tutte le variabili d'ambiente |
export APP_ENV=prod | imposta una variabile per la sessione corrente e i processi figli |
alias ll='ls -la' | scorciatoia per un comando |
source ~/.bashrc | rilegge il profilo senza disconnettersi |
crontab -e / crontab -l | modifica / elenca i task cron |
Processi
| ead> | | Comando | Cosa fa |
ps aux | tutti i processi, con utente, CPU e memoria |
ps aux | grep nginx | trova un processo |
pgrep -a nginx | PID e riga di comando per nome |
top / htop | carico in tempo reale |
kill 1234 | chiede al processo di terminare (SIGTERM) |
kill -9 1234 | termina forzatamente (SIGKILL) — ultima risorsa |
pkill -f "python app.py" | termina per corrispondenza nella riga di comando |
command &, jobs, fg | avvio in background e gestione dei job |
nohup ./job.sh & | il processo sopravvive alla chiusura del terminale |
free -h | memoria e swap |
uptime | tempo di attività e carico medio |
strace -p 1234 | chiamate di sistema del processo |
Servizi e log (systemd)
| ead> | | Comando | Cosa fa |
systemctl status nginx | stato del servizio e ultime righe del log |
sudo systemctl start|stop|restart nginx | avvia, arresta, riavvia |
sudo systemctl reload nginx | rilegge la configurazione senza fermare il servizio |
sudo systemctl enable --now nginx | abilita l'avvio automatico e avvia subito |
systemctl --failed | unità in errore |
journalctl -u nginx -f | log del servizio in tempo reale |
journalctl -u nginx --since "1 hour ago" | log dell'ultima ora |
journalctl -p err -b | errori dall'ultimo avvio |
Ricerca di file
| ead> | | Comando | Cosa fa |
find /var/log -name "*.log" | cerca per nome |
find . -type f -mtime -1 | file modificati nell'ultimo giorno |
find / -size +500M 2>/dev/null | file grandi; errori di accesso nascosti |
find . -name "*.tmp" -delete | trova ed elimina |
du -sh * | dimensione di ogni elemento della directory |
df -h | spazio libero sui file system |
Ricerca ed elaborazione del testo: grep, sed, awk, jq
| ead> | | Comando | Cosa fa |
grep "error" app.log | righe che contengono la parola |
grep -i -n "error" app.log | senza distinguere maiuscole e minuscole, con i numeri di riga |
grep -r "listen" /etc/nginx/ | ricerca ricorsiva in una directory |
grep -v "DEBUG" app.log | righe in cui la parola non compare |
grep -c "500" access.log | numero di corrispondenze |
grep -E "warn|error" app.log | espressioni regolari estese |
sed 's/old/new/g' file | sostituisce e mostra il risultato |
sed -i 's/8080/9090/' app.conf | sostituisce direttamente nel file |
sed -n '10,20p' file | mostra le righe dalla 10 alla 20 |
awk '{print $1}' access.log | il primo campo di ogni riga |
awk -F: '{print $1}' /etc/passwd | nomi utente (separatore :) |
awk '$9 == 500' access.log | righe in cui il nono campo vale 500 |
sort | uniq -c | sort -rn | conta le ripetizioni e ordina per frequenza |
cut -d, -f2 data.csv | la seconda colonna di un CSV |
jq '.items[].name' data.json | estrae campi da JSON |
Esempio di pipeline: i dieci indirizzi IP che hanno inviato più richieste a nginx.
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
Reindirizzamenti e pipe
| ead> | | Costrutto | Cosa fa |
cmd > out.txt | scrive l'output nel file (sovrascrive) |
cmd >> out.txt | aggiunge in fondo al file |
cmd 2> err.txt | reindirizza gli errori |
cmd > all.log 2>&1 | output ed errori nello stesso file |
cmd1 | cmd2 | passa l'output di un comando all'input di un altro |
cmd | tee out.txt | mostra a schermo e salva |
cmd1 && cmd2 | esegue il secondo solo se il primo ha successo |
cmd1 || cmd2 | esegue il secondo se il primo fallisce |
Archivi
| ead> | | Comando | Cosa fa |
tar -czf backup.tar.gz dir/ | impacchetta e comprime con gzip |
tar -xzf backup.tar.gz | estrae |
tar -tzf backup.tar.gz | mostra il contenuto |
zip -r site.zip site/ / unzip site.zip | archivi zip |
Rete
| ead> | | Comando | Cosa fa |
ip a | interfacce e indirizzi IP |
ip r | tabella di routing |
ping -c 4 8.8.8.8 | raggiungibilità di un host |
ss -tulpn | porte aperte e processi che le usano |
dig example.com / nslookup example.com | interrogazione DNS |
curl -I https://example.com | solo le intestazioni della risposta |
curl -s https://api.example.com | jq | richiesta a un'API e JSON formattato |
wget URL | scarica un file |
traceroute example.com | percorso dei pacchetti verso un host |
ssh user@host | connessione a un server |
ssh-keygen -t ed25519 | crea una coppia di chiavi SSH |
scp file user@host:/tmp/ | copia un file sul server |
rsync -avz dir/ user@host:/srv/dir/ | sincronizza una directory |
sudo ufw status | regole del firewall |
Sistema e dischi
| ead> | | Comando | Cosa fa |
uname -a | kernel e architettura |
cat /etc/os-release | distribuzione e versione |
hostnamectl | nome host e informazioni di sistema |
lsblk | dischi e partizioni |
sudo mount /dev/sdb1 /mnt | monta una partizione |
who / w | chi è connesso al sistema |
sudo reboot / sudo shutdown -h now | riavvio / spegnimento |
In breve
Per il lavoro quotidiano bastano un paio di decine di comandi: ls, cd, cp, mv, rm, chmod, sudo, apt, ps, kill, systemctl, journalctl, grep, find, ss, curl e ssh. Conserva questo cheat sheet e consultalo finché i comandi non diventano automatici. Tutti i gruppi di comandi sono trattati nel corso con esercizi pratici.
Come si esce da man o less?
Premi <code>q</code>. Per cercare dentro il testo digita la barra seguita dalla parola; <code>n</code> passa alla corrispondenza successiva.
Come si esce dall'editor vim?
Premi <code>Esc</code>, poi digita <code>:q!</code> e Invio per uscire senza salvare, oppure <code>:wq</code> per salvare e uscire. Per iniziare è più semplice modificare i file con nano.
Perché rm -rf è pericoloso?
Il comando elimina senza chiedere conferma e senza passare dal cestino, e un errore nel percorso (ad esempio uno spazio in più prima dell'asterisco) può cancellare la directory sbagliata. Prima di eseguirlo controlla il percorso con <code>ls</code>.
Come ripeto l'ultimo comando con sudo?
Digita <code>sudo !!</code>: la shell sostituisce l'intero comando precedente.
Come si ferma un comando bloccato nel terminale?
<code>Ctrl+C</code> invia il segnale di interruzione. Se il comando non risponde, trova il suo PID con <code>ps</code> o <code>pgrep</code> da un altro terminale e terminalo con <code>kill</code>.