Guida rapida ai comandi Linux — Oltre 200 comandi per attività

Comandi Linux per attività, da file e permessi a rete, systemd ed elaborazione del testo. Ogni voce ha opzioni, esempi da copiare e note per macOS.

Guida rapida ai comandi Linux · freetoolsforweb.com/tools/linux-commands-cheat-sheet · verificato il 2026-10-18

Ultima verifica: 2026-10-18 su i manuali di GNU coreutils 9.x, util-linux, procps-ng, iproute2, systemd e bash 5.2; note su macOS verificate sulle pagine man di macOS 26.

215 voci in 15 sezioni

Visualizzare e modificare testo

Leggere file, scorrere log, modificare nel terminale e confrontare versioni.

cat

Stampare o unire file

Linux · macOS#
cat [-n] [-A] file...
-n
numera tutte le righe
-A
mostra le tabulazioni come ^I e le fine riga come $ (GNU); rivela i fine riga CRLF
cat /etc/os-release

stampa un file

cat part1.txt part2.txt > whole.txt

concatena

cat -A script.sh | head

individua tabulazioni nascoste e fine riga ^M di Windows

macOS/BSD: cat di macOS non ha -A; usa cat -vet per la stessa vista.

tac

Stampare un file dall'ultima riga

Linux#
tac file
tac access.log | head

le righe di log più recenti per prime

macOS/BSD: Non disponibile su macOS; usa tail -r file.

less

Scorrere un file o un output lungo

Linux · macOS#
less [-N] [-S] [+F] file
Space / b
pagina giù / su
/text
cerca in avanti; n successivo, N precedente
g / G
vai all'inizio / alla fine
F
segue il file come tail -f; Ctrl+C per fermare
q
esce
-N
mostra i numeri di riga
-S
non manda a capo le righe lunghe (scorrimento laterale)
less /var/log/syslog

leggere un log

journalctl -u nginx | less -S

righe larghe senza andare a capo

head

Mostrare le prime righe di un file

Linux · macOS#
head [-n N] [-c N] file...
-n N
le prime N righe (predefinito 10)
-c N
i primi N byte
-n -N
tutto tranne le ultime N righe (GNU)
head -n 20 data.csv

intestazione e prime righe

head -c 512 file.bin | xxd

dai un'occhiata all'inizio di un binario

macOS/BSD: head di macOS non accetta valori negativi.

tail

Mostrare la fine di un file o seguirlo in tempo reale

Linux · macOS#
tail [-n N] [-f|-F] file...
-n N
le ultime N righe (predefinito 10)
-n +N
parte dalla riga N
-f
continua a stampare mentre il file cresce
-F
segue per nome, resiste alla rotazione dei log
tail -n 50 app.log

ultime 50 righe

tail -F /var/log/nginx/access.log

osserva un log soggetto a rotazione

tail -n +2 data.csv

salta la riga di intestazione di un CSV

nano

Modificare un file con un editor semplice

Linux#
nano file
Ctrl+O
salva
Ctrl+X
esci
Ctrl+W
cerca
Ctrl+K / Ctrl+U
taglia riga / incolla
Alt+U
annulla
sudo nano /etc/hosts

modifica un file di sistema

La barra in fondo allo schermo mostra i tasti; ^ significa Ctrl e M- significa Alt.

vim

Modificare un file con vim (e come uscire)

Linux · macOS#
vim file
i
modalità inserimento (scrivi il testo)
Esc
torna alla modalità normale
:w / :q / :wq
salva / esci / salva ed esci
:q!
esci senza salvare
/text
cerca; n per il successivo
dd / yy / p
elimina riga / copia riga / incolla
u / Ctrl+R
annulla / ripeti
vim +42 app.py

apri alla riga 42

diff

Confrontare due file o directory

Linux · macOS#
diff [-u] [-r] [-q] [-w] a b
-u
formato unificato (quello usato da patch e git)
-r
confronta le directory in modo ricorsivo
-q
dice solo se i file sono diversi
-w
ignora tutti gli spazi
-y
affiancati
diff -u old.conf new.conf

vista leggibile delle modifiche

diff -rq dir1/ dir2/

quali file differiscono tra due alberi

diff <(sort a.txt) <(sort b.txt)

confronta dopo l'ordinamento, tramite process substitution

tee

Scrivere l'output su un file e a schermo insieme

Linux · macOS#
tee [-a] file...
-a
aggiunge in fondo invece di sovrascrivere
make 2>&1 | tee build.log

segui una build e conserva un log

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

aggiunge a un file di root (sudo echo >> non funziona perché il reindirizzamento lo fa la shell)

printf

Stampare testo formattato in modo affidabile

Linux · macOS#
printf 'format' args...
printf '%s\n' "$var"

stampa una variabile in sicurezza, anche se inizia con -n

printf '%-12s %6.2f\n' disk 93.5

colonne allineate

echo -e ed echo -n si comportano diversamente da una shell all'altra; printf si comporta allo stesso modo ovunque.

column

Allineare l'output in una tabella

Linux · macOS#
column -t [-s separators]
column -t -s, data.csv | less -S

leggere un CSV semplice come tabella

mount | column -t

allinea un output separato da spazi

xxd / hexdump

Visualizzare un file in esadecimale

Linux · macOS#
xxd file | hexdump -C file
xxd image.png | head

esadecimale e ASCII affiancati

hexdump -C file.bin | head

dump esadecimale canonico

xxd fa parte dei pacchetti di vim; hexdump è in util-linux (bsdextrautils nelle versioni più recenti di Debian/Ubuntu).

strings

Estrarre il testo leggibile da un file binario

Linux · macOS#
strings [-n min] file
-n N
solo stringhe lunghe almeno N caratteri (predefinito 4)
strings -n 8 firmware.bin | less

trova stringhe di versione, URL, percorsi

Su Linux fa parte di binutils.

Permessi e proprietà

Leggere e modificare chi può leggere, scrivere ed eseguire un file.

ls -l

Leggere una stringa di permessi come -rwxr-x---

Linux · macOS#
ls -l file
ls -l deploy.sh

-rwxr-x--- 1 alice devs 812 Oct 18 09:12 deploy.sh

Il primo carattere è il tipo (- file, d directory, l collegamento simbolico). Poi tre terzine: proprietario, gruppo, tutti gli altri. r=4, w=2, x=1, quindi rwxr-x--- è 750.

chmod

Cambiare i permessi con i numeri ottali

Linux · macOS#
chmod [-R] mode file...
-R
applica a una directory e a tutto il suo contenuto
-v
riporta ogni modifica
chmod 644 index.html

proprietario lettura/scrittura, tutti lettura: file normali

chmod 755 deploy.sh

proprietario tutto, gli altri lettura/esecuzione: script e directory

chmod 600 ~/.ssh/id_ed25519

chiave privata leggibile solo da te; ssh rifiuta chiavi con permessi più larghi

chmod u+x

Cambiare i permessi con le lettere (u/g/o +/-)

Linux · macOS#
chmod [ugoa][+-=][rwxX] file...
chmod +x script.sh

rende eseguibile uno script

chmod go-w file

toglie la scrittura a gruppo e altri

chmod -R u=rwX,go=rX site/

la X maiuscola imposta l'esecuzione solo sulle directory e sui file che l'avevano già

chmod -R 777

Perché chmod -R 777 è la soluzione sbagliata

PericolosoLinux · macOS#
chmod -R 777 dir
find site/ -type d -exec chmod 755 {} +

la soluzione giusta, parte 1: directory 755

find site/ -type f -exec chmod 644 {} +

parte 2: file 644

Attenzione: Dà a ogni utente e a ogni servizio compromesso sulla macchina accesso in scrittura all'intero albero, rende eseguibili tutti i file e fa sì che OpenSSH rifiuti le chiavi in una ~/.ssh con 777. Applicato a /etc o /usr può rompere sudo e il sistema. Correggi invece la proprietà con chown, oppure usa i due comandi find.

chown

Cambiare proprietario e gruppo dei file

PericolosoLinux · macOS#
chown [-R] user[:group] file...
-R
ricorsivo
user:
con i due punti finali e senza gruppo, imposta anche il gruppo al gruppo di login dell'utente
sudo chown -R www-data:www-data /var/www/site

assegna una web root all'utente del server web

sudo chown "$USER": file.txt

prendi possesso di un file creato da root

Attenzione: sudo chown -R su /, /usr o /etc cancella i bit setuid e le proprietà su cui si basano sudo, passwd e i servizi; di solito per rimediare serve reinstallare. Ricontrolla il percorso.

chgrp

Cambiare solo il gruppo dei file

Linux · macOS#
chgrp [-R] group file...
chgrp -R developers /srv/shared

assegna una cartella condivisa al gruppo di un team

umask

Impostare i permessi predefiniti dei nuovi file

Linux · macOS#
umask [mask]
umask

mostra la maschera attuale, di solito 0022

umask 077

nuovi file 600 e directory 700 in questa shell

La maschera rimuove bit: i file partono da 666 e le directory da 777, quindi 022 dà 644 e 755.

sudo

Eseguire un comando come root (o come un altro utente)

Linux · macOS#
sudo [-u user] [-i] command
-i
shell di login di root
-u user
esegue come quell'utente invece che come root
-l
elenca cosa ti è consentito eseguire
-k
dimentica le credenziali memorizzate
sudo systemctl restart nginx

un comando da amministratore

sudo !!

riesegue il comando precedente con sudo

sudo -u postgres psql

esegue come utente di servizio

su

Passare a un altro utente

Linux · macOS#
su [-] [user]
su - deploy

accedi come deploy con il suo ambiente

sudo su -

shell di root quando root non ha password (sudo -i fa lo stesso)

setfacl / getfacl

Dare accesso a un utente in più con le ACL

Linux#
setfacl -m u:user:perms file
-m
modifica (aggiunge) una voce
-x
rimuove una voce
-b
rimuove tutte le voci ACL
-R
ricorsivo
-d
imposta una ACL predefinita ereditata dai nuovi file
setfacl -m u:alice:rw report.xlsx

alice può leggere e scrivere, senza cambiare gruppo

getfacl report.xlsx

mostra tutte le voci

setfacl -R -m g:devs:rwX /srv/app

un gruppo ottiene accesso a un intero albero

Un + alla fine della stringa di permessi di ls -l indica che il file ha una ACL.

chattr / lsattr

Rendere un file immutabile

Linux#
chattr +i|-i file
sudo chattr +i /etc/resolv.conf

nessuno, nemmeno root, può modificarlo o eliminarlo finché non togli -i

lsattr /etc/resolv.conf

mostra gli attributi; i significa immutabile

Supportato su ext4, XFS, Btrfs. Se compare "Operation not permitted" anche da root, controlla lsattr.

Processi e job

Trovare cosa è in esecuzione, fermarlo ed eseguire cose in background.

ps

Elencare i processi in esecuzione

Linux · macOS#
ps aux | ps -ef | ps -o fields -p PID
aux
tutti i processi con CPU, memoria, utente (stile BSD)
-ef
tutti i processi con PID del padre (stile System V)
-o
sceglie le colonne
--sort=-%mem
ordina per memoria, dal valore più alto (procps)
ps aux | grep [n]ginx

il trucco [n] esclude grep stesso dai risultati

ps aux --sort=-%mem | head

i processi che usano più memoria

ps -o pid,ppid,etime,cmd -p 1234

da quanto tempo è in esecuzione un processo

macOS/BSD: ps di macOS non ha --sort; usa ps aux -m (per memoria) o ps aux -r (per CPU).

pstree

Mostrare i processi come albero padre/figlio

Linux#
pstree [-p] [user|PID]
pstree -p

con i PID

pstree -p 1234

cosa ha generato un processo

top

Osservare l'uso di CPU e memoria in tempo reale

Linux · macOS#
top [-u user] [-p PID] [-b -n 1]
P / M
ordina per CPU / memoria (top di Linux)
1
mostra ogni core della CPU
k
termina un processo tramite PID
q
esce
-b -n 1
un'istantanea in modalità batch, per gli script
top -b -n 1 | head -20

istantanea da incollare in un ticket

macOS/BSD: top di macOS è un programma diverso: ordina con top -o cpu o top -o mem.

htop

Visualizzatore interattivo dei processi più comodo

Linux#
htop [-u user]
F3 or /
cerca
F4
filtra
F6
sceglie la colonna di ordinamento
F9
invia un segnale (kill)
t
vista ad albero
htop -u www-data

solo i processi di un utente

Installalo con apt install htop / dnf install htop.

pgrep

Trovare gli ID dei processi per nome

Linux · macOS#
pgrep [-a] [-f] [-u user] pattern
-a
mostra la riga di comando completa (procps di Linux)
-f
confronta con l'intera riga di comando, non solo con il nome
-u user
solo i processi di quell'utente
-x
corrispondenza esatta del nome
pgrep -a nginx

PID e righe di comando

pgrep -f 'python manage.py runserver'

trova uno script dai suoi argomenti

macOS/BSD: Su macOS -a significa "includi gli antenati"; usa pgrep -lf per vedere nomi e argomenti.

pkill

Fermare i processi per nome

Linux · macOS#
pkill [-signal] [-f] [-u user] pattern
pkill -f "node server.js"

ferma una singola app Node

pkill -HUP nginx

invia un segnale di ricaricamento

pgrep -af node

controlla cosa troverebbe -f prima di terminare

I pattern sono espressioni regolari cercate in qualsiasi punto del nome; pkill node colpisce anche nodejs-helper. Controlla prima con pgrep.

kill

Inviare un segnale a un processo (fermare, terminare, ricaricare)

Linux · macOS#
kill [-signal] PID...
(none) / -15 / -TERM
chiede al processo di uscire in modo pulito (predefinito)
-9 / -KILL
terminazione forzata; non può essere intercettata, nessuna pulizia
-1 / -HUP
molti demoni ricaricano la configurazione
-l
elenca i nomi dei segnali
kill 1234

arresto gentile

kill -9 1234

ultima risorsa quando TERM viene ignorato

kill %1

termina il job 1 di questa shell

Prova prima un semplice kill e aspetta qualche secondo: -9 salta la pulizia, quindi possono restare file temporanei, lock e dati scritti a metà.

killall

Terminare tutti i processi con un nome esatto

Linux · macOS#
killall [-signal] name
killall firefox

tutti i processi di Firefox

Su Linux fa parte del pacchetto psmisc.

Ctrl+Z, bg, fg, jobs

Mettere in pausa un comando e farlo continuare in background

Linux · macOS#
Ctrl+Z; bg [%n]; fg [%n]; jobs
jobs

elenca i job di questa shell con i loro numeri

bg %1

riprende il job 1 in background

fg %1

lo riporta in primo piano

Ctrl+Z sospende il programma in primo piano (si ferma finché non usi bg o fg).

&

Avviare un comando in background

Linux · macOS#
command &
./long-export.sh > export.log 2>&1 &

avvialo e riottieni il prompt

wait

in uno script, attende la fine dei job in background

nohup

Tenere in esecuzione un comando dopo il logout

Linux · macOS#
nohup command > log 2>&1 &
nohup ./server > server.log 2>&1 &

sopravvive alla chiusura della sessione SSH

Per tutto ciò che deve durare a lungo, un servizio systemd (vedi Servizi e log) o tmux è più robusto.

disown

Staccare dalla shell un job già in esecuzione

Linux · macOS#
disown [-h] [%n]
disown -h %1

hai dimenticato nohup: mettilo in background con bg, poi usa disown

tmux

Mantenere attiva una sessione di terminale anche dopo le disconnessioni

Linux#
tmux new -s name | tmux attach -t name
Ctrl+B d
stacca (la sessione continua a girare)
Ctrl+B c
nuova finestra
Ctrl+B % / Ctrl+B "
divide sinistra/destra / sopra/sotto
tmux ls
elenca le sessioni
tmux new -s deploy

avvia una sessione con nome

tmux attach -t deploy

ricollegati dopo la caduta di SSH

Installalo con il gestore di pacchetti. GNU screen è l'alternativa più vecchia (Ctrl+A d per staccare, screen -r per ricollegarsi).

nice / renice

Eseguire un comando con priorità CPU più bassa (o più alta)

Linux · macOS#
nice -n N command | renice -n N -p PID
nice -n 19 tar -czf backup.tgz /data

backup che non disturba gli altri processi

sudo renice -n -5 -p 1234

aumenta la priorità di un processo in esecuzione

La niceness va da -20 (priorità massima) a 19 (minima). Solo root può scendere sotto 0.

timeout

Terminare un comando se dura troppo

Linux#
timeout [-s signal] duration command
timeout 30s curl -s https://example.com/health

rinuncia dopo 30 secondi

timeout -s KILL 5m ./job.sh

terminazione forzata dopo cinque minuti

Esce con stato 124 quando viene raggiunto il limite di tempo.

watch

Rieseguire un comando a intervalli di pochi secondi

Linux#
watch [-n seconds] [-d] command
watch -n 2 df -h

osserva lo spazio su disco che si riempie

watch -d 'ss -s'

-d evidenzia cosa è cambiato

lsof

Vedere quale processo tiene aperto un file o una porta

Linux · macOS#
lsof [-i :port] [-p PID] [file]
sudo lsof -i :8080

cosa è in ascolto sulla porta 8080

sudo lsof +L1

file eliminati ma ancora aperti (disco pieno ma du non mostra nulla)

lsof -p 1234

tutti i file aperti da un processo

fuser

Trovare (o terminare) cosa sta usando un mount o una porta

PericolosoLinux#
fuser [-v] [-m] [-k] target
sudo fuser -vm /mnt/usb

perché umount dice "target is busy"

sudo fuser -v 8080/tcp

il processo su una porta TCP

Attenzione: fuser -k termina senza conferma ogni processo che usa la destinazione; su un punto di mount può includere la tua stessa shell.

time

Misurare quanto dura un comando

Linux · macOS#
time command
time ./build.sh

real = tempo reale, user + sys = tempo di CPU

strace

Tracciare le chiamate di sistema di un programma

Linux#
strace [-f] [-e trace=...] command | strace -p PID
strace -f -e trace=openat ./app 2>&1 | grep -v ENOENT

quali file apre davvero?

sudo strace -p 1234

su cosa è bloccato un processo appeso?

Informazioni di sistema e risorse

Versione del sistema operativo, kernel, CPU, memoria, hardware, ora e carico.

uname

Mostrare versione del kernel e architettura

Linux · macOS#
uname [-a|-r|-m]
-a
tutto
-r
release del kernel
-m
architettura della macchina: x86_64, aarch64
uname -r

es. 6.8.0-45-generic

uname -m

quale binario scaricare: x86_64 o aarch64

cat /etc/os-release

Trovare la distribuzione Linux e la versione

Linux#
cat /etc/os-release
cat /etc/os-release

NAME, VERSION_ID, ID per ogni distribuzione dell'era systemd

lsb_release -a

alternativa per Debian/Ubuntu, se installato

macOS/BSD: macOS: sw_vers.

hostnamectl

Mostrare o impostare il nome host

Linux#
hostnamectl [set-hostname name]
hostnamectl

nome host, sistema operativo, kernel, virtualizzazione

sudo hostnamectl set-hostname web01

rinomina la macchina

uptime

Mostrare uptime e carico medio

Linux · macOS#
uptime
uptime

carico medio su 1, 5 e 15 minuti

Il carico è il numero di processi in esecuzione o in attesa. Confrontalo con il numero di CPU (nproc): un carico di 4 su 4 core significa piena occupazione.

free

Controllare l'uso di memoria e swap

Linux#
free [-h]
free -h

guarda la colonna "available", non "free"

macOS/BSD: macOS: vm_stat, oppure top -l 1 | grep PhysMem.

Linux usa la RAM inutilizzata come cache del disco, quindi "free" sembra basso anche su una macchina sana. "available" è ciò che i programmi possono ancora ottenere.

lscpu / nproc

Mostrare modello di CPU e numero di core

Linux#
lscpu | nproc
lscpu

modello, socket, core, thread, flag

make -j"$(nproc)"

usa tutti i core disponibili

macOS/BSD: macOS: sysctl -n hw.ncpu e sysctl -n machdep.cpu.brand_string.

lspci / lsusb

Elencare i dispositivi PCI e USB

Linux#
lspci [-k] | lsusb
lspci -k | grep -A3 -i vga

scheda grafica e driver in uso

lsusb

il dispositivo USB viene rilevato?

dmidecode / lshw

Mostrare slot RAM, BIOS e dettagli hardware

Linux#
sudo dmidecode -t type | sudo lshw -short
sudo dmidecode -t memory | grep -i size

RAM installata per slot

sudo lshw -short

una riga per dispositivo

dmesg

Leggere i messaggi del kernel (hardware, driver, interventi dell'OOM killer)

Linux#
dmesg [-T] [-w] [--level=...]
-T
date e ore leggibili
-w
segue i nuovi messaggi
--level=err,warn
solo i problemi
sudo dmesg -T | tail -30

cosa è appena successo (USB collegata, errori del disco)

sudo dmesg -T | grep -i 'out of memory'

l'OOM killer ha fermato la tua app?

/proc

Leggere informazioni grezze su CPU, memoria e processi da /proc

Linux#
cat /proc/<file>
grep MemAvailable /proc/meminfo

memoria disponibile in kB

grep -c ^processor /proc/cpuinfo

numero di CPU logiche

cat /proc/1234/status

stato e memoria di un processo

vmstat / iostat

Capire se il collo di bottiglia è la CPU, la memoria o il disco

Linux#
vmstat interval count | iostat -xz interval
vmstat 1 5

r = coda di esecuzione, si/so = swapping, wa = attesa di I/O

iostat -xz 1

utilizzo per disco (%util) e latenza (await)

iostat fa parte del pacchetto sysstat.

date

Stampare o calcolare date e timestamp Unix

Linux · macOS#
date [+format] [-d 'description']
+%F
AAAA-MM-GG
+%s
timestamp Unix (secondi)
-d 'text'
analizza una data: tomorrow, 2 days ago, @1700000000 (GNU)
-u
UTC
date '+%Y-%m-%d %H:%M:%S'

timestamp per i log

date +%s

secondi dal 1970-01-01 UTC

date -d @1700000000

da timestamp a data (GNU)

date -d '2 days ago' +%F

data relativa (GNU)

macOS/BSD: date di macOS non ha -d. Usa date -r 1700000000 per un timestamp, date -v-2d per "2 giorni fa" e date -j -f '%Y-%m-%d' 2026-10-18 +%s per analizzare una data.

timedatectl

Impostare il fuso orario e verificare la sincronizzazione dell'orologio

Linux#
timedatectl [set-timezone Zone]
timedatectl

ora locale, UTC, fuso orario, NTP sincronizzato?

timedatectl list-timezones | grep America

trova il nome del fuso

sudo timedatectl set-timezone America/Toronto

cambialo

Dischi e file system

Spazio libero, cosa lo occupa, partizioni, montaggio e formattazione.

df

Controllare lo spazio libero su disco

Linux · macOS#
df [-h] [-T] [-i] [path]
-h
dimensioni leggibili
-T
mostra il tipo di file system (GNU)
-i
uso degli inode invece dei byte
df -h

tutti i file system montati

df -h .

il file system su cui si trova questa directory

df -i

"No space left" con byte liberi? Potresti aver esaurito gli inode

macOS/BSD: Su macOS, -T filtra per tipo invece di mostrarlo.

du

Trovare cosa occupa spazio su disco

Linux · macOS#
du [-s] [-h] [-d depth] [path...]
-s
un totale per argomento
-h
leggibile
-d N
limite di profondità (forma lunga GNU: --max-depth=N)
-x
resta su un solo file system
du -sh /var/log

dimensione di una cartella

du -h -d 1 | sort -h

sottocartelle, le più grandi in fondo (funziona su GNU e macOS)

sudo du -xh -d 1 / | sort -h | tail

le directory di primo livello più grandi

macOS/BSD: du di macOS ha -d ma non --max-depth.

ncdu

Esplorare l'uso del disco in modo interattivo

Linux#
ncdu [-x] [path]
sudo ncdu -x /

naviga con le frecce, d per eliminare

Installalo con apt install ncdu / dnf install ncdu.

lsblk

Elencare dischi e partizioni

Linux#
lsblk [-f]
-f
tipo di file system, etichetta, UUID, punto di mount
lsblk

dischi, partizioni, dimensioni, punti di mount

lsblk -f

quale partizione è ext4/xfs, e il suo UUID

macOS/BSD: macOS: diskutil list.

blkid

Ottenere l'UUID di una partizione

Linux#
sudo blkid [device]
sudo blkid /dev/sdb1

UUID e TYPE, per /etc/fstab

findmnt

Mostrare cosa è montato e dove

Linux#
findmnt [target] | findmnt -T path
findmnt

albero dei mount con le opzioni

findmnt -T /var/lib/docker

quale file system contiene questo percorso

sudo findmnt --verify

controlla /etc/fstab per errori prima di riavviare

mount

Montare un disco o una partizione

Linux#
mount [-t type] [-o options] device dir
sudo mount /dev/sdb1 /mnt/usb

monta una chiavetta USB (la directory deve esistere)

sudo mount -o remount,rw /

rende scrivibile una root in sola lettura

sudo mount -t nfs nas:/export /mnt/nas

monta una condivisione NFS

umount

Smontare un disco

Linux#
umount dir|device
sudo umount /mnt/usb

dopo questo puoi scollegarlo in sicurezza

sudo umount -l /mnt/nas

lazy: stacca subito, ripulisce quando non è più occupato

"target is busy" significa che un processo (spesso la tua stessa shell posizionata in quella directory) lo sta usando: trovalo con fuser -vm o lsof.

/etc/fstab

Montare un disco automaticamente all'avvio

Linux#
UUID=<uuid> <mountpoint> <type> <options> <dump> <pass>
UUID=3f6c...  /data  ext4  defaults,nofail  0  2

una riga per file system; nofail consente di continuare l'avvio se il disco manca

sudo mount -a

monta subito tutto ciò che è in fstab: prova prima di riavviare

Un errore di battitura in fstab può mandare il prossimo avvio in modalità di emergenza. Esegui sempre sudo mount -a (o findmnt --verify) dopo averlo modificato.

fdisk / parted

Visualizzare o modificare le tabelle delle partizioni

PericolosoLinux#
sudo fdisk -l | sudo fdisk /dev/sdX | sudo parted /dev/sdX print
sudo fdisk -l

tutti i dischi e le loro partizioni

sudo parted /dev/sdb print

tipo di tabella delle partizioni (gpt/msdos) e layout

Attenzione: Scrivere una tabella delle partizioni (w in fdisk, mklabel in parted) rende irraggiungibili i dati esistenti su quel disco. Verifica prima il nome del dispositivo con lsblk; /dev/sda e /dev/sdb si scambiano facilmente.

mkfs

Formattare una partizione

PericolosoLinux#
sudo mkfs.<type> device
sudo mkfs.ext4 -L data /dev/sdb1

ext4 con un'etichetta

sudo mkfs.vfat -F 32 /dev/sdc1

FAT32 per una chiavetta USB leggibile da altri dispositivi

Attenzione: Cancella immediatamente il file system sulla destinazione, senza conferma se il dispositivo non è montato. Controlla il dispositivo con lsblk -f; formattare /dev/sda invece di /dev/sda1, o il disco sbagliato, lo distrugge.

fsck

Controllare e riparare un file system

PericolosoLinux#
sudo fsck [-f] device
sudo fsck -f /dev/sdb1

forza un controllo completo di una partizione smontata

Attenzione: Non eseguire mai fsck su un file system montato in lettura e scrittura: può danneggiarlo. Smontalo prima, oppure, per il file system root, avvia da un supporto di ripristino.

dd

Scrivere una ISO su una chiavetta USB o copiare un disco grezzo

PericolosoLinux · macOS#
dd if=input of=output bs=size [status=progress] [conv=fsync]
if= / of=
file o dispositivo di input / output
bs=4M
dimensione del blocco; più grande è più veloce
status=progress
mostra i byte copiati (GNU)
conv=fsync
svuota i dati sul dispositivo prima di uscire
sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress conv=fsync

crea una USB avviabile (sostituisci sdX con l'intero disco, non una partizione)

dd if=/dev/zero of=test.img bs=1M count=100

crea un file da 100 MB

Attenzione: dd sovrascrive la destinazione of= senza chiedere. Invertire if= e of=, o scegliere il /dev/sdX sbagliato, cancella quel disco. Controlla con lsblk subito prima di eseguirlo.

macOS/BSD: macOS: usa come destinazione /dev/rdiskN (da diskutil list) dopo diskutil unmountDisk, usa bs=4m e premi Ctrl+T per vedere l'avanzamento.

sync

Scrivere su disco le scritture in sospeso

Linux · macOS#
sync
sync && sudo umount /mnt/usb

prima di scollegare un'unità USB

swapon / mkswap

Controllare o aggiungere spazio di swap

Linux#
swapon --show | mkswap file && swapon file
swapon --show

swap attuale

sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile

aggiunge un file di swap da 2 GB (aggiungilo a /etc/fstab per mantenerlo)

Su Btrfs un file di swap richiede passaggi aggiuntivi (btrfs filesystem mkswapfile nelle versioni recenti di btrfs-progs).

shred

Sovrascrivere un file prima di eliminarlo

PericolosoLinux#
shred [-u] [-n passes] file
shred -u -n 3 secrets.txt

sovrascrive tre volte, poi elimina

Attenzione: Irreversibile. Nota anche che non è affidabile su SSD, file system con journaling o copy-on-write (Btrfs, ZFS) o qualsiasi cosa con snapshot; per una protezione reale usa la crittografia dell'intero disco.

Rete

Indirizzi IP, route, porte aperte, richieste HTTP, DNS, SSH e trasferimento di file.

ip addr

Mostrare gli indirizzi IP di questa macchina

Linux#
ip [-br] addr [show dev IFACE]
ip -br a

una riga per interfaccia: nome, stato, indirizzi

ip a show eth0

un'interfaccia in dettaglio

hostname -I

solo gli indirizzi IP

macOS/BSD: macOS: ifconfig, oppure ipconfig getifaddr en0.

ip sostituisce il vecchio ifconfig (net-tools), che molte distribuzioni non installano più.

ip route

Mostrare la tabella di routing e il gateway predefinito

Linux#
ip route [get ADDRESS] | ip route add NET via GW
ip r

route; "default via" è il gateway

ip route get 1.1.1.1

quale interfaccia e quale gateway usa una destinazione

sudo ip route add 10.20.0.0/16 via 192.168.1.1

aggiunge una route (persa al riavvio)

ip link

Attivare o disattivare un'interfaccia di rete

PericolosoLinux#
ip link [set IFACE up|down]
ip link

interfacce e indirizzi MAC

sudo ip link set eth0 down && sudo ip link set eth0 up

riavvia un'interfaccia

Attenzione: Disattivare l'interfaccia attraverso cui sei connesso via SSH interrompe la sessione.

ss

Elencare le porte in ascolto e le connessioni aperte

Linux#
ss [-t] [-u] [-l] [-p] [-n]
-t / -u
TCP / UDP
-l
solo socket in ascolto
-p
mostra il processo (sudo per vedere quelli di altri utenti)
-n
porte numeriche, niente DNS
-s
conteggi riepilogativi
sudo ss -tulpn

tutte le porte in ascolto e i relativi programmi

ss -tn state established '( dport = :443 )'

connessioni stabilite verso la porta 443

ss -s

totali delle connessioni

macOS/BSD: macOS: lsof -iTCP -sTCP:LISTEN -n -P, oppure netstat -an.

ss sostituisce netstat; netstat -tulpn funziona ancora dove è installato net-tools.

curl

Fare una richiesta HTTP o scaricare un file

Linux · macOS#
curl [options] URL
-I
solo intestazioni (richiesta HEAD)
-L
segue i reindirizzamenti
-o file / -O
salva in un file / salva con il nome remoto
-s / -S
silenzioso / ma mostra comunque gli errori
-f
fallisce (uscita 22) con HTTP 4xx/5xx invece di stampare la pagina di errore
-v
dettagliato: intestazioni di richiesta e risposta, TLS
curl -I https://example.com

riga di stato e intestazioni

curl -LO https://example.com/file.tar.gz

scarica, seguendo i reindirizzamenti

curl -s -o /dev/null -w '%{http_code}\n' https://example.com

solo il codice di stato

curl -fsSL https://example.com/install.sh -o install.sh

scarica uno script da leggere prima di eseguirlo

curl -d

Inviare una richiesta POST con JSON

Linux · macOS#
curl -H 'Content-Type: application/json' -d 'json' URL
-d data
corpo della richiesta; implica POST
--data-binary @file
invia un file così com'è
-H header
aggiunge un'intestazione
-X METHOD
PUT, PATCH, DELETE…
-u user:pass
autenticazione di base
curl -H 'Content-Type: application/json' -d '{"name":"Ada"}' https://api.example.com/users

POST di JSON

curl -H "Authorization: Bearer $TOKEN" https://api.example.com/me

virgolette doppie così $TOKEN viene espanso

curl -X DELETE https://api.example.com/users/42

altri metodi

wget

Scaricare file (con ripresa)

Linux#
wget [options] URL
-c
riprende un download parziale
-O file
salva come (usa -O- per stdout)
-q
silenzioso
-r -np
ricorsivo, non risale mai alla directory padre
wget -c https://example.com/big.iso

riprende dopo una connessione caduta

wget -qO- https://example.com/data.json | jq .

passa l'output direttamente a un altro comando

macOS/BSD: Non presente su macOS di serie; usa curl -LO (curl -C - -LO per riprendere).

dig

Consultare i record DNS

Linux · macOS#
dig [@server] name [type] [+short]
dig +short example.com

solo i record A

dig MX example.com

server di posta

dig @1.1.1.1 example.com

interroga un resolver specifico (aggira la cache locale)

dig -x 8.8.8.8

ricerca inversa

dig +trace example.com

segue la delega dalla root

Nome del pacchetto: dnsutils (Debian/Ubuntu) o bind-utils (Fedora/RHEL).

host / nslookup

Ricerca DNS rapida

Linux · macOS#
host name | nslookup name [server]
host example.com

A, AAAA e MX in una risposta breve

nslookup example.com 8.8.8.8

lo stesso comando esiste su Windows

resolvectl

Controllare i server DNS in uso e svuotare la cache DNS

Linux#
resolvectl [status|query|flush-caches]
resolvectl status

server DNS per interfaccia

sudo resolvectl flush-caches

svuota la cache di systemd-resolved

macOS/BSD: macOS: sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder.

Solo sui sistemi che usano systemd-resolved (Ubuntu, Fedora per impostazione predefinita).

ping

Verificare se un host è raggiungibile

Linux · macOS#
ping [-c count] [-i interval] host
-c N
si ferma dopo N pacchetti
-i sec
intervallo tra i pacchetti
-4 / -6
forza IPv4 / IPv6
ping -c 4 example.com

quattro pacchetti, poi un riepilogo

Su Linux e macOS ping continua finché non premi Ctrl+C, a meno che tu non usi -c (Windows si ferma dopo 4). Nessuna risposta non significa sempre che sia irraggiungibile: molti host bloccano ICMP.

traceroute / tracepath

Vedere il percorso dei pacchetti verso un host

Linux · macOS#
traceroute [-n] host | tracepath host
traceroute -n example.com

hop senza ricerche DNS

tracepath example.com

non serve root, riporta anche la MTU

macOS/BSD: macOS ha traceroute ma non tracepath.

Su Linux potrebbe essere necessario installare traceroute; tracepath (iputils) di solito c'è.

mtr

Trovare dove avviene la perdita di pacchetti

Linux#
mtr [-r] [-w] [-c count] host
mtr -rw -c 100 example.com

report dopo 100 sonde per hop

Combina ping e traceroute. Una perdita su un solo hop intermedio di solito è quel router che dà bassa priorità a ICMP; una perdita che prosegue fino alla fine è reale.

ssh

Accedere a una macchina remota

Linux · macOS#
ssh [-p port] [-i key] [-J jump] user@host [command]
ssh alice@203.0.113.10

accedi

ssh -p 2222 alice@host

porta non standard

ssh alice@host 'df -h'

esegue un comando e torna

ssh -J bastion.example.com alice@10.0.0.5

passa attraverso un bastion host

ssh -L / -R / -D

Inoltrare una porta tramite SSH (tunnel)

Linux · macOS#
ssh -L local:host:remote user@server
-L 5432:localhost:5432
la porta locale 5432 raggiunge la porta 5432 sul server
-R 8080:localhost:3000
la porta 8080 del server raggiunge la tua 3000 locale
-D 1080
proxy SOCKS sulla porta locale 1080
-N
nessun comando remoto, solo il tunnel
ssh -N -L 5432:localhost:5432 alice@db-host

collega il tuo client DB locale a un Postgres remoto

ssh -N -D 1080 alice@host

naviga attraverso il server

ssh-keygen

Creare una chiave SSH e installarla su un server

Linux · macOS#
ssh-keygen -t ed25519 [-C comment] | ssh-copy-id user@host
ssh-keygen -t ed25519 -C "you@example.com"

nuova coppia di chiavi in ~/.ssh

ssh-copy-id alice@host

aggiunge la tua chiave pubblica agli authorized_keys del server

ssh-keygen -R host

rimuove una vecchia chiave host dopo la ricostruzione di un server ("REMOTE HOST IDENTIFICATION HAS CHANGED")

~/.ssh/config

Salvare le impostazioni di connessione SSH come alias breve

Linux · macOS#
Host alias / HostName / User / Port / IdentityFile
Host web
  HostName 203.0.113.10
  User deploy
  Port 2222
  IdentityFile ~/.ssh/id_ed25519

poi basta: ssh web (lo usano anche scp e rsync)

scp

Copiare file da o verso un server tramite SSH

Linux · macOS#
scp [-r] [-P port] source... dest
-r
copia directory
-P port
porta (P maiuscola; ssh usa -p minuscola)
-i key
file di identità
scp report.pdf alice@host:/tmp/

caricamento

scp alice@host:/var/log/app.log .

download

scp -r -P 2222 site/ alice@host:~/

carica una cartella su un'altra porta

Da OpenSSH 9.0, scp usa internamente il protocollo SFTP. Per copie grandi o ripetute rsync è più veloce perché invia solo le modifiche.

rsync

Sincronizzare cartelle in locale o tramite SSH

Linux · macOS#
rsync [-avz] [--progress] [-n] source dest
-a
archivio: ricorsivo, mantiene permessi, date, collegamenti
-v
dettagliato
-z
comprime durante il trasferimento
-P
avanzamento e ripresa dei file parziali
-n
prova a vuoto: mostra cosa succederebbe
--exclude 'pattern'
salta dei file
-e 'ssh -p 2222'
opzioni SSH personalizzate
rsync -avzP site/ deploy@host:/srv/site/

la barra finale su site/ copia il contenuto, non la cartella stessa

rsync -av --exclude 'node_modules' ./ /backup/app/

backup locale senza file inutili

macOS/BSD: Le versioni recenti di macOS includono openrsync invece di rsync; le opzioni comuni funzionano, alcune più rare no.

src/ significa "il contenuto di src"; src senza barra significa "la cartella src". Sbagliare crea cartelle annidate (dest/src/…).

rsync --delete

Rendere la destinazione una copia speculare esatta

PericolosoLinux · macOS#
rsync -av --delete source/ dest/
rsync -avn --delete site/ /srv/site/

prima la prova a vuoto: le righe che iniziano con "deleting" mostrano cosa verrebbe eliminato

rsync -av --delete site/ /srv/site/

poi l'esecuzione reale

Attenzione: Elimina tutto ciò che in dest non è presente nell'origine. Invertire origine e destinazione, o un percorso di origine vuoto o sbagliato, cancella la destinazione. Esegui sempre prima con -n.

nc

Verificare se una porta TCP è aperta

Linux · macOS#
nc -zv host port | nc -l port
nc -zv db.internal 5432

"succeeded" oppure "Connection refused"/timeout

nc -l 9000

mettiti in ascolto su una porta per testare un firewall dall'altro lato

Le opzioni variano tra le versioni di netcat: quella tradizionale richiede nc -l -p 9000.

ufw

Gestire il firewall su Ubuntu

PericolosoLinux#
sudo ufw [status|allow|deny|delete|enable]
sudo ufw status verbose

regole e criterio predefinito

sudo ufw allow 22/tcp

consenti SSH (fallo prima di enable)

sudo ufw allow from 10.0.0.0/8 to any port 5432

una porta, una rete

Attenzione: sudo ufw enable su un server remoto senza aver prima consentito SSH (ufw allow OpenSSH o 22/tcp) ti chiude fuori.

firewall-cmd

Gestire il firewall su Fedora/RHEL

Linux#
sudo firewall-cmd [--permanent] --add-service|--add-port ...
sudo firewall-cmd --list-all

zona attiva e regole

sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reload

apre HTTPS in modo permanente

sudo firewall-cmd --permanent --add-port=8080/tcp

apre una porta

Senza --permanent una regola dura fino al prossimo reload o riavvio.

nmcli

Gestire Wi-Fi e connessioni (NetworkManager)

Linux#
nmcli [device|connection] ...
nmcli device status

interfacce e stato della connessione

nmcli device wifi list

reti vicine

nmcli device wifi connect 'MyWiFi' password 'secret'

connettiti a una rete

Pacchetti: apt, dnf, pacman, zypper

La stessa attività nei quattro principali gestori di pacchetti: Debian/Ubuntu (apt), Fedora/RHEL (dnf), Arch (pacman), openSUSE (zypper). Aggiungi sudo davanti a tutto ciò che modifica il sistema.

Attivitàapt (Debian, Ubuntu)dnf (Fedora, RHEL)pacman (Arch)zypper (openSUSE)
Aggiornare gli elenchi dei pacchetti #
dnf aggiorna automaticamente i metadati quando sono obsoleti. Su Arch non eseguire mai pacman -Sy seguito da -S pkg: gli aggiornamenti parziali non sono supportati; usa -Syu.
apt update
dnf makecache
pacman -Sy
zypper refresh
Aggiornare tutto #
openSUSE Tumbleweed usa zypper dup. apt full-upgrade rimuove anche pacchetti, se necessario per completare l'aggiornamento.
apt update && apt upgrade
dnf upgrade
pacman -Syu
zypper update
Installare un pacchetto #
apt install nginx
dnf install nginx
pacman -S nginx
zypper install nginx
Installare un file di pacchetto scaricato #
Il ./ dice ad apt che si tratta di un file e non del nome di un pacchetto, così le dipendenze vengono risolte (dpkg -i non lo fa).
apt install ./app.deb
dnf install ./app.rpm
pacman -U app.pkg.tar.zst
zypper install ./app.rpm
Rimuovere un pacchetto #
apt remove nginx
dnf remove nginx
pacman -R nginx
zypper remove nginx
Rimuovere con i file di configurazione / le dipendenze inutilizzate #
apt purge nginx && apt autoremove
dnf remove nginx && dnf autoremove
pacman -Rns nginx
zypper remove --clean-deps nginx
Mostrare i dettagli di un pacchetto #
apt show nginx
dnf info nginx
pacman -Si nginx (installed: -Qi)
zypper info nginx
Elencare i pacchetti installati #
apt list --installed
dnf list --installed
pacman -Q
zypper search --installed-only
Elencare gli aggiornamenti disponibili #
apt list --upgradable
dnf check-update
checkupdates (pacman-contrib)
zypper list-updates
Quale pacchetto possiede un file #
Per i file non ancora installati: dnf provides /percorso, apt-file search percorso (richiede apt-file), pacman -F percorso.
dpkg -S /usr/bin/curl
rpm -qf /usr/bin/curl
pacman -Qo /usr/bin/curl
rpm -qf /usr/bin/curl
Elencare i file installati da un pacchetto #
dpkg -L nginx
rpm -ql nginx
pacman -Ql nginx
rpm -ql nginx
Bloccare un pacchetto alla versione attuale #
Su DNF 4, versionlock richiede il pacchetto del plugin versionlock.
apt-mark hold nginx
dnf versionlock add nginx
IgnorePkg = nginx in /etc/pacman.conf
zypper addlock nginx
Svuotare la cache dei pacchetti #
apt clean
dnf clean all
pacman -Sc
zypper clean

Utenti e gruppi

Chi sei, chi ha effettuato l'accesso e gestione degli account.

whoami / id

Mostrare il tuo nome utente, UID e gruppi

Linux · macOS#
whoami | id [user]
id

uid, gid e tutti i gruppi a cui appartieni

id alice

un altro utente

who / w / last

Vedere chi è connesso e gli accessi recenti

Linux · macOS#
who | w | last [-n N]
w

chi è connesso e cosa sta eseguendo

last -n 10

accessi e riavvii recenti

sudo lastb -n 10

accessi non riusciti recenti (Linux)

useradd

Creare un account utente

Linux#
sudo useradd [-m] [-s shell] [-G groups] user
-m
crea la directory home (non è il comportamento predefinito in tutte le distribuzioni)
-s /bin/bash
shell di login
-G group1,group2
gruppi supplementari
sudo useradd -m -s /bin/bash alice && sudo passwd alice

crea e imposta una password

Su Debian/Ubuntu, adduser alice è l'alternativa interattiva più comoda che configura directory home e password.

usermod -aG

Aggiungere un utente a un gruppo

PericolosoLinux#
sudo usermod -aG group user
sudo usermod -aG docker alice

consenti ad alice di usare docker

sudo usermod -aG sudo alice

amministratore su Debian/Ubuntu (su Fedora/RHEL/Arch il gruppo è wheel)

Attenzione: Senza -a, usermod -G sostituisce tutti i gruppi supplementari dell'utente, il che può togliere l'accesso a sudo. Le modifiche ai gruppi si applicano al login successivo (oppure esegui newgrp docker).

userdel

Eliminare un account utente

PericolosoLinux#
sudo userdel [-r] user
sudo userdel -r olduser

rimuove anche la directory home e la casella di posta locale

Attenzione: -r elimina definitivamente la directory home e i suoi file. Fai prima un backup, oppure blocca l'account (passwd -l).

passwd

Cambiare una password o bloccare un account

Linux#
passwd [user] | passwd -l|-u user
passwd

cambia la tua

sudo passwd alice

reimposta quella di un altro utente

sudo passwd -l alice

blocca l'accesso con password (le chiavi SSH potrebbero ancora funzionare)

groupadd / gpasswd

Creare un gruppo o rimuovere un utente da un gruppo

Linux#
sudo groupadd name | sudo gpasswd -d user group
sudo groupadd developers

nuovo gruppo

sudo gpasswd -d alice developers

rimuove alice dal gruppo

groups / getent

Elencare i membri di un gruppo o i gruppi di un utente

Linux#
groups [user] | getent group name
groups alice

i gruppi di alice

getent group sudo

membri di sudo (funziona anche con LDAP)

getent passwd alice

voce dell'account: UID, home, shell

visudo

Dare a un utente i permessi sudo in modo sicuro

Linux · macOS#
sudo visudo [-f /etc/sudoers.d/file]
sudo visudo -f /etc/sudoers.d/deploy

un file separato per ogni regola

deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp

un comando senza password

visudo controlla la sintassi prima di salvare. Modificare /etc/sudoers con un editor normale e commettere un errore può chiudere fuori tutti da sudo.

chage

Controllare o impostare la scadenza della password

Linux#
sudo chage [-l] [-M days] user
sudo chage -l alice

data dell'ultima modifica e di scadenza

sudo chage -M 90 alice

scadenza ogni 90 giorni

Archivi e compressione

tar, gzip, xz, zip e checksum.

tar -c

Creare un archivio .tar.gz

Linux · macOS#
tar -czf archive.tar.gz files...
-c
crea
-z / -j / -J
compressione gzip / bzip2 / xz
-f file
nome del file di archivio (mettilo subito dopo f)
-v
elenca i file man mano che vengono aggiunti
--exclude='pattern'
esclude dei file
tar -czf site-2026-10-18.tar.gz site/

archivio compresso con gzip di una cartella

tar -cJf logs.tar.xz --exclude='*.tmp' logs/

archivio xz più piccolo, senza i file temporanei

tar -x

Estrarre un .tar.gz, .tar.xz o .tar.bz2

Linux · macOS#
tar -xf archive [-C dir]
-x
estrai
-C dir
estrae in dir (deve esistere)
--strip-components=1
elimina la cartella di primo livello
tar -xf archive.tar.gz

tar di GNU e tar di macOS rilevano da soli la compressione

tar -xzf app.tar.gz -C /opt/app --strip-components=1

in una cartella, senza la directory contenitore

tar -t

Elencare o estrarre un singolo file da un archivio

Linux · macOS#
tar -tf archive | tar -xf archive path/in/archive
tar -tf backup.tar.gz | less

vedi cosa contiene senza estrarre

tar -xf backup.tar.gz etc/nginx/nginx.conf

estrae un file (percorso come mostrato da -t)

tar --zstd

Compressione veloce con zstd

Linux · macOS#
tar --zstd -cf archive.tar.zst files...
tar --zstd -cf data.tar.zst data/

molto più veloce di xz, rapporto simile o migliore rispetto a gzip -9

zstd -d file.zst

decomprime un singolo file

Richiede GNU tar 1.31+ (o un bsdtar recente) e il programma zstd.

gzip / gunzip

Comprimere o decomprimere un singolo file

Linux · macOS#
gzip [-k] [-d] [-9] file
-k
mantiene l'originale
-d
decomprime (come gunzip)
-9
compressione migliore
gzip -k access.log

crea access.log.gz, mantiene l'originale

zcat access.log.gz | grep 404

leggi senza decomprimere su disco

zgrep 500 access.log.*.gz

grep direttamente sui log ruotati

Senza -k, gzip sostituisce il file con la versione .gz.

xz / bzip2

Compressione più alta per file singoli

Linux#
xz [-T0] [-9] [-d] file | bzip2 [-d] file
xz -T0 -k big.sql

tutti i core della CPU, mantiene l'originale

unxz big.sql.xz

decomprime

zip

Creare un file .zip

Linux · macOS#
zip -r archive.zip files... [-x pattern]
zip -r site.zip site/

comprimi una cartella

zip -r site.zip site/ -x '*.git*' '*/node_modules/*'

esclude percorsi

zip -e cifra con il vecchio schema ZipCrypto, che è debole. Per una vera riservatezza usa 7z o gpg.

unzip

Estrarre un file .zip

Linux · macOS#
unzip [-l] [-o] archive.zip [-d dir]
unzip files.zip -d files/

in una cartella

unzip -l files.zip

elenca solo il contenuto

unzip -o files.zip

sovrascrive senza chiedere

7z

Lavorare con archivi .7z (e la maggior parte degli altri)

Linux#
7z a|x|l archive [files]
7z x archive.7z

estrae con i percorsi completi

7z a -p backup.7z docs/

archivio cifrato AES-256 (chiede una password)

7z l archive.rar

elenca il contenuto di molti formati

Pacchetto: p7zip-full / 7zip su Debian/Ubuntu, p7zip o 7zip su Fedora/Arch.

sha256sum

Verificare un download con un checksum

Linux#
sha256sum file | sha256sum -c SUMSFILE
sha256sum ubuntu.iso

confronta con l'hash nella pagina di download

sha256sum -c SHA256SUMS --ignore-missing

controlla tutti i file elencati che hai effettivamente

macOS/BSD: macOS: shasum -a 256 file (e shasum -a 256 -c SUMSFILE).

split

Dividere un file grande in parti e riunirle

Linux · macOS#
split -b size file prefix
split -b 100M backup.tar.gz backup.part.

backup.part.aa, .ab, …

cat backup.part.* > backup.tar.gz

riuniscile

Elaborazione del testo

Tagliare, filtrare, ordinare, contare, trasformare e rimodellare testo e JSON.

sed s///

Trovare e sostituire testo

Linux · macOS#
sed 's/old/new/[g]' file
g
sostituisce ogni corrispondenza sulla riga, non solo la prima
-E
regex estesa (gruppi senza barre rovesciate)
I
corrispondenza senza distinzione tra maiuscole e minuscole (GNU)
sed 's/http:/https:/g' links.txt

stampa il risultato; il file resta invariato

sed 's|/usr/local|/opt|g' paths.txt

qualsiasi delimitatore, comodo per i percorsi

sed -E 's/([0-9]+)px/\1rem/g' style.css

riusa un gruppo catturato

sed -i

Modificare un file sul posto

Linux · macOS#
sed -i[SUFFIX] 's/old/new/g' file
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config

sed di GNU

sed -i.bak 's/foo/bar/g' config.ini

mantiene config.ini.bak; funziona su GNU e macOS

macOS/BSD: sed di macOS richiede un argomento dopo -i: sed -i '' 's/foo/bar/g' file. sed di GNU legge '' come script, quindi l'unica forma che funziona su entrambi è -i.bak.

sed -n / d

Stampare o eliminare righe specifiche

Linux · macOS#
sed -n 'Np' | sed '/regex/d'
sed -n '100,120p' big.log

righe da 100 a 120

sed '/^\s*#/d; /^$/d' app.conf

rimuove commenti e righe vuote (\s di GNU)

sed -n '/BEGIN CERT/,/END CERT/p' bundle.pem

tutto ciò che sta tra due marcatori

awk

Stampare colonne specifiche

Linux · macOS#
awk [-F sep] '{print $N}' file
-F sep
separatore di campo (predefinito: sequenze di spazi/tabulazioni)
$1 … $NF
campi; $NF è l'ultimo, $0 l'intera riga
NR
numero di riga
awk '{print $1}' access.log

prima colonna (IP del client)

awk -F: '{print $1, $7}' /etc/passwd

utente e shell

awk -F, 'NR>1 {print $2}' data.csv

seconda colonna di un CSV, salta l'intestazione (solo CSV semplici: niente virgole tra virgolette)

awk (filter & sum)

Filtrare le righe e sommare una colonna

Linux · macOS#
awk 'condition {action} END {action}' file
awk '$9 >= 500' access.log

righe in cui il campo 9 (stato) è 5xx

awk '{s += $2} END {print s}' sales.txt

somma della colonna 2

awk '{c[$1]++} END {for (k in c) print c[k], k}' access.log | sort -rn | head

conteggio per valore, primi 10

cut

Tagliare campi con un delimitatore di un solo carattere

Linux · macOS#
cut -d DELIM -f LIST | cut -c RANGE
cut -d, -f1,3 data.csv

colonne 1 e 3

cut -d: -f1 /etc/passwd

tutti i nomi utente

cut -c1-10 file

primi 10 caratteri di ogni riga

cut considera ogni delimitatore come separatore di campo, quindi due spazi significano un campo vuoto. Per un output allineato con spazi usa awk.

sort

Ordinare le righe

Linux · macOS#
sort [-n] [-r] [-h] [-k N,N] [-t sep] [-u] file
-n
numerico
-r
inverso
-h
dimensioni leggibili: 2K < 1M < 3G
-k 2,2
ordina solo per il campo 2
-t ,
separatore di campo
-u
elimina i duplicati
-V
ordine di versione: 1.9 < 1.10
du -sh * | sort -h

cartelle per dimensione

sort -t, -k3,3nr data.csv

CSV per colonna 3, numerico, decrescente

sort -u emails.txt > unique.txt

ordinate e senza duplicati

uniq

Contare o rimuovere le righe duplicate

Linux · macOS#
sort file | uniq [-c] [-d] [-u]
-c
antepone a ogni riga il suo conteggio
-d
solo le righe che si ripetono
-u
solo le righe che compaiono una volta
sort ips.txt | uniq -c | sort -rn | head

le 10 righe più frequenti

uniq comprime solo i duplicati adiacenti, quindi ordina prima.

wc

Contare righe, parole o byte

Linux · macOS#
wc [-l] [-w] [-c] [-m] file...
wc -l access.log

numero di righe

ls | wc -l

quante voci ci sono in questa cartella

grep -c '' file

conteggio delle righe che include un'ultima riga senza a capo

tr

Convertire o eliminare caratteri

Linux · macOS#
tr [-d] [-s] 'set1' ['set2']
tr 'a-z' 'A-Z' < in.txt

maiuscolo

tr -d '\r' < windows.txt > unix.txt

rimuove i fine riga CRLF di Windows

tr -s ' ' < file

comprime gli spazi ripetuti

tr '\n' ',' < list.txt

unisce le righe con virgole

tr legge solo lo standard input, quindi reindirizza il file con <.

xargs

Trasformare le righe di input in argomenti di un comando

Linux · macOS#
command | xargs [-0] [-n N] [-P N] [-I {}] cmd
-0
l'input è separato da NUL (da abbinare a find -print0); sicuro con gli spazi
-n N
al massimo N argomenti per comando
-P N
esegue N comandi in parallelo
-I {}
sostituisce {} con ogni riga di input
-r
non esegue il comando se l'input è vuoto (GNU)
find . -name '*.log' -print0 | xargs -0 rm -f

elimina in sicurezza i file trovati

cat urls.txt | xargs -n 1 -P 4 curl -sO

scarica 4 alla volta

ls *.png | xargs -I {} cp {} /backup/{}

un comando per elemento

macOS/BSD: xargs di GNU esegue il comando una volta anche con input vuoto a meno che tu non usi -r; xargs di macOS salta l'input vuoto per impostazione predefinita e accetta -r per compatibilità.

jq

Leggere e filtrare JSON

Linux · macOS#
jq [-r] 'filter' file
.
formattazione leggibile
-r
stringhe grezze, senza virgolette
-c
compatto, una riga per risultato
.[]
itera su un array
select(cond)
mantiene gli elementi corrispondenti
jq . response.json

formattazione leggibile

jq -r '.items[].name' data.json

un nome per riga

jq -r '.[] | select(.active) | .email' users.json

filtra, poi scegli un campo

curl -s https://api.github.com/repos/jqlang/jq | jq '.stargazers_count'

direttamente da un'API

Installalo con apt/dnf install jq. È incluso nelle versioni recenti di macOS.

paste

Unire righe o affiancare file

Linux · macOS#
paste [-s] [-d delim] file...
paste -sd, ids.txt

tutte le righe unite con virgole

paste names.txt emails.txt

due file come due colonne

comm

Righe comuni a due elenchi (o presenti in uno solo)

Linux · macOS#
comm [-1] [-2] [-3] sorted1 sorted2
comm -12 <(sort a.txt) <(sort b.txt)

in entrambi

comm -23 <(sort a.txt) <(sort b.txt)

solo in a.txt

seq

Generare una sequenza di numeri

Linux · macOS#
seq [first [step]] last
seq 1 5

da 1 a 5, uno per riga

seq -w 1 10

con zeri iniziali: 01 … 10

for i in $(seq 1 3); do echo "run $i"; done

contatore di un ciclo

base64

Codificare o decodificare Base64

Linux · macOS#
base64 [-d] [-w 0] [file]
printf '%s' 'user:pass' | base64

codifica (printf evita un a capo finale)

echo dXNlcjpwYXNz | base64 -d

decodifica

base64 -w 0 image.png > image.b64

senza andare a capo (GNU va a capo ogni 76 caratteri)

macOS/BSD: base64 di macOS non va a capo per impostazione predefinita e non ha -w. Usa -d per decodificare (le versioni meno recenti di macOS usavano -D).

iconv

Convertire la codifica del testo (es. in UTF-8)

Linux · macOS#
iconv -f FROM -t TO file
iconv -f WINDOWS-1252 -t UTF-8 old.csv > new.csv

corregge i caratteri illeggibili delle esportazioni da Excel

iconv -l

elenca le codifiche supportate

shuf

Mescolare le righe o sceglierne alcune a caso

Linux#
shuf [-n N] file
shuf -n 1 names.txt

una riga casuale

shuf -i 1-100 -n 5

cinque numeri casuali da 1 a 100

Servizi e log

Servizi systemd: avviarli, fermarli, abilitarli all'avvio e leggerne i log con journalctl.

systemctl status

Verificare se un servizio è in esecuzione

Linux#
systemctl status|is-active|is-enabled unit
systemctl status nginx

stato, PID, memoria e ultime righe di log

systemctl is-active --quiet nginx && echo up

per gli script

systemctl start

Avviare, fermare, riavviare o ricaricare un servizio

Linux#
sudo systemctl start|stop|restart|reload unit
sudo systemctl restart nginx

riavvio completo

sudo systemctl reload nginx

rilegge la configurazione senza interrompere le connessioni (se il servizio lo supporta)

Quando possibile verifica la configurazione prima di riavviare, es. sudo nginx -t, così un errore di battitura non manda giù il sito.

systemctl enable

Avviare un servizio all'avvio del sistema (o impedirlo)

Linux#
sudo systemctl enable|disable [--now] unit
sudo systemctl enable --now docker

abilita all'avvio e avvia subito

sudo systemctl disable --now cups

ferma subito e all'avvio

sudo systemctl mask bluetooth

impedisce del tutto che venga avviato (unmask per annullare)

systemctl list-units

Elencare i servizi in esecuzione e quelli non riusciti

Linux#
systemctl list-units [--type=service] [--state=…] | systemctl --failed
systemctl --failed

cosa si è rotto

systemctl list-units --type=service --state=running

cosa è in esecuzione

systemctl list-unit-files --state=enabled

cosa si avvia all'accensione

systemctl edit

Modificare la unit di un servizio (e ricaricare systemd)

Linux#
sudo systemctl edit unit | sudo systemctl daemon-reload
sudo systemctl edit nginx

override drop-in che sopravvive agli aggiornamenti dei pacchetti

systemctl cat nginx

la unit più tutti gli override

sudo systemctl daemon-reload

necessario dopo aver modificato a mano i file delle unit

.service file

Eseguire la propria app come servizio

Linux#
/etc/systemd/system/<name>.service
[Unit]
Description=My app
After=network.target

[Service]
User=app
WorkingDirectory=/srv/app
ExecStart=/srv/app/bin/server
Restart=on-failure

[Install]
WantedBy=multi-user.target

poi: sudo systemctl daemon-reload && sudo systemctl enable --now myapp

journalctl

Leggere i log dei servizi e del sistema

Linux#
journalctl [-u unit] [-f] [-n N] [--since …] [-p level] [-b]
-u unit
un servizio
-f
segue
-n N
ultime N righe
--since '1 hour ago'
anche: today, yesterday, 2026-10-18 09:00
-p err
priorità err e superiori
-b / -b -1
avvio attuale / avvio precedente
-e
salta alla fine
journalctl -u nginx -f

segue un servizio

journalctl -u myapp --since '10 min ago'

finestra recente

journalctl -b -1 -p err

errori dell'avvio prima del crash

journalctl --vacuum

Ridurre il journal di systemd

Linux#
journalctl --disk-usage | sudo journalctl --vacuum-size=SIZE | --vacuum-time=TIME
journalctl --disk-usage

quanto spazio occupano i log

sudo journalctl --vacuum-size=500M

conserva al massimo 500 MB di log archiviati

sudo journalctl --vacuum-time=14d

elimina i log archiviati più vecchi di due settimane

Per un limite permanente imposta SystemMaxUse= in /etc/systemd/journald.conf.

/var/log

Trovare i file di log classici

Linux#
sudo tail -f /var/log/<file>
sudo tail -f /var/log/syslog

log generale su Debian/Ubuntu (/var/log/messages su Fedora/RHEL)

sudo tail -f /var/log/auth.log

accessi e sudo su Debian/Ubuntu (/var/log/secure su RHEL)

Alcune distribuzioni (Fedora, Arch) conservano i log solo nel journal, a meno che non sia installato rsyslog.

shutdown / reboot

Riavviare o spegnere

Linux#
sudo shutdown -r|-h [now|+min|hh:mm] [message] | sudo reboot
sudo reboot

riavvia subito

sudo shutdown -r +10 'Kernel update'

riavvia tra 10 minuti, avvisando gli utenti connessi

sudo shutdown -c

annulla uno spegnimento programmato

sudo shutdown -h now

spegni

Pianificazione: cron, at, timer

Eseguire comandi secondo una pianificazione o una sola volta più tardi.

cron syntax

Scrivere una riga di pianificazione cron

Linux · macOS#
minute hour day-of-month month day-of-week command
30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

ogni giorno alle 02:30, conservando l'output

*/15 * * * * /usr/local/bin/check.sh

ogni 15 minuti

0 9 * * 1-5 /usr/local/bin/report.sh

alle 09:00 dal lunedì al venerdì

@reboot /usr/local/bin/startup.sh

una volta all'avvio

Cron gira con un PATH minimo e senza il profilo della shell: usa percorsi assoluti. Un % nel comando va scritto come \%.

crontab -r

Rimuovere il crontab (attenzione)

PericolosoLinux · macOS#
crontab -r
crontab -l > ~/crontab.bak && crontab -r

fai un backup prima di rimuovere

crontab ~/crontab.bak

ripristina da un file

Attenzione: Elimina tutti i tuoi job cron senza chiedere conferma, e r è proprio accanto a e sulla tastiera. Alcune implementazioni di cron offrono -i per chiedere prima (crontab -ri).

/etc/cron.d

Job cron di sistema

Linux#
/etc/crontab, /etc/cron.d/*, /etc/cron.{hourly,daily,weekly,monthly}/
0 3 * * * root /usr/local/bin/cleanup.sh

riga in /etc/cron.d/cleanup: nota il campo utente in più

ls /etc/cron.daily/

script eseguiti una volta al giorno da run-parts

Su Debian e Ubuntu i file in /etc/cron.d il cui nome contiene un punto vengono ignorati, quindi chiamalo backup, non backup.cron.

at

Eseguire un comando una sola volta più tardi

Linux#
at TIME | atq | atrm N
echo 'systemctl restart myapp' | sudo at 02:00

stanotte alle 2

echo './report.sh' | at now + 30 minutes

tra mezz'ora

atq

job in attesa

atrm 3

annulla il job 3

Richiede il pacchetto at e il servizio atd in esecuzione.

systemd timers

Pianificare con i timer di systemd invece che con cron

Linux#
systemctl list-timers | <name>.timer with OnCalendar=
systemctl list-timers

tutti i timer e quando scatteranno

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true

[Install]
WantedBy=timers.target

backup.timer accanto a backup.service; Persistent recupera le esecuzioni perse dopo un periodo di inattività

systemd-analyze calendar 'Mon..Fri 09:00'

verifica il significato di un'espressione OnCalendar

sleep

Attendere prima del comando successivo

Linux · macOS#
sleep N[s|m|h|d]
sleep 5 && curl -s localhost:8080/health

dà a un servizio il tempo di avviarsi

sleep 2m

i suffissi funzionano su GNU e sulle versioni attuali di macOS

Basi della shell (bash)

Pipe, reindirizzamenti, glob, variabili, cronologia e i tasti che fanno risparmiare più tempo. macOS usa zsh per impostazione predefinita: quasi tutto funziona anche lì, tranne shopt, help e le funzionalità di bash 4 (macOS include bash 3.2).

|

Passare l'output di un comando a un altro

Linux · macOS#
command1 | command2
ps aux | grep nginx

filtra un elenco

history | grep 'docker run'

trova un comando eseguito in precedenza

set -o pipefail

negli script: una pipeline fallisce se fallisce una qualsiasi parte, non solo l'ultima

> and >>

Salvare l'output in un file (sovrascrivendo o aggiungendo)

Linux · macOS#
command > file | command >> file
ls -l > listing.txt

sovrascrive (crea il file)

echo 'done' >> progress.log

aggiunge in fondo

set -o noclobber

fa sì che > si rifiuti di sovrascrivere file esistenti (>| forza)

La shell svuota il file prima che il comando venga eseguito, quindi sort file > file ti lascia un file vuoto. Scrivi su un nuovo nome, poi usa mv.

2> and 2>&1

Reindirizzare gli errori, o errori e output insieme

Linux · macOS#
command 2> err.log | command > all.log 2>&1 | command &> all.log
find / -name x 2>/dev/null

scarta i messaggi di errore

./build.sh > build.log 2>&1

output ed errori in un unico file (l'ordine conta: prima >, poi 2>&1)

./build.sh &> build.log

la forma abbreviata di bash per la stessa cosa

<, <<EOF, <<<

Fornire input da un file, un blocco di testo o una stringa

Linux · macOS#
command < file | command <<'EOF' … EOF | command <<< "string"
mysql mydb < dump.sql

file come input

cat > config.yml <<'EOF'
port: 8080
host: $HOST stays literal
EOF

mettere 'EOF' tra virgolette impedisce l'espansione delle $variabili

grep -c a <<< "banana"

here-string

&& || ;

Eseguire comandi uno dopo l'altro, in modo condizionale

Linux · macOS#
a && b | a || b | a ; b
make && sudo make install

installa solo se la build è riuscita

cd /srv/app || exit 1

interrompe uno script se cd fallisce

(cd frontend && npm run build)

parentesi: una subshell, quindi la tua directory non cambia

$( ) $(( )) <( )

Usare l'output di un comando o fare calcoli

Linux · macOS#
$(command) | $((expression)) | <(command)
echo "Today is $(date +%A)"

sostituzione di comando

echo $(( 1024 * 4 ))

aritmetica intera

diff <(ls dir1) <(ls dir2)

process substitution: l'output come file temporaneo

I backtick `comando` sono la vecchia forma di $(comando); $( ) si può annidare ed è più leggibile.

* ? [ ] { }

Selezionare molti file con i caratteri jolly

Linux · macOS#
* any string | ? one char | [abc] one of | {a,b} each word
ls *.jpg

tutti i JPG di questa cartella

rm photo-??.png

photo-01.png … photo-99.png

cp config.{yml,yml.bak}

espansione delle graffe: cp config.yml config.yml.bak

shopt -s globstar; ls **/*.md

** corrisponde a qualsiasi profondità (bash 4+)

Per impostazione predefinita i glob non includono i dotfile (shopt -s dotglob lo cambia). Se non c'è corrispondenza, bash passa il pattern letteralmente, a meno che non sia impostato shopt -s nullglob.

' ' vs " "

Mettere correttamente tra virgolette stringhe e variabili

Linux · macOS#
'literal' | "expands $var and $(cmd)" | \ escapes one character
echo 'Cost: $5'

virgolette singole: non si espande nulla

echo "Home is $HOME"

virgolette doppie: le variabili si espandono, gli spazi vengono mantenuti

cp "$file" "$dest/"

metti sempre tra virgolette le variabili che contengono percorsi: gli spazi rompono quelle senza virgolette

VAR=value

Impostare e usare variabili di shell

Linux · macOS#
name=value (no spaces around =) | "$name" | "${name}"
name="Ada"; echo "Hi $name"

imposta e usa

echo "${PORT:-8080}"

valore predefinito se non impostata o vuota

file=report.tar.gz; echo "${file%%.*}" "${file##*/}"

rimuove l'estensione / rimuove la directory

echo "${#name}"

lunghezza della stringa

export

Impostare variabili d'ambiente

Linux · macOS#
export NAME=value | NAME=value command | unset NAME
export NODE_ENV=production

visibile a tutti i programmi avviati da questa shell

DEBUG=1 ./app

solo per quel comando

printenv | sort

le elenca

unset DEBUG

rimuove

Si perdono quando la shell termina. Metti gli export in ~/.bashrc (shell interattive) o ~/.profile (shell di login) per conservarle.

$PATH

Aggiungere una cartella al PATH

Linux · macOS#
export PATH="dir:$PATH"
echo "$PATH" | tr : '\n'

una voce per riga

export PATH="$HOME/.local/bin:$PATH"

antepone la tua cartella bin (aggiungilo a ~/.bashrc)

hash -r

dimentica le posizioni dei comandi in cache dopo aver spostato dei binari

alias / source

Creare scorciatoie e ricaricare la configurazione della shell

Linux · macOS#
alias name='command' | source file
alias ll='ls -alF'

aggiungilo a ~/.bashrc per mantenerlo

source ~/.bashrc

applica le modifiche senza aprire un nuovo terminale (come . ~/.bashrc)

\ls

esegue il vero ls, aggirando un alias

$?

Verificare se l'ultimo comando è riuscito

Linux · macOS#
echo $? (0 = success)
grep -q root /etc/passwd; echo $?

0 trovato, 1 non trovato, 2 errore

set -euo pipefail

all'inizio di uno script: si ferma su errori, variabili non impostate e pipe fallite

history, !!

Riutilizzare comandi precedenti

Linux · macOS#
history | !! | !$ | !N | !prefix | ^old^new
sudo !!

riesegue l'ultimo comando con sudo

cd !$

usa l'ultimo argomento del comando precedente

!42

riesegue la riga 42 della cronologia

^foo^bar

riesegue l'ultimo comando sostituendo foo con bar

Con HISTCONTROL=ignorespace (predefinito su Ubuntu come parte di ignoreboth), un comando digitato con uno spazio iniziale non viene salvato: utile per i comandi con dati segreti.

Ctrl+R, Ctrl+A …

Scorciatoie da tastiera del terminale (bash/readline)

Linux · macOS#
Emacs-style readline keys (the default)
Ctrl+R
cerca a ritroso nella cronologia; premi di nuovo per corrispondenze più vecchie
Ctrl+A / Ctrl+E
inizio / fine riga
Ctrl+U / Ctrl+K
taglia fino all'inizio / alla fine della riga
Ctrl+W
taglia la parola precedente
Ctrl+Y
incolla ciò che hai tagliato
Alt+B / Alt+F
indietro / avanti di una parola
Alt+.
inserisce l'ultimo argomento del comando precedente
Ctrl+L
pulisce lo schermo
Ctrl+C
annulla il comando in esecuzione
Ctrl+D
fine dell'input; su una riga vuota chiude la shell
Tab Tab
mostra i completamenti
bind -P | less

elenca tutte le combinazioni di tasti

man / --help

Ottenere aiuto su qualsiasi comando

Linux · macOS#
man [section] cmd | cmd --help | help builtin | apropos word
man rsync

manuale completo; / per cercare, q per uscire

man 5 crontab

sezione 5: il formato del file, non il comando

help cd

i comandi integrati di bash non hanno una pagina man propria

apropos partition

quali comandi citano una parola

#!/usr/bin/env bash

Scrivere ed eseguire uno script di shell

Linux · macOS#
#!/usr/bin/env bash, chmod +x, ./script.sh
#!/usr/bin/env bash
set -euo pipefail
name="${1:-world}"
if [[ -f "$name.txt" ]]; then
  echo "found $name.txt"
fi
for f in *.log; do
  echo "$f"
done

argomenti, un test, un ciclo

chmod +x script.sh && ./script.sh Ada

rendilo eseguibile ed eseguilo

bash -x script.sh

traccia ogni riga mentre viene eseguita

$1 … $9 sono gli argomenti, "$@" sono tutti, $# è quanti sono. [[ ]] è di bash; negli script POSIX sh usa [ ].

clear / reset

Pulire o riparare un terminale illeggibile

Linux · macOS#
clear | reset
reset

dopo che un cat di un file binario ha lasciato il terminale a stampare caratteri strani

Un riferimento statico che funziona nel browser; le tue ricerche non vengono inviate da nessuna parte. Sfoglia tutti gli strumenti gratuiti.

Hai trovato un problema o qualcosa che potrebbe andare meglio? Leggiamo ogni messaggio e sistemiamo le cose in fretta.

Questa guida rapida ai comandi Linux raggruppa più di 200 comandi in base a ciò che devi fare: spostarti e gestire file, permessi, processi, spazio su disco, rete, pacchetti, utenti, archivi, ricerca, elaborazione del testo, servizi e log di systemd, cron e le basi di bash che tengono insieme il tutto. Ogni voce riporta la sintassi, le opzioni che userai davvero con una spiegazione di una riga, esempi da copiare e, dove serve, un avviso. Cerca per attività ("spazio libero su disco", "cosa usa la porta 8080") o per nome del comando, e collegati direttamente a qualsiasi voce.

Le opzioni seguono i manuali di GNU coreutils, util-linux, procps-ng, iproute2, systemd e bash, cioè ciò che distribuiscono Ubuntu, Debian, Fedora, RHEL, Arch e openSUSE. Dove macOS si comporta diversamente, una nota blu spiega come, perché sed -i, date -d, stat -c e xargs sono i classici punti in cui uno script scritto su un sistema si rompe sull'altro. È un riferimento per il 90% dei casi comuni, non un sostituto delle pagine man: per le opzioni usate di rado, man <comando> resta il riferimento.

Come si usa

  1. Digita un'attività o un comando nella casella di ricerca (premi / per raggiungerla). Tutte le parole devono corrispondere, quindi "tar extract" restringe alle voci di tar.
  2. Usa le etichette delle sezioni per passare a un argomento come Rete o Pacchetti, oppure spunta "Solo pericolosi" per vedere tutti i comandi che possono distruggere dati o chiuderti fuori dal sistema.
  3. Fai clic su Copia accanto a un esempio, poi sostituisci i nomi di file e host di esempio con i tuoi.
  4. Fai clic sul # accanto a una voce per ottenere un link diretto, ad esempio /tools/linux-commands-cheat-sheet#rsync.
  5. Usa Stampa / Salva come PDF per una copia compatta a due colonne senza la navigazione del sito.

Domande frequenti

Quali sono i comandi Linux di base da imparare per primi?

Inizia con navigazione e file: pwd, ls, cd, mkdir, cp, mv, rm, cat e less. Poi man (aiuto), sudo, grep e find per la ricerca, chmod e chown per i permessi, ps, top e kill per i processi, df e du per lo spazio su disco, e ssh e scp per le macchine remote. Impara presto le pipe (|) e la redirezione (> e >>), perché ti permettono di combinare tutto il resto.

Come controllo lo spazio su disco in Linux?

Esegui df -h per vedere lo spazio libero su ogni filesystem montato, in unità leggibili. Per scoprire cosa occupa lo spazio, esegui du -h -d 1 | sort -h all'interno di una directory: elenca le sottocartelle con le più grandi in fondo. Se df dice che il disco è pieno ma du non trova nulla, probabilmente un file eliminato è ancora tenuto aperto da un processo; sudo lsof +L1 li elenca.

Come trovo quale processo sta usando una porta?

Esegui sudo ss -tulpn per elencare tutte le porte TCP e UDP in ascolto con il programma che le possiede, oppure sudo lsof -i :8080 per una singola porta. Il sudo è importante: senza vedi solo i nomi dei tuoi processi. ss ha sostituito netstat, che funziona ancora sui sistemi in cui è installato il pacchetto net-tools.

Qual è la differenza tra kill e kill -9?

kill PID invia SIGTERM, che chiede al processo di terminare e gli lascia fare pulizia: scrivere i file, rilasciare i lock, chiudere le connessioni. kill -9 PID invia SIGKILL, che il kernel applica immediatamente e che il processo non può intercettare né ignorare, quindi non avviene alcuna pulizia. Usa prima il semplice kill, aspetta qualche secondo e tieni -9 per i processi che lo ignorano.

Perché sed -i non funziona su Mac?

macOS include il sed di BSD, in cui -i richiede come argomento un'estensione per il backup. Su macOS scrivi sed -i '' 's/old/new/g' file; su Linux con GNU sed lo stesso comando fallisce perché interpreta '' come script. La forma che funziona su entrambi è sed -i.bak 's/old/new/g' file, che conserva una copia di backup da eliminare in seguito.

Questi comandi sono uguali su tutte le distribuzioni Linux?

Quasi tutti: gli strumenti di base provengono ovunque dagli stessi progetti GNU e util-linux. Cambiano il gestore di pacchetti (apt su Debian e Ubuntu, dnf su Fedora e RHEL, pacman su Arch, zypper su openSUSE, messi a confronto nella tabella Pacchetti), alcuni percorsi dei file di log, il gruppo degli amministratori (sudo o wheel) e il front-end del firewall (ufw o firewalld). Alpine e i sistemi basati su BusyBox usano versioni ridotte degli strumenti con meno opzioni.

I comandi che possono distruggere un sistema, e l'abitudine che lo evita

Una breve lista di comandi causa quasi tutti i danni: rm -rf con un percorso sbagliato o vuoto, dd o mkfs puntati sul disco sbagliato, chmod -R 777 o chown -R su una directory di sistema, rsync --delete o mirror in stile robocopy con origine e destinazione invertite, crontab -r invece di crontab -e, usermod -G senza -a e find con -delete nella posizione sbagliata. Ognuno è contrassegnato come Pericoloso nella guida, con il modo specifico in cui può andare storto.

L'abitudine che previene la maggior parte dei danni è eseguire prima la versione innocua. Prima di rm -rf, esegui ls sullo stesso percorso. Prima di find … -delete, esegui lo stesso find con -print. Prima di rsync --delete, aggiungi -n per una prova a vuoto. Prima di dd o mkfs, esegui lsblk e leggi due volte il nome del dispositivo. Negli script, scrivi ${DIR:?} invece di $DIR, così una variabile vuota interrompe lo script invece di trasformare un percorso in /.

Aiutano anche due impostazioni della shell: set -euo pipefail all'inizio degli script si ferma al primo errore invece di proseguire in uno stato errato, e set -o noclobber fa sì che > si rifiuti di sovrascrivere un file esistente.

GNU e macOS (BSD): dove lo stesso comando si comporta diversamente

macOS è Unix, ma i suoi strumenti da riga di comando derivano da FreeBSD e non da GNU, e le differenze emergono proprio quando copi un comando da un tutorial per Linux:

• sed -i richiede un argomento su macOS (sed -i '' …); -i.bak funziona su entrambi.

• date non ha -d su macOS; usa date -r <epoch> per convertire un timestamp e date -v-2d per le date relative.

• stat usa -f con lettere di formato diverse invece del -c di GNU.

• xargs su macOS salta per impostazione predefinita l'input vuoto, mentre GNU xargs esegue comunque il comando una volta a meno che non riceva -r.

• du accetta -d 1 su entrambi, ma solo GNU accetta --max-depth; ps non ha --sort su macOS (usa ps aux -m o -r).

• head -n -5, tac, free, ip, ss, timeout e watch mancano nel macOS di serie.

Se ti serve il comportamento GNU su un Mac, i pacchetti coreutils, gnu-sed e findutils di Homebrew installano le versioni GNU con il prefisso g (gsed, gdate, gstat, gxargs).

Leggere i permessi e scegliere il chmod giusto

ls -l mostra i permessi come dieci caratteri, ad esempio -rwxr-x---. Il primo è il tipo (- file, d directory, l link); i successivi nove sono tre gruppi di lettura, scrittura ed esecuzione per il proprietario, il gruppo e tutti gli altri. In numeri, r vale 4, w vale 2 e x vale 1, sommati per gruppo, quindi rwxr-x--- è 750.

Modalità tipiche: 644 per i file normali, 755 per directory e script, 600 per chiavi private e file con segreti, 700 per una directory privata come ~/.ssh. Su una directory, x significa "si può entrare", ed è per questo che le directory ne hanno bisogno e i semplici file no. Il calcolatore chmod converte tra la forma simbolica e quella ottale se vuoi verificare una modalità prima di applicarla.

Strumenti gratuiti correlati

  • CMD vs PowerShell vs Bash — La stessa operazione nel Prompt dei comandi, in PowerShell e in bash, fianco a fianco: file, grep, variabili d'ambiente, processi, rete, servizi e scripting.
  • Calcolatore chmod — Seleziona le caselle di lettura, scrittura ed esecuzione per ottenere il modo ottale e il comando chmod, oppure decodifica 755, 644 e rwxr-xr-x.
  • Generatore di espressioni cron — Crea una pianificazione cron con i menu a tendina o incollane una, leggila in parole semplici e vedi le prossime 10 esecuzioni nel tuo fuso orario e in UTC. Gratis, nel browser.
  • Calcolatore di subnet — Rete, broadcast, intervallo di host e maschera per qualsiasi CIDR; suddividi reti con VLSM, espandi indirizzi IPv6 e trova intervalli sovrapposti.
  • Guida rapida Git — Comandi Git organizzati per ciò che vuoi fare: annullare l'ultimo commit, rinominare un branch, eliminare un branch remoto. I moderni switch/restore con gli equivalenti classici e badge di pericolo.