Introduzione a Linux
Linux è un sistema operativo open source basato sul kernel sviluppato da Linus Torvalds nel 1991. È il sistema più diffuso nei server, negli ambienti cloud, nei dispositivi embedded e in ambito cybersecurity.
- Multiutente e multitasking — più utenti e processi operano contemporaneamente
- Tutto è un file — dispositivi, processi e connessioni di rete sono rappresentati come file
- Permessi e sicurezza — ogni file e processo ha un proprietario e un set di permessi
- Shell come strumento primario — la riga di comando è potente e completamente scriptabile
- Distribuzioni (distro) — esistono decine di varianti adatte a usi diversi
/dev/eth0), processi (/proc/PID) e dispositivi hardware (/dev/sda) si leggono e scrivono come file normali.| Utente | UID | Descrizione |
|---|---|---|
root | 0 | Il superutente. Ha accesso illimitato al sistema. Va usato con estrema cautela. |
| utente normale | ≥1000 | Opera in uno spazio limitato, senza poter modificare file di sistema. |
sudo | — | Permette a un utente normale di eseguire singoli comandi con privilegi di root. |
sonica_843@debianotta:~$ # $ = utente normale root@debianotta:~# # # = sei root (attenzione!)
Distribuzioni Linux
Una distribuzione è un sistema operativo completo costruito attorno al kernel Linux, con gestore di pacchetti, ambiente e strumenti preinstallati.
| Distribuzione | Famiglia | Gestore pacchetti | Note |
|---|---|---|---|
| Debian | Debian | apt / dpkg | Estremamente stabile. Base di Ubuntu e molte altre distro. |
| Ubuntu | Debian | apt / dpkg | La più diffusa per desktop e server. Ottima per chi inizia. |
| Linux Mint | Ubuntu | apt / dpkg | Interfaccia simile a Windows. Consigliata ai principianti. |
| Fedora | Red Hat | dnf / rpm | Tecnologie bleeding-edge. Sponsorizzata da Red Hat. |
| Red Hat (RHEL) | — | dnf / rpm | Distribuzione enterprise a pagamento con supporto ufficiale. |
| CentOS | Red Hat | dnf / rpm | Storico clone gratuito di RHEL. Oggi sostituito da CentOS Stream. |
| Kali Linux | Debian | apt / dpkg | Distro pensata per il penetration testing e la sicurezza offensiva. |
Famiglia Debian — usa apt:
apt update # aggiorna la lista dei pacchetti apt upgrade # aggiorna tutti i pacchetti installati apt install nome-pacchetto # installa un pacchetto apt remove nome-pacchetto # rimuove un pacchetto
Famiglia Red Hat — usa dnf:
dnf install nome-pacchetto # installa un pacchetto dnf update # aggiorna il sistema dnf remove nome-pacchetto # rimuove un pacchetto
Il Filesystem di Linux
Linux segue lo standard FHS (Filesystem Hierarchy Standard): tutto parte da un'unica radice /. A differenza di Windows non esistono lettere di unità.
| Percorso | Descrizione |
|---|---|
/ | Root dell'intero filesystem. Tutto parte da qui. |
/root | Home directory dell'utente root (superutente). |
/home | Contiene le home directory degli utenti normali. |
/home/nomeutente | Directory personale di ogni utente (es. /home/sonica_843). |
/bin | Binari essenziali disponibili a tutti (ls, cp, mv, cat…) |
/sbin | Binari di sistema riservati a root (fdisk, ifconfig, reboot…) |
/usr | Programmi e dati secondari installati dal sistema. |
/usr/bin | La maggior parte dei comandi utente (python3, nano, gcc…) |
/usr/local | Software installato manualmente dall'amministratore. |
/etc | File di configurazione del sistema e dei servizi. |
/var | Dati variabili: log, code di stampa, database temporanei. |
/var/log | File di log del sistema e delle applicazioni. |
/tmp | File temporanei. Svuotato ad ogni riavvio. |
/dev | File dispositivo (dischi, terminali, USB, /dev/null…) |
/proc | Filesystem virtuale: info su processi e kernel in tempo reale. |
/sys | Filesystem virtuale: informazioni sull'hardware e driver. |
/mnt | Punto di mount temporaneo per filesystem esterni. |
/media | Mount automatico di dispositivi rimovibili (USB, CD…) |
/opt | Software opzionale di terze parti installato manualmente. |
/lib | Librerie condivise essenziali per i binari di /bin e /sbin. |
/boot | File del kernel e bootloader (GRUB, initramfs…) |
/run | Dati di runtime dalla sessione corrente (PID, socket…) |
Percorso assoluto — parte sempre da /: /home/sonica_843/cane
Percorso relativo — parte dalla directory corrente: ../cane
| Simbolo | Significato |
|---|---|
~ | Home directory dell'utente corrente |
. | Directory corrente |
.. | Directory genitore (un livello sopra) |
- | Directory precedente (usato con cd -) |
* | Wildcard: corrisponde a qualsiasi stringa di caratteri |
? | Wildcard: corrisponde a un singolo carattere |
{x..y} | Espansione di intervallo (es. {1..10}, {a..z}) |
ls *.txt # tutti i file .txt ls file?.sh # file1.sh, file2.sh... (un carattere qualsiasi) ls ../cane/* # tutto il contenuto di ../cane/ ls ../* # tutto il contenuto della directory genitore cat ~/cane/*.log # legge tutti i .log nella cartella cane rm /tmp/test* # elimina tutto ciò che inizia con 'test' in /tmp cp ../backup/* . # copia tutto da ../backup/ nella directory corrente
ls ?? prima per verificare, poi rm ??. Non eliminare mai senza aver visto prima cosa seleziona il pattern.PATH — lista delle directory in cui la shell cerca i comandi eseguibili.
echo $PATH # mostra il PATH corrente export PATH=$PATH:/nuova/cartella # aggiunge una cartella al PATH printenv # mostra tutte le variabili d'ambiente export MIAVAR="valore" # crea/esporta una variabile unset MIAVAR # elimina una variabile
| Variabile | Significato |
|---|---|
HOME | Percorso della home directory dell'utente corrente |
USER | Nome dell'utente corrente |
SHELL | Shell in uso (es. /bin/bash) |
PWD | Directory di lavoro corrente |
LANG | Lingua e localizzazione del sistema |
Comandi Base della Shell
La shell (tipicamente Bash) è l'interfaccia testuale con cui si interagisce con Linux: comando [opzioni] [argomenti]
| Comando | Descrizione | Esempio |
|---|---|---|
whoami | Mostra il nome dell'utente corrente | whoami |
id | Mostra UID, GID e gruppi dell'utente corrente | id |
id nomeutente | Mostra UID e gruppi di un altro utente | id root |
pwd | Mostra il percorso assoluto della directory corrente | pwd |
echo | Stampa un testo o il valore di una variabile | echo $HOME |
passwd | Cambia la password dell'utente corrente | passwd |
passwd utente | Cambia la password di un altro utente (root) | passwd mario |
| Comando | Descrizione | Esempio |
|---|---|---|
cat file | Mostra l'intero contenuto di un file | cat /etc/hostname |
head file | Mostra le prime 10 righe di un file | head /var/log/syslog |
head -n N file | Mostra le prime N righe | head -n 5 file.txt |
tail file | Mostra le ultime 10 righe di un file | tail /var/log/auth.log |
tail -n N file | Mostra le ultime N righe | tail -n 20 file.txt |
tail -f file | Segue il file in tempo reale (live) | tail -f /var/log/syslog |
grep pattern | Cerca un pattern (testo) in un file | grep "error" /var/log/syslog |
grep -i | Ricerca case-insensitive | grep -i "error" file.txt |
grep -r | Ricerca ricorsiva in tutte le sottocartelle | grep -r "password" /etc/ |
nano file | Apre un editor di testo semplice nel terminale | nano /etc/hosts |
cut estrae porzioni di testo da ogni riga di un file, operando su campi delimitati o posizioni di carattere.
| Comando | Descrizione | Esempio |
|---|---|---|
cut -d 'sep' -f N | Estrae il campo N usando 'sep' come delimitatore | cut -d ':' -f 1 /etc/passwd |
cut -c N-M | Estrae i caratteri dalla posizione N alla M | cut -c 1-5 file.txt |
cat /etc/passwd | cut -d ':' -f 1 # estrae tutti i nomi utente
sed elabora e trasforma testo riga per riga senza aprire un editor interattivo. Fondamentale per sostituzioni in massa e modifica di file di configurazione.
| Comando | Descrizione | Esempio |
|---|---|---|
sed 's/v/n/' file | Sostituisce la PRIMA occorrenza per riga | sed 's/gatto/cane/' file.txt |
sed 's/v/n/g' file | Sostituisce TUTTE le occorrenze (g = global) | sed 's/gatto/cane/g' file.txt |
sed 's/v/n/gi' file | Sostituzione globale case-insensitive | sed 's/errore/ERRORE/gi' log.txt |
sed -i 's/v/n/g' file | Modifica il file direttamente (in-place) | sed -i 's/localhost/127.0.0.1/g' conf |
sed -i.bak 's/v/n/g' file | In-place con backup (crea file.bak) | sed -i.bak 's/off/on/g' config.txt |
sed -n 'Np' file | Stampa solo la riga N | sed -n '5p' file.txt |
sed -n 'N,Mp' file | Stampa le righe da N a M | sed -n '2,6p' file.txt |
sed '/pattern/d' file | Elimina le righe che contengono il pattern | sed '/^#/d' config.txt |
sed -n '/pattern/p' file | Stampa solo le righe che corrispondono | sed -n '/error/p' syslog |
# Sostituire in un file di config con backup di sicurezza: sed -i.bak 's/porta=80/porta=8080/g' config.txt # Rimuovere tutte le righe di commento (che iniziano con #): sed '/^#/d' /etc/ssh/sshd_config # Visualizzare solo le righe dalla 10 alla 20: sed -n '10,20p' /var/log/syslog # Combinare con pipe: cat /etc/passwd | sed 's/:/ | /g'
find cerca file e directory secondo criteri precisi: nome, tipo, dimensione, data, permessi, proprietario. È uno degli strumenti più potenti di Linux.
| Comando | Descrizione | Esempio |
|---|---|---|
find percorso -name 'pat' | Cerca per nome (case-sensitive) | find /home -name '*.sh' |
find percorso -iname 'pat' | Cerca per nome (case-insensitive) | find /etc -iname '*.conf' |
find percorso -type f | Cerca solo file regolari | find /tmp -type f |
find percorso -type d | Cerca solo directory | find /home -type d |
find percorso -type l | Cerca solo link simbolici | find /usr -type l |
find percorso -size +NM | Cerca file più grandi di N megabyte | find / -size +100M |
find percorso -mtime -N | File modificati negli ultimi N giorni | find /var -mtime -7 |
find percorso -mtime +N | File modificati più di N giorni fa | find /tmp -mtime +30 |
find percorso -user nome | Cerca file appartenenti a un utente | find /home -user sonica_843 |
find percorso -perm 644 | Cerca file con permessi esatti | find /etc -perm 644 |
find percorso -empty | Cerca file o directory vuoti | find /tmp -empty |
Opzione -exec — eseguire un comando su ogni file trovato:
# Eliminare file .tmp più vecchi di 7 giorni:
find /tmp -name '*.tmp' -mtime +7 -exec rm {} \;
# Cambiare i permessi a tutti gli script .sh trovati:
find ~/scripts -name '*.sh' -exec chmod +x {} \;
# Trovare file di grandi dimensioni:
find / -size +500M -exec ls -lh {} \; 2>/dev/null
# Cercare file con la parola 'password' nel nome:
find / -name '*password*' 2>/dev/null
# Trovare tutti i file modificati oggi:
find . -mtime 0
date mostra o imposta la data e l'ora di sistema. Molto usato negli script per generare timestamp e nomi di file dinamici.
| Comando | Descrizione |
|---|---|
date | Mostra data e ora corrente nel formato di sistema |
date +"%Y-%m-%d" | Formato ISO: anno-mese-giorno |
date +"%H:%M:%S" | Ora nel formato HH:MM:SS |
date +"%d/%m/%Y %T" | Data italiana + ora completa |
date +%s | Timestamp Unix (secondi dall'1/1/1970) |
date -d "tomorrow" | Calcola la data di domani |
date -d "7 days ago" | Calcola la data di 7 giorni fa |
Variabili di formato:
| Var. | Significato | Var. | Significato |
|---|---|---|---|
%Y | Anno a 4 cifre (2026) | %T | Ora completa (%H:%M:%S) |
%y | Anno a 2 cifre (26) | %A | Nome giorno (Monday…) |
%m | Mese con zero (01-12) | %B | Nome mese (January…) |
%d | Giorno con zero (01-31) | %s | Timestamp Unix |
%H | Ora 24h (00-23) | %N | Nanosecondi |
%M | Minuti (00-59) | %Z | Timezone (CEST, UTC) |
%S | Secondi (00-59) | %j | Giorno dell'anno (001-366) |
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
touch backup_${TIMESTAMP}.tar.gz # es. backup_20260408_143022.tar.gz
echo "$(date +"%d/%m/%Y %T") - Avvio" >> /var/log/mio_script.log
| Operatore | Descrizione | Esempio |
|---|---|---|
> | Redirige l'output in un file (sovrascrive se esiste) | echo "ciao" > saluto.txt |
>> | Redirige l'output in un file (aggiunge in coda) | echo "log" >> registro.txt |
| | Pipe: passa l'output del primo come input del secondo | ls -la | grep ".txt" |
< | Redirige un file come input di un comando | sort < lista.txt |
2> | Redirige gli errori (stderr) su un file | ls xyz 2> errori.txt |
2>&1 | Redirige stderr sullo stesso canale di stdout | comando > out.txt 2>&1 |
|| | Esegue il secondo comando SOLO se il primo fallisce | mkdir /tmp/dir || echo "Errore!" |
&& | Esegue il secondo comando SOLO se il primo ha successo | apt update && apt upgrade |
| Comando | Descrizione | Esempio |
|---|---|---|
top | Monitor interattivo in tempo reale di processi, CPU e RAM | top |
top -u utente | Mostra solo i processi di un determinato utente | top -u sonica_843 |
ps aux | Lista tutti i processi in esecuzione (snapshot statico) | ps aux |
ps aux | grep | Filtra i processi per nome | ps aux | grep nginx |
kill PID | Termina un processo tramite il suo PID | kill 1234 |
kill -9 PID | Forza la terminazione immediata (SIGKILL) | kill -9 1234 |
free | Mostra l'utilizzo della memoria RAM e swap | free |
free -h | Stessa cosa con unità leggibili (MB, GB) | free -h |
df -h | Spazio su disco per tutti i filesystem montati | df -h |
du -sh dir | Dimensione totale di una directory | du -sh /var/log |
uname -a | Informazioni sul kernel e sul sistema | uname -a |
uptime | Tempo di attività del sistema e carico medio | uptime |
systemctl gestisce i servizi (demoni) su sistemi con systemd. Un servizio è un programma che gira in background: server web, SSH, database, firewall ecc.
| Comando | Descrizione | Esempio |
|---|---|---|
systemctl start servizio | Avvia un servizio | systemctl start ssh |
systemctl stop servizio | Ferma un servizio | systemctl stop nginx |
systemctl restart servizio | Riavvia un servizio | systemctl restart apache2 |
systemctl reload servizio | Ricarica la config senza riavviare | systemctl reload nginx |
systemctl status servizio | Mostra lo stato attuale | systemctl status ssh |
systemctl enable servizio | Abilita avvio automatico al boot | systemctl enable ssh |
systemctl disable servizio | Disabilita l'avvio automatico | systemctl disable bluetooth |
systemctl is-active servizio | Risponde 'active' o 'inactive' | systemctl is-active nginx |
systemctl list-units --failed | Lista i servizi che hanno fallito | |
systemctl daemon-reload | Rilegge i file di configurazione di systemd | |
journalctl -u servizio | Mostra i log di un servizio | journalctl -u ssh |
journalctl -u servizio -f | Segue i log in tempo reale | journalctl -u nginx -f |
sudo systemctl status ssh # controlla se SSH è attivo sudo systemctl start ssh # avvialo se è fermo sudo systemctl enable ssh # abilitalo all'avvio automatico sudo systemctl restart ssh # riavvialo dopo aver modificato la config journalctl -u ssh -n 50 # ultime 50 righe di log SSH
SSH (Secure SHell) permette di connettersi a un altro computer in rete in modo sicuro e cifrato. È il protocollo standard per l'amministrazione remota di server Linux.
| Comando | Descrizione | Esempio |
|---|---|---|
ssh utente@host | Connessione base a un host remoto | ssh sonica_843@192.168.1.10 |
ssh utente@host -p porta | Connessione su una porta diversa dalla 22 | ssh mario@server.com -p 2222 |
ssh -i chiave.pem utente@host | Connessione con chiave privata | ssh -i ~/.ssh/id_rsa mario@server.com |
ssh-keygen | Genera una coppia di chiavi SSH | ssh-keygen -t rsa -b 4096 |
ssh-copy-id utente@host | Copia la chiave pubblica sul server remoto | ssh-copy-id mario@192.168.1.10 |
scp file utente@host:percorso | Copia un file verso il server | scp backup.tar.gz mario@server:/tmp/ |
scp utente@host:file . | Copia un file dal server in locale | scp mario@server:/var/log/syslog . |
scp -r dir utente@host:percorso | Copia una directory intera | scp -r ~/progetto mario@server:~/ |
Autenticazione con chiave — flusso completo:
# 1. Genera le chiavi (una sola volta): ssh-keygen -t rsa -b 4096 # Crea: ~/.ssh/id_rsa (privata) e ~/.ssh/id_rsa.pub (pubblica) # 2. Copia la chiave pubblica sul server: ssh-copy-id sonica_843@192.168.1.10 # 3. Da ora puoi connetterti senza password: ssh sonica_843@192.168.1.10
Il file /etc/ssh/sshd_config — parametri importanti:
Port 22 # porta di ascolto PermitRootLogin no # IMPORTANTE: disabilitare login diretto come root PasswordAuthentication no # usare solo chiavi, non password AllowUsers sonica_843 # permettere solo utenti specifici # Dopo ogni modifica: sudo systemctl restart ssh
| Comando | Descrizione | Esempio |
|---|---|---|
history | Mostra la cronologia completa dei comandi | history |
history N | Mostra gli ultimi N comandi | history 20 |
history | grep | Cerca un comando specifico nella cronologia | history | grep nmap |
!N | Riesegue il comando numero N della cronologia | !42 |
!! | Riesegue l'ultimo comando | !! |
!stringa | Riesegue l'ultimo comando che inizia con 'stringa' | !sudo |
Ctrl + R | Ricerca interattiva nella cronologia | Ctrl+R poi: nmap |
history -c | Cancella tutta la cronologia della sessione corrente | history -c |
cat ~/.bash_history # il file della cronologia comando_segreto # uno spazio iniziale = non viene registrato in history
| Comando | Descrizione |
|---|---|
chsh | Avvia la procedura interattiva per cambiare shell |
chsh -s /bin/zsh | Imposta zsh come shell di default |
chsh -s /bin/bash | Torna a bash come shell di default |
cat /etc/shells | Mostra le shell disponibili e installate |
echo $SHELL | Mostra la shell attualmente in uso |
| Comando | Descrizione | Esempio |
|---|---|---|
curl URL | Scarica il contenuto e lo stampa a schermo | curl https://example.com |
curl -o file URL | Scarica e salva con nome specificato | curl -o pagina.html https://example.com |
curl -O URL | Scarica e salva con il nome originale | curl -O https://esempio.com/file.zip |
curl -I URL | Mostra solo gli header HTTP della risposta | curl -I https://example.com |
curl -X POST URL | Esegue una richiesta POST | curl -X POST https://api.esempio.com |
curl -d 'dati' URL | Invia dati nel corpo della richiesta POST | curl -d 'nome=mario' https://api.com |
curl -H 'Header' URL | Aggiunge un header HTTP alla richiesta | curl -H 'Authorization: Bearer TOKEN' URL |
curl -L URL | Segue i redirect automaticamente | curl -L https://esempio.com |
curl -s URL | Modalità silenziosa (nessun output di progresso) | curl -s https://api.com | grep id |
| Comando | Descrizione | Esempio |
|---|---|---|
git init | Inizializza un nuovo repository | git init |
git clone URL | Clona un repository remoto in locale | git clone https://github.com/user/repo |
git status | Mostra lo stato dei file | git status |
git add file | Aggiunge un file all'area di staging | git add script.sh |
git add . | Aggiunge tutti i file modificati | git add . |
git commit -m 'msg' | Crea un commit con un messaggio | git commit -m 'Fix bug' |
git log --oneline | Cronologia compatta | git log --oneline |
git diff | Mostra le modifiche non ancora in staging | git diff |
git branch | Lista i branch del repository | git branch |
git checkout -b nome | Crea e passa a un nuovo branch | git checkout -b feature/login |
git merge branch | Unisce un branch nel branch corrente | git merge feature/login |
git pull | Scarica e integra le modifiche dal repo remoto | git pull |
git push | Carica i commit locali sul repository remoto | git push |
Utenti, Gruppi & Permessi
In Linux esiste un unico superutente chiamato root (UID 0). Ha accesso illimitato a tutto il sistema.
sonica_843@debianotta:~$ # $ = utente normale root@debianotta:~# # # = sei root (attenzione!)
Metodo 1 — sudo (raccomandato):
sudo comando # esegue come root sudo apt update sudo -l # mostra cosa puoi fare con sudo sudo -k # invalida subito il token sudo
Metodo 2 — sudo -i oppure sudo su - (shell root completa):
sudo -i # apre shell root con ambiente di root sudo su - # equivalente exit # torna all'utente normale
Metodo 3 — su (switch user):
su # diventa root (richiede password di root) su - # diventa root con ambiente completo (consigliato) su nomeutente # diventa un altro utente su - nomeutente # con il suo ambiente
| Caratteristica | sudo | su |
|---|---|---|
| Password richiesta | Dell'utente CORRENTE | Dell'utente di DESTINAZIONE (root) |
| Durata privilegi | Solo per il singolo comando | Per tutta la sessione (fino a exit) |
| Log e tracciabilità | Sì, in /var/log/auth.log | No (meno tracciabile) |
| Configurazione | Tramite /etc/sudoers (visudo) | Basta conoscere la password di root |
| Uso consigliato | Ambienti multi-utente, server | Amministrazione diretta, macchine personali |
| Comando shell root | sudo -i oppure sudo su - | su - |
sudo visudo # modifica /etc/sudoers in modo sicuro mario ALL=(ALL:ALL) ALL # mario può fare tutto mario ALL=(ALL) /usr/bin/apt # mario può usare solo apt mario ALL=(ALL) NOPASSWD: ALL # senza password usermod -aG sudo mario # aggiunge mario al gruppo sudo
| Comando | Descrizione | Esempio |
|---|---|---|
adduser nome | Crea un nuovo utente (interattivo) | adduser mario |
useradd -m nome | Crea un utente non interattivo | useradd -m mario |
deluser nome | Elimina un utente (mantiene la home) | deluser mario |
deluser --remove-home | Elimina utente e home directory | deluser --remove-home mario |
usermod -aG gruppo | Aggiunge un utente a un gruppo | usermod -aG sudo mario |
usermod -L nome | Blocca un account utente | usermod -L mario |
usermod -U nome | Sblocca un account utente | usermod -U mario |
groupadd gruppo | Crea un nuovo gruppo | groupadd devops |
groups nomeutente | Mostra i gruppi di un utente | groups mario |
cat /etc/passwd | Lista tutti gli utenti del sistema | |
sudo cat /etc/shadow | Contiene le password hashate (solo root) |
Struttura del file /etc/passwd:
sonica_843 : x : 1001 : 1001 : Sonica : /home/sonica_843 : /bin/bash # (1) (2) (3) (4) (5) (6) (7) # (1) nome (2) password in /etc/shadow (3) UID (4) GID # (5) info opzionali (6) home directory (7) shell di default
| Numero | Simbolo | Nome | Significato |
|---|---|---|---|
| 4 | r | read | Permesso di lettura |
| 2 | w | write | Permesso di scrittura |
| 1 | x | execute | Permesso di esecuzione |
| 7 | rwx | — | Tutti i permessi (4+2+1) |
| 6 | rw- | — | Lettura e scrittura (4+2) |
| 5 | r-x | — | Lettura ed esecuzione (4+1) |
| 0 | --- | — | Nessun permesso |
Leggere i permessi con ls -l:
-rwxr-xr-- 1 sonica_843 staff 4096 Mar 19 script.sh |└──┴──┴──┘ | u g o └─ tipo: - = file, d = directory, l = link simbolico
chmod — cambiare i permessi:
chmod 755 script.sh # rwxr-xr-x chmod 644 config.txt # rw-r--r-- chmod 600 chiave.pem # rw------- chmod +x script.sh # aggiunge esecuzione a tutti chmod u+x script.sh # aggiunge esecuzione solo al proprietario
chown — cambiare proprietario:
sudo chown sonica_843 orario.sh # cambia proprietario sudo chown sonica_843:sonica_843 orario.sh # cambia proprietario e gruppo sudo chown -R sonica_843:sonica_843 ~/cane/ # ricorsivo su tutta la cartella # Caso pratico — file creato da root, non modificabile da sonica_843: sudo chown sonica_843:sonica_843 orario.sh chmod +x orario.sh ./orario.sh
Bash Scripting
Uno script Bash è un file di testo contenente una sequenza di comandi che la shell esegue in ordine.
#!/bin/bash # ATTENZIONE: non deve esserci nulla prima di #! — nemmeno un apice. echo "Inizio dello script"
chmod +x mio_script.sh # rende eseguibile ./mio_script.sh # esegue lo script
#!/bin/bash deve essere la prima riga assoluta del file — prima di qualsiasi spazio, riga vuota o commento.Le variabili memorizzano valori di testo o numeri. Non richiedono dichiarazione. Regola fondamentale: nessuno spazio attorno al segno =.
#!/bin/bash
# Assegnare un valore (NO spazi attorno a =)
NOME="Sonica"
ETA=30
# Leggere una variabile: si usa $ davanti al nome
echo $NOME # stampa: Sonica
echo "Hai $ETA anni" # stampa: Hai 30 anni
echo "${NOME}_backup" # le graffe delimitano il nome: Sonica_backup
# Catturare l'output di un comando
DATA=$(date +"%Y-%m-%d") # sintassi moderna (consigliata)
KERNEL=`uname -r` # sintassi vecchia (equivalente)
# Operazioni aritmetiche
A=10; B=3
SOMMA=$((A + B)) # risultato: 13
PRODOTTO=$((A * B)) # risultato: 30
# Variabili speciali di Bash
echo $0 # nome dello script
echo $1 # primo argomento passato allo script
echo $# # numero di argomenti passati
echo $? # codice di uscita dell'ultimo comando (0 = successo)
echo $$ # PID del processo corrente
#!/bin/bash
# Uso: ./saluta.sh Mario 25
NOME=$1; ETA=$2
if [ -z "$NOME" ]; then
echo "Errore: fornisci un nome. Uso: $0 <nome> <eta>"
exit 1
fi
echo "Ciao $NOME, hai $ETA anni!"
Un array è una variabile che contiene più valori, accessibili tramite un indice numerico che parte da 0.
Array indicizzati:
#!/bin/bash
FRUTTI=("mela" "banana" "arancia" "pera")
echo ${FRUTTI[0]} # mela
echo ${FRUTTI[2]} # arancia
echo ${FRUTTI[@]} # tutti gli elementi
echo ${#FRUTTI[@]} # 4 (numero elementi)
FRUTTI+=("kiwi") # aggiunge un elemento
FRUTTI[1]="mango" # modifica un elemento
unset FRUTTI[2] # elimina un elemento
echo ${FRUTTI[@]:1:3} # slice: dal 2°, prende 3 elementi
Iterare su un array con for:
#!/bin/bash
UTENTI=("mario" "luigi" "sonica_843" "root")
for UTENTE in "${UTENTI[@]}"; do
echo "Elaboro utente: $UTENTE"
done
# Iterare con indice:
for i in "${!UTENTI[@]}"; do
echo "Indice $i: ${UTENTI[$i]}"
done
# Array dai file nella directory:
FILE_TXT=(*.txt)
echo "Trovati ${#FILE_TXT[@]} file .txt"
Array associativi (dizionari):
#!/bin/bash
declare -A UTENTE # dichiarazione obbligatoria
UTENTE["nome"]="Sonica"
UTENTE["eta"]="30"
UTENTE["shell"]="/bin/bash"
UTENTE["home"]="/home/sonica_843"
echo ${UTENTE["nome"]} # Sonica
echo ${!UTENTE[@]} # tutte le chiavi
for CHIAVE in "${!UTENTE[@]}"; do
echo "$CHIAVE = ${UTENTE[$CHIAVE]}"
done
read -p "Come ti chiami? " NOME read -sp "Password: " PASS # -s = silent (nasconde l'input) echo "Ciao $NOME!"
if [ $NUM -gt 10 ]; then
echo "Maggiore di 10"
elif [ $NUM -eq 10 ]; then
echo "Esattamente 10"
else
echo "Minore di 10"
fi
| Operatore | Tipo | Significato |
|---|---|---|
-eq | Numeri | Uguale (equal) |
-ne | Numeri | Diverso (not equal) |
-gt | Numeri | Maggiore di (greater than) |
-lt | Numeri | Minore di (less than) |
-ge | Numeri | Maggiore o uguale |
-le | Numeri | Minore o uguale |
= | Stringhe | Uguale a |
!= | Stringhe | Diverso da |
-z | Stringhe | Stringa vuota (zero length) |
-f | File | Esiste ed è un file regolare |
-d | File | Esiste ed è una directory |
# Intervallo numerico
for i in {1..5}; do
echo "Contatore: $i"
done
# File con wildcard
for FILE in *.txt; do
echo "Elaboro: $FILE"
done
# Array
for FRUTTO in "${FRUTTI[@]}"; do
echo "$FRUTTO"
done
#!/bin/bash
# Script: gestione_utenti.sh
UTENTI=("mario" "luigi" "sonica_843")
echo "=== Controllo utenti ==="
for UTENTE in "${UTENTI[@]}"; do
if id "$UTENTE" &>/dev/null; then
echo "[OK] $UTENTE esiste — $(id $UTENTE)"
else
echo "[--] $UTENTE non trovato"
fi
done
echo "Fatto il $(date +"%d/%m/%Y %T")"
Networking & Sicurezza di Rete
netstat mostra connessioni attive, tabelle di routing e statistiche. Nelle versioni moderne è sostituito da ss (più veloce).
| Comando | Descrizione |
|---|---|
netstat -a | Mostra tutte le connessioni e le porte in ascolto |
netstat -t | Mostra solo le connessioni TCP |
netstat -u | Mostra solo le connessioni UDP |
netstat -l | Mostra solo le porte in ascolto (LISTEN) |
netstat -n | Mostra indirizzi e porte in formato numerico |
netstat -p | Mostra PID e nome del processo |
netstat -tulnp | TCP+UDP, listening, numerico, processi |
netstat -r | Mostra la tabella di routing del kernel |
ss -tulnp | Alternativa moderna e più veloce a netstat |
netstat -tulnp | grep :80 # trova quale processo usa la porta 80 ss -tulnp | grep :443 # stesso per la porta HTTPS
nmap è lo strumento standard per la scansione di reti e host. Usarlo solo su sistemi di cui si ha autorizzazione.
| Comando | Descrizione | Esempio |
|---|---|---|
nmap IP | Scansione base di un host | nmap 192.168.1.1 |
nmap -sV IP | Rileva la versione dei servizi | nmap -sV 192.168.1.1 |
nmap -O IP | Tenta di rilevare il sistema operativo | nmap -O 192.168.1.1 |
nmap -p N IP | Scansiona solo la porta N | nmap -p 22 192.168.1.1 |
nmap -p 1-1000 IP | Scansiona le porte da 1 a 1000 | nmap -p 1-1000 10.0.0.1 |
nmap -p- IP | Scansiona tutte le 65535 porte | nmap -p- 10.0.0.1 |
nmap -sn rete/CIDR | Ping scan: scopre gli host attivi | nmap -sn 192.168.1.0/24 |
nmap -A IP | Scansione aggressiva: OS, versioni, script | nmap -A 192.168.1.1 |
nmap -sS IP | SYN scan (stealth): richiede root | sudo nmap -sS 10.0.0.1 |
nmap -oN file IP | Salva l'output in un file di testo | nmap -oN scan.txt 10.0.0.1 |
sudo nmap -A -p- 192.168.1.100 # scansione completa nmap -sn 192.168.1.0/24 # host attivi sulla rete locale
Script Bash — Progetto GOL
Una raccolta di script Bash realizzati durante lo stage formativo del Progetto GOL — Garanzia di Occupabilità dei Lavoratori, percorso CyberSecurity. Terminale interattivo con esecuzione simulata, codice sorgente commentato e documentazione.
Tecnologie usate: grep · bc · tr · cut · shuf · /dev/urandom
Seleziona uno script dal pannello e premi ESEGUI per vedere la simulazione nel terminale interattivo. Sviluppati da Ottavia, Marcello e Claudio durante lo stage formativo.
portfolio2026-04.web.app