- -P
- stampa il percorso fisico con i collegamenti simbolici risolti
- -L
- stampa il percorso logico, mantenendo i collegamenti simbolici (predefinito)
pwddove mi trovo?
pwd -Pil percorso reale quando sei arrivato tramite un collegamento simbolico
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.
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.
Leggere file, scorrere log, modificare nel terminale e confrontare versioni.
cat /etc/os-releasestampa un file
cat part1.txt part2.txt > whole.txtconcatena
cat -A script.sh | headindividua tabulazioni nascoste e fine riga ^M di Windows
macOS/BSD: cat di macOS non ha -A; usa cat -vet per la stessa vista.
tac access.log | headle righe di log più recenti per prime
macOS/BSD: Non disponibile su macOS; usa tail -r file.
less /var/log/syslogleggere un log
journalctl -u nginx | less -Srighe larghe senza andare a capo
head -n 20 data.csvintestazione e prime righe
head -c 512 file.bin | xxddai un'occhiata all'inizio di un binario
macOS/BSD: head di macOS non accetta valori negativi.
tail -n 50 app.logultime 50 righe
tail -F /var/log/nginx/access.logosserva un log soggetto a rotazione
tail -n +2 data.csvsalta la riga di intestazione di un CSV
sudo nano /etc/hostsmodifica un file di sistema
La barra in fondo allo schermo mostra i tasti; ^ significa Ctrl e M- significa Alt.
vim +42 app.pyapri alla riga 42
diff -u old.conf new.confvista 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
make 2>&1 | tee build.logsegui una build e conserva un log
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.confaggiunge a un file di root (sudo echo >> non funziona perché il reindirizzamento lo fa la shell)
printf '%s\n' "$var"stampa una variabile in sicurezza, anche se inizia con -n
printf '%-12s %6.2f\n' disk 93.5colonne allineate
echo -e ed echo -n si comportano diversamente da una shell all'altra; printf si comporta allo stesso modo ovunque.
column -t -s, data.csv | less -Sleggere un CSV semplice come tabella
mount | column -tallinea un output separato da spazi
xxd image.png | headesadecimale e ASCII affiancati
hexdump -C file.bin | headdump esadecimale canonico
xxd fa parte dei pacchetti di vim; hexdump è in util-linux (bsdextrautils nelle versioni più recenti di Debian/Ubuntu).
strings -n 8 firmware.bin | lesstrova stringhe di versione, URL, percorsi
Su Linux fa parte di binutils.
Leggere e modificare chi può leggere, scrivere ed eseguire un 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 644 index.htmlproprietario lettura/scrittura, tutti lettura: file normali
chmod 755 deploy.shproprietario tutto, gli altri lettura/esecuzione: script e directory
chmod 600 ~/.ssh/id_ed25519chiave privata leggibile solo da te; ssh rifiuta chiavi con permessi più larghi
chmod +x script.shrende eseguibile uno script
chmod go-w filetoglie 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à
Crea modalità simboliche e ottali con il calcolatore chmod →
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.
sudo chown -R www-data:www-data /var/www/siteassegna una web root all'utente del server web
sudo chown "$USER": file.txtprendi 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 -R developers /srv/sharedassegna una cartella condivisa al gruppo di un team
umaskmostra la maschera attuale, di solito 0022
umask 077nuovi 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 systemctl restart nginxun comando da amministratore
sudo !!riesegue il comando precedente con sudo
sudo -u postgres psqlesegue come utente di servizio
su - deployaccedi come deploy con il suo ambiente
sudo su -shell di root quando root non ha password (sudo -i fa lo stesso)
setfacl -m u:alice:rw report.xlsxalice può leggere e scrivere, senza cambiare gruppo
getfacl report.xlsxmostra tutte le voci
setfacl -R -m g:devs:rwX /srv/appun gruppo ottiene accesso a un intero albero
Un + alla fine della stringa di permessi di ls -l indica che il file ha una ACL.
sudo chattr +i /etc/resolv.confnessuno, nemmeno root, può modificarlo o eliminarlo finché non togli -i
lsattr /etc/resolv.confmostra gli attributi; i significa immutabile
Supportato su ext4, XFS, Btrfs. Se compare "Operation not permitted" anche da root, controlla lsattr.
Trovare cosa è in esecuzione, fermarlo ed eseguire cose in background.
ps aux | grep [n]ginxil trucco [n] esclude grep stesso dai risultati
ps aux --sort=-%mem | headi processi che usano più memoria
ps -o pid,ppid,etime,cmd -p 1234da 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 -pcon i PID
pstree -p 1234cosa ha generato un processo
top -b -n 1 | head -20istantanea da incollare in un ticket
macOS/BSD: top di macOS è un programma diverso: ordina con top -o cpu o top -o mem.
htop -u www-datasolo i processi di un utente
Installalo con apt install htop / dnf install htop.
pgrep -a nginxPID 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 -f "node server.js"ferma una singola app Node
pkill -HUP nginxinvia un segnale di ricaricamento
pgrep -af nodecontrolla 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 1234arresto gentile
kill -9 1234ultima risorsa quando TERM viene ignorato
kill %1termina 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 firefoxtutti i processi di Firefox
Su Linux fa parte del pacchetto psmisc.
jobselenca i job di questa shell con i loro numeri
bg %1riprende il job 1 in background
fg %1lo riporta in primo piano
Ctrl+Z sospende il programma in primo piano (si ferma finché non usi bg o fg).
./long-export.sh > export.log 2>&1 &avvialo e riottieni il prompt
waitin uno script, attende la fine dei job in background
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 -h %1hai dimenticato nohup: mettilo in background con bg, poi usa disown
tmux new -s deployavvia una sessione con nome
tmux attach -t deployricollegati 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 -n 19 tar -czf backup.tgz /databackup che non disturba gli altri processi
sudo renice -n -5 -p 1234aumenta la priorità di un processo in esecuzione
La niceness va da -20 (priorità massima) a 19 (minima). Solo root può scendere sotto 0.
timeout 30s curl -s https://example.com/healthrinuncia dopo 30 secondi
timeout -s KILL 5m ./job.shterminazione forzata dopo cinque minuti
Esce con stato 124 quando viene raggiunto il limite di tempo.
watch -n 2 df -hosserva lo spazio su disco che si riempie
watch -d 'ss -s'-d evidenzia cosa è cambiato
sudo lsof -i :8080cosa è in ascolto sulla porta 8080
sudo lsof +L1file eliminati ma ancora aperti (disco pieno ma du non mostra nulla)
lsof -p 1234tutti i file aperti da un processo
sudo fuser -vm /mnt/usbperché umount dice "target is busy"
sudo fuser -v 8080/tcpil 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 ./build.shreal = tempo reale, user + sys = tempo di CPU
strace -f -e trace=openat ./app 2>&1 | grep -v ENOENTquali file apre davvero?
sudo strace -p 1234su cosa è bloccato un processo appeso?
Versione del sistema operativo, kernel, CPU, memoria, hardware, ora e carico.
uname -res. 6.8.0-45-generic
uname -mquale binario scaricare: x86_64 o aarch64
cat /etc/os-releaseNAME, VERSION_ID, ID per ogni distribuzione dell'era systemd
lsb_release -aalternativa per Debian/Ubuntu, se installato
macOS/BSD: macOS: sw_vers.
hostnamectlnome host, sistema operativo, kernel, virtualizzazione
sudo hostnamectl set-hostname web01rinomina la macchina
uptimecarico 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 -hguarda 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.
lscpumodello, 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 -k | grep -A3 -i vgascheda grafica e driver in uso
lsusbil dispositivo USB viene rilevato?
sudo dmidecode -t memory | grep -i sizeRAM installata per slot
sudo lshw -shortuna riga per dispositivo
sudo dmesg -T | tail -30cosa è appena successo (USB collegata, errori del disco)
sudo dmesg -T | grep -i 'out of memory'l'OOM killer ha fermato la tua app?
grep MemAvailable /proc/meminfomemoria disponibile in kB
grep -c ^processor /proc/cpuinfonumero di CPU logiche
cat /proc/1234/statusstato e memoria di un processo
vmstat 1 5r = coda di esecuzione, si/so = swapping, wa = attesa di I/O
iostat -xz 1utilizzo per disco (%util) e latenza (await)
iostat fa parte del pacchetto sysstat.
date '+%Y-%m-%d %H:%M:%S'timestamp per i log
date +%ssecondi dal 1970-01-01 UTC
date -d @1700000000da timestamp a data (GNU)
date -d '2 days ago' +%Fdata 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.
Converti i timestamp con il convertitore di timestamp Unix →
timedatectlora locale, UTC, fuso orario, NTP sincronizzato?
timedatectl list-timezones | grep Americatrova il nome del fuso
sudo timedatectl set-timezone America/Torontocambialo
Spazio libero, cosa lo occupa, partizioni, montaggio e formattazione.
df -htutti 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 -sh /var/logdimensione di una cartella
du -h -d 1 | sort -hsottocartelle, le più grandi in fondo (funziona su GNU e macOS)
sudo du -xh -d 1 / | sort -h | taille directory di primo livello più grandi
macOS/BSD: du di macOS ha -d ma non --max-depth.
sudo ncdu -x /naviga con le frecce, d per eliminare
Installalo con apt install ncdu / dnf install ncdu.
lsblkdischi, partizioni, dimensioni, punti di mount
lsblk -fquale partizione è ext4/xfs, e il suo UUID
macOS/BSD: macOS: diskutil list.
sudo blkid /dev/sdb1UUID e TYPE, per /etc/fstab
findmntalbero dei mount con le opzioni
findmnt -T /var/lib/dockerquale file system contiene questo percorso
sudo findmnt --verifycontrolla /etc/fstab per errori prima di riavviare
sudo mount /dev/sdb1 /mnt/usbmonta 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/nasmonta una condivisione NFS
sudo umount /mnt/usbdopo questo puoi scollegarlo in sicurezza
sudo umount -l /mnt/naslazy: 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.
UUID=3f6c... /data ext4 defaults,nofail 0 2una riga per file system; nofail consente di continuare l'avvio se il disco manca
sudo mount -amonta 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.
sudo fdisk -ltutti i dischi e le loro partizioni
sudo parted /dev/sdb printtipo 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.
sudo mkfs.ext4 -L data /dev/sdb1ext4 con un'etichetta
sudo mkfs.vfat -F 32 /dev/sdc1FAT32 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.
sudo fsck -f /dev/sdb1forza 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.
sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress conv=fsynccrea una USB avviabile (sostituisci sdX con l'intero disco, non una partizione)
dd if=/dev/zero of=test.img bs=1M count=100crea 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 && sudo umount /mnt/usbprima di scollegare un'unità USB
swapon --showswap attuale
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfileaggiunge 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 -u -n 3 secrets.txtsovrascrive 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.
Indirizzi IP, route, porte aperte, richieste HTTP, DNS, SSH e trasferimento di file.
ip -br auna riga per interfaccia: nome, stato, indirizzi
ip a show eth0un'interfaccia in dettaglio
hostname -Isolo 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 rroute; "default via" è il gateway
ip route get 1.1.1.1quale interfaccia e quale gateway usa una destinazione
sudo ip route add 10.20.0.0/16 via 192.168.1.1aggiunge una route (persa al riavvio)
Controlla gli intervalli CIDR con il calcolatore di subnet →
ip linkinterfacce e indirizzi MAC
sudo ip link set eth0 down && sudo ip link set eth0 upriavvia un'interfaccia
Attenzione: Disattivare l'interfaccia attraverso cui sei connesso via SSH interrompe la sessione.
sudo ss -tulpntutte le porte in ascolto e i relativi programmi
ss -tn state established '( dport = :443 )'connessioni stabilite verso la porta 443
ss -stotali 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 -I https://example.comriga di stato e intestazioni
curl -LO https://example.com/file.tar.gzscarica, seguendo i reindirizzamenti
curl -s -o /dev/null -w '%{http_code}\n' https://example.comsolo il codice di stato
curl -fsSL https://example.com/install.sh -o install.shscarica uno script da leggere prima di eseguirlo
curl -H 'Content-Type: application/json' -d '{"name":"Ada"}' https://api.example.com/usersPOST di JSON
curl -H "Authorization: Bearer $TOKEN" https://api.example.com/mevirgolette doppie così $TOKEN viene espanso
curl -X DELETE https://api.example.com/users/42altri metodi
wget -c https://example.com/big.isoriprende 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 +short example.comsolo i record A
dig MX example.comserver di posta
dig @1.1.1.1 example.cominterroga un resolver specifico (aggira la cache locale)
dig -x 8.8.8.8ricerca inversa
dig +trace example.comsegue la delega dalla root
Nome del pacchetto: dnsutils (Debian/Ubuntu) o bind-utils (Fedora/RHEL).
host example.comA, AAAA e MX in una risposta breve
nslookup example.com 8.8.8.8lo stesso comando esiste su Windows
resolvectl statusserver DNS per interfaccia
sudo resolvectl flush-cachessvuota 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 -c 4 example.comquattro 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 -n example.comhop senza ricerche DNS
tracepath example.comnon 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 -rw -c 100 example.comreport 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 alice@203.0.113.10accedi
ssh -p 2222 alice@hostporta non standard
ssh alice@host 'df -h'esegue un comando e torna
ssh -J bastion.example.com alice@10.0.0.5passa attraverso un bastion host
ssh -N -L 5432:localhost:5432 alice@db-hostcollega il tuo client DB locale a un Postgres remoto
ssh -N -D 1080 alice@hostnaviga attraverso il server
ssh-keygen -t ed25519 -C "you@example.com"nuova coppia di chiavi in ~/.ssh
ssh-copy-id alice@hostaggiunge la tua chiave pubblica agli authorized_keys del server
ssh-keygen -R hostrimuove una vecchia chiave host dopo la ricostruzione di un server ("REMOTE HOST IDENTIFICATION HAS CHANGED")
Host web
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519poi basta: ssh web (lo usano anche scp e rsync)
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 -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 -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 -zv db.internal 5432"succeeded" oppure "Connection refused"/timeout
nc -l 9000mettiti 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.
sudo ufw status verboseregole e criterio predefinito
sudo ufw allow 22/tcpconsenti SSH (fallo prima di enable)
sudo ufw allow from 10.0.0.0/8 to any port 5432una 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.
sudo firewall-cmd --list-allzona attiva e regole
sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reloadapre HTTPS in modo permanente
sudo firewall-cmd --permanent --add-port=8080/tcpapre una porta
Senza --permanent una regola dura fino al prossimo reload o riavvio.
nmcli device statusinterfacce e stato della connessione
nmcli device wifi listreti vicine
nmcli device wifi connect 'MyWiFi' password 'secret'connettiti a una rete
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 |
| Cercare un pacchetto # | apt search keyword | dnf search keyword | pacman -Ss keyword | zypper search keyword |
| 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 |
Chi sei, chi ha effettuato l'accesso e gestione degli account.
iduid, gid e tutti i gruppi a cui appartieni
id aliceun altro utente
wchi è connesso e cosa sta eseguendo
last -n 10accessi e riavvii recenti
sudo lastb -n 10accessi non riusciti recenti (Linux)
sudo useradd -m -s /bin/bash alice && sudo passwd alicecrea e imposta una password
Su Debian/Ubuntu, adduser alice è l'alternativa interattiva più comoda che configura directory home e password.
sudo usermod -aG docker aliceconsenti ad alice di usare docker
sudo usermod -aG sudo aliceamministratore 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).
sudo userdel -r olduserrimuove 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).
passwdcambia la tua
sudo passwd alicereimposta quella di un altro utente
sudo passwd -l aliceblocca l'accesso con password (le chiavi SSH potrebbero ancora funzionare)
sudo groupadd developersnuovo gruppo
sudo gpasswd -d alice developersrimuove alice dal gruppo
groups alicei gruppi di alice
getent group sudomembri di sudo (funziona anche con LDAP)
getent passwd alicevoce dell'account: UID, home, shell
sudo visudo -f /etc/sudoers.d/deployun file separato per ogni regola
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myappun 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.
sudo chage -l alicedata dell'ultima modifica e di scadenza
sudo chage -M 90 alicescadenza ogni 90 giorni
tar, gzip, xz, zip e checksum.
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 -xf archive.tar.gztar di GNU e tar di macOS rilevano da soli la compressione
tar -xzf app.tar.gz -C /opt/app --strip-components=1in una cartella, senza la directory contenitore
tar -tf backup.tar.gz | lessvedi cosa contiene senza estrarre
tar -xf backup.tar.gz etc/nginx/nginx.confestrae un file (percorso come mostrato da -t)
tar --zstd -cf data.tar.zst data/molto più veloce di xz, rapporto simile o migliore rispetto a gzip -9
zstd -d file.zstdecomprime un singolo file
Richiede GNU tar 1.31+ (o un bsdtar recente) e il programma zstd.
gzip -k access.logcrea access.log.gz, mantiene l'originale
zcat access.log.gz | grep 404leggi senza decomprimere su disco
zgrep 500 access.log.*.gzgrep direttamente sui log ruotati
Senza -k, gzip sostituisce il file con la versione .gz.
xz -T0 -k big.sqltutti i core della CPU, mantiene l'originale
unxz big.sql.xzdecomprime
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 files.zip -d files/in una cartella
unzip -l files.zipelenca solo il contenuto
unzip -o files.zipsovrascrive senza chiedere
7z x archive.7zestrae con i percorsi completi
7z a -p backup.7z docs/archivio cifrato AES-256 (chiede una password)
7z l archive.rarelenca il contenuto di molti formati
Pacchetto: p7zip-full / 7zip su Debian/Ubuntu, p7zip o 7zip su Fedora/Arch.
sha256sum ubuntu.isoconfronta con l'hash nella pagina di download
sha256sum -c SHA256SUMS --ignore-missingcontrolla tutti i file elencati che hai effettivamente
macOS/BSD: macOS: shasum -a 256 file (e shasum -a 256 -c SUMSFILE).
split -b 100M backup.tar.gz backup.part.backup.part.aa, .ab, …
cat backup.part.* > backup.tar.gzriuniscile
Trovare file per nome, età o dimensione, e trovare testo all'interno dei file.
find . -name '*.log'metti il pattern tra virgolette così la shell non lo espande prima
find / -iname 'nginx.conf' 2>/dev/nullcerca ovunque, nascondendo gli errori di permesso
find . -maxdepth 1 -type dsottodirectory immediate
find . -type l -xtype lcollegamenti simbolici interrotti (GNU)
find . -type f -emptyfile vuoti
find /var/log -type f -mtime +30log più vecchi di 30 giorni
find . -type f -mmin -15cosa è cambiato negli ultimi 15 minuti
sudo find / -xdev -type f -size +500M -exec ls -lh {} + 2>/dev/nullfile oltre 500 MB sul file system root
find . -name '*.sh' -exec chmod +x {} +{} + passa molti file per comando (veloce)
find . -name '*.py' -exec grep -l 'TODO' {} +quali file Python contengono TODO
find . -name '*.jpg' -print0 | xargs -0 -P4 -n 20 jpegoptimelaborazione in parallelo, sicura con gli spazi nei nomi
find /tmp/app -name '*.tmp' -mtime +7 -printpasso 1: elenca le corrispondenze
find /tmp/app -name '*.tmp' -mtime +7 -deletepasso 2: stesso comando con -delete alla fine
Attenzione: L'ordine conta: -delete agisce nel punto in cui compare, quindi find . -delete -name "*.tmp" elimina tutto sotto . prima ancora che venga applicato il test sul nome. Metti -delete per ultimo ed esegui prima con -print.
find /srv -type f -perm -o+wfile scrivibili da chiunque
sudo find / -xdev -perm -4000 -type f 2>/dev/nullprogrammi setuid
locate -i nginx.confmolto più veloce di find /
sudo updatedbaggiorna subito l'indice
Fornito da plocate o mlocate; l'indice viene ricostruito ogni giorno, quindi i file creati oggi possono mancare finché non viene eseguito updatedb.
grep -n 'ERROR' app.logrighe corrispondenti con i numeri
grep -v '^#' nginx.conf | grep -v '^$'configurazione senza commenti e righe vuote
grep -c 'Failed password' /var/log/auth.logconta gli accessi SSH non riusciti
grep -rn 'TODO' src/ogni TODO con file e riga
grep -rl --include='*.php' 'mysql_connect' .quali file PHP usano ancora una vecchia API
grep -rn --exclude-dir={.git,node_modules} 'apiKey' .salta le cartelle rumorose
grep -C 3 'Traceback' app.log3 righe prima e dopo
grep -A 20 'Exception' app.loglo stack trace dopo l'errore
grep -E 'error|warn' app.loguna delle due parole (regex estesa)
grep -Eo '[0-9]{1,3}(\.[0-9]{1,3}){3}' access.log | sort | uniq -c | sort -rn | headgli indirizzi IP più frequenti in un log
grep -P '\d{4}-\d{2}-\d{2}' file\d in stile Perl (grep di GNU)
macOS/BSD: -E funziona ovunque; -P (PCRE) è una funzionalità di GNU e non è disponibile in tutte le versioni di macOS.
type llti dice se è un alias, una funzione, un comando integrato o un file
command -v docker >/dev/null || echo "docker missing"controllo portabile negli script
which -a python3ogni python3 nel PATH, in ordine
Tagliare, filtrare, ordinare, contare, trasformare e rimodellare testo e JSON.
sed 's/http:/https:/g' links.txtstampa il risultato; il file resta invariato
sed 's|/usr/local|/opt|g' paths.txtqualsiasi delimitatore, comodo per i percorsi
sed -E 's/([0-9]+)px/\1rem/g' style.cssriusa un gruppo catturato
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_configsed di GNU
sed -i.bak 's/foo/bar/g' config.inimantiene 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 '100,120p' big.logrighe da 100 a 120
sed '/^\s*#/d; /^$/d' app.confrimuove commenti e righe vuote (\s di GNU)
sed -n '/BEGIN CERT/,/END CERT/p' bundle.pemtutto ciò che sta tra due marcatori
awk '{print $1}' access.logprima colonna (IP del client)
awk -F: '{print $1, $7}' /etc/passwdutente e shell
awk -F, 'NR>1 {print $2}' data.csvseconda colonna di un CSV, salta l'intestazione (solo CSV semplici: niente virgole tra virgolette)
awk '$9 >= 500' access.logrighe in cui il campo 9 (stato) è 5xx
awk '{s += $2} END {print s}' sales.txtsomma della colonna 2
awk '{c[$1]++} END {for (k in c) print c[k], k}' access.log | sort -rn | headconteggio per valore, primi 10
cut -d, -f1,3 data.csvcolonne 1 e 3
cut -d: -f1 /etc/passwdtutti i nomi utente
cut -c1-10 fileprimi 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.
du -sh * | sort -hcartelle per dimensione
sort -t, -k3,3nr data.csvCSV per colonna 3, numerico, decrescente
sort -u emails.txt > unique.txtordinate e senza duplicati
sort ips.txt | uniq -c | sort -rn | headle 10 righe più frequenti
uniq comprime solo i duplicati adiacenti, quindi ordina prima.
wc -l access.lognumero di righe
ls | wc -lquante voci ci sono in questa cartella
grep -c '' fileconteggio delle righe che include un'ultima riga senza a capo
tr 'a-z' 'A-Z' < in.txtmaiuscolo
tr -d '\r' < windows.txt > unix.txtrimuove i fine riga CRLF di Windows
tr -s ' ' < filecomprime gli spazi ripetuti
tr '\n' ',' < list.txtunisce le righe con virgole
tr legge solo lo standard input, quindi reindirizza il file con <.
find . -name '*.log' -print0 | xargs -0 rm -felimina in sicurezza i file trovati
cat urls.txt | xargs -n 1 -P 4 curl -sOscarica 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 . response.jsonformattazione leggibile
jq -r '.items[].name' data.jsonun nome per riga
jq -r '.[] | select(.active) | .email' users.jsonfiltra, 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 -sd, ids.txttutte le righe unite con virgole
paste names.txt emails.txtdue file come due colonne
comm -12 <(sort a.txt) <(sort b.txt)in entrambi
comm -23 <(sort a.txt) <(sort b.txt)solo in a.txt
seq 1 5da 1 a 5, uno per riga
seq -w 1 10con zeri iniziali: 01 … 10
for i in $(seq 1 3); do echo "run $i"; donecontatore di un ciclo
printf '%s' 'user:pass' | base64codifica (printf evita un a capo finale)
echo dXNlcjpwYXNz | base64 -ddecodifica
base64 -w 0 image.png > image.b64senza 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 -f WINDOWS-1252 -t UTF-8 old.csv > new.csvcorregge i caratteri illeggibili delle esportazioni da Excel
iconv -lelenca le codifiche supportate
shuf -n 1 names.txtuna riga casuale
shuf -i 1-100 -n 5cinque numeri casuali da 1 a 100
Servizi systemd: avviarli, fermarli, abilitarli all'avvio e leggerne i log con journalctl.
systemctl status nginxstato, PID, memoria e ultime righe di log
systemctl is-active --quiet nginx && echo upper gli script
sudo systemctl restart nginxriavvio completo
sudo systemctl reload nginxrilegge 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.
sudo systemctl enable --now dockerabilita all'avvio e avvia subito
sudo systemctl disable --now cupsferma subito e all'avvio
sudo systemctl mask bluetoothimpedisce del tutto che venga avviato (unmask per annullare)
systemctl --failedcosa si è rotto
systemctl list-units --type=service --state=runningcosa è in esecuzione
systemctl list-unit-files --state=enabledcosa si avvia all'accensione
sudo systemctl edit nginxoverride drop-in che sopravvive agli aggiornamenti dei pacchetti
systemctl cat nginxla unit più tutti gli override
sudo systemctl daemon-reloadnecessario dopo aver modificato a mano i file delle unit
[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.targetpoi: sudo systemctl daemon-reload && sudo systemctl enable --now myapp
journalctl -u nginx -fsegue un servizio
journalctl -u myapp --since '10 min ago'finestra recente
journalctl -b -1 -p errerrori dell'avvio prima del crash
journalctl --disk-usagequanto spazio occupano i log
sudo journalctl --vacuum-size=500Mconserva al massimo 500 MB di log archiviati
sudo journalctl --vacuum-time=14delimina i log archiviati più vecchi di due settimane
Per un limite permanente imposta SystemMaxUse= in /etc/systemd/journald.conf.
sudo tail -f /var/log/sysloglog generale su Debian/Ubuntu (/var/log/messages su Fedora/RHEL)
sudo tail -f /var/log/auth.logaccessi 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.
sudo rebootriavvia subito
sudo shutdown -r +10 'Kernel update'riavvia tra 10 minuti, avvisando gli utenti connessi
sudo shutdown -cannulla uno spegnimento programmato
sudo shutdown -h nowspegni
Eseguire comandi secondo una pianificazione o una sola volta più tardi.
crontab -eapre il tuo crontab in $EDITOR
crontab -llo elenca
crontab -l > crontab.bakne fa un backup
Crea e spiega la pianificazione con il generatore di espressioni cron →
30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1ogni giorno alle 02:30, conservando l'output
*/15 * * * * /usr/local/bin/check.shogni 15 minuti
0 9 * * 1-5 /usr/local/bin/report.shalle 09:00 dal lunedì al venerdì
@reboot /usr/local/bin/startup.shuna 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 -l > ~/crontab.bak && crontab -rfai un backup prima di rimuovere
crontab ~/crontab.bakripristina 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).
0 3 * * * root /usr/local/bin/cleanup.shriga 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.
echo 'systemctl restart myapp' | sudo at 02:00stanotte alle 2
echo './report.sh' | at now + 30 minutestra mezz'ora
atqjob in attesa
atrm 3annulla il job 3
Richiede il pacchetto at e il servizio atd in esecuzione.
systemctl list-timerstutti i timer e quando scatteranno
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.targetbackup.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 5 && curl -s localhost:8080/healthdà a un servizio il tempo di avviarsi
sleep 2mi suffissi funzionano su GNU e sulle versioni attuali di macOS
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).
ps aux | grep nginxfiltra un elenco
history | grep 'docker run'trova un comando eseguito in precedenza
set -o pipefailnegli script: una pipeline fallisce se fallisce una qualsiasi parte, non solo l'ultima
ls -l > listing.txtsovrascrive (crea il file)
echo 'done' >> progress.logaggiunge in fondo
set -o noclobberfa 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.
find / -name x 2>/dev/nullscarta i messaggi di errore
./build.sh > build.log 2>&1output ed errori in un unico file (l'ordine conta: prima >, poi 2>&1)
./build.sh &> build.logla forma abbreviata di bash per la stessa cosa
mysql mydb < dump.sqlfile come input
cat > config.yml <<'EOF'
port: 8080
host: $HOST stays literal
EOFmettere 'EOF' tra virgolette impedisce l'espansione delle $variabili
grep -c a <<< "banana"here-string
make && sudo make installinstalla solo se la build è riuscita
cd /srv/app || exit 1interrompe uno script se cd fallisce
(cd frontend && npm run build)parentesi: una subshell, quindi la tua directory non cambia
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.
ls *.jpgtutti i JPG di questa cartella
rm photo-??.pngphoto-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.
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
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 NODE_ENV=productionvisibile a tutti i programmi avviati da questa shell
DEBUG=1 ./appsolo per quel comando
printenv | sortle elenca
unset DEBUGrimuove
Si perdono quando la shell termina. Metti gli export in ~/.bashrc (shell interattive) o ~/.profile (shell di login) per conservarle.
echo "$PATH" | tr : '\n'una voce per riga
export PATH="$HOME/.local/bin:$PATH"antepone la tua cartella bin (aggiungilo a ~/.bashrc)
hash -rdimentica le posizioni dei comandi in cache dopo aver spostato dei binari
alias ll='ls -alF'aggiungilo a ~/.bashrc per mantenerlo
source ~/.bashrcapplica le modifiche senza aprire un nuovo terminale (come . ~/.bashrc)
\lsesegue il vero ls, aggirando un alias
grep -q root /etc/passwd; echo $?0 trovato, 1 non trovato, 2 errore
set -euo pipefailall'inizio di uno script: si ferma su errori, variabili non impostate e pipe fallite
sudo !!riesegue l'ultimo comando con sudo
cd !$usa l'ultimo argomento del comando precedente
!42riesegue la riga 42 della cronologia
^foo^barriesegue 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.
bind -P | lesselenca tutte le combinazioni di tasti
man rsyncmanuale completo; / per cercare, q per uscire
man 5 crontabsezione 5: il formato del file, non il comando
help cdi comandi integrati di bash non hanno una pagina man propria
apropos partitionquali comandi citano una parola
#!/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"
doneargomenti, un test, un ciclo
chmod +x script.sh && ./script.sh Adarendilo eseguibile ed eseguilo
bash -x script.shtraccia ogni riga mentre viene eseguita
$1 … $9 sono gli argomenti, "$@" sono tutti, $# è quanti sono. [[ ]] è di bash; negli script POSIX sh usa [ ].
Cicli e condizioni di Bash a confronto con CMD e PowerShell →
resetdopo che un cat di un file binario ha lasciato il terminale a stampare caratteri strani
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.