🔍 Ctrl K
← Torna al Glossario Cybersecurity
01

Introduzione a Linux

§1.1 — Cos'è Linux & caratteristiche principali

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
💡 "Tutto è un file" è il principio fondamentale: anche interfacce di rete (/dev/eth0), processi (/proc/PID) e dispositivi hardware (/dev/sda) si leggono e scrivono come file normali.
§1.2 — Utenti principali
UtenteUIDDescrizione
root0Il superutente. Ha accesso illimitato al sistema. Va usato con estrema cautela.
utente normale≥1000Opera in uno spazio limitato, senza poter modificare file di sistema.
sudoPermette a un utente normale di eseguire singoli comandi con privilegi di root.
sonica_843@debianotta:~$    # $ = utente normale
root@debianotta:~#          # # = sei root (attenzione!)
02

Distribuzioni Linux

Una distribuzione è un sistema operativo completo costruito attorno al kernel Linux, con gestore di pacchetti, ambiente e strumenti preinstallati.

§2.1 — Principali distribuzioni
DistribuzioneFamigliaGestore pacchettiNote
DebianDebianapt / dpkgEstremamente stabile. Base di Ubuntu e molte altre distro.
UbuntuDebianapt / dpkgLa più diffusa per desktop e server. Ottima per chi inizia.
Linux MintUbuntuapt / dpkgInterfaccia simile a Windows. Consigliata ai principianti.
FedoraRed Hatdnf / rpmTecnologie bleeding-edge. Sponsorizzata da Red Hat.
Red Hat (RHEL)dnf / rpmDistribuzione enterprise a pagamento con supporto ufficiale.
CentOSRed Hatdnf / rpmStorico clone gratuito di RHEL. Oggi sostituito da CentOS Stream.
Kali LinuxDebianapt / dpkgDistro pensata per il penetration testing e la sicurezza offensiva.
§2.2 — Gestori di pacchetti

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
03

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à.

§3.1 — Albero delle directory
PercorsoDescrizione
/Root dell'intero filesystem. Tutto parte da qui.
/rootHome directory dell'utente root (superutente).
/homeContiene le home directory degli utenti normali.
/home/nomeutenteDirectory personale di ogni utente (es. /home/sonica_843).
/binBinari essenziali disponibili a tutti (ls, cp, mv, cat…)
/sbinBinari di sistema riservati a root (fdisk, ifconfig, reboot…)
/usrProgrammi e dati secondari installati dal sistema.
/usr/binLa maggior parte dei comandi utente (python3, nano, gcc…)
/usr/localSoftware installato manualmente dall'amministratore.
/etcFile di configurazione del sistema e dei servizi.
/varDati variabili: log, code di stampa, database temporanei.
/var/logFile di log del sistema e delle applicazioni.
/tmpFile temporanei. Svuotato ad ogni riavvio.
/devFile dispositivo (dischi, terminali, USB, /dev/null…)
/procFilesystem virtuale: info su processi e kernel in tempo reale.
/sysFilesystem virtuale: informazioni sull'hardware e driver.
/mntPunto di mount temporaneo per filesystem esterni.
/mediaMount automatico di dispositivi rimovibili (USB, CD…)
/optSoftware opzionale di terze parti installato manualmente.
/libLibrerie condivise essenziali per i binari di /bin e /sbin.
/bootFile del kernel e bootloader (GRUB, initramfs…)
/runDati di runtime dalla sessione corrente (PID, socket…)
§3.2 — Percorsi: assoluti, relativi & simboli speciali

Percorso assoluto — parte sempre da /: /home/sonica_843/cane

Percorso relativo — parte dalla directory corrente: ../cane

SimboloSignificato
~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})
§3.3 — Glob & Wildcard
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
⚠️ Regola d'oro con rm e wildcard: usa sempre ls ?? prima per verificare, poi rm ??. Non eliminare mai senza aver visto prima cosa seleziona il pattern.
§3.4 — PATH & variabili d'ambiente

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
VariabileSignificato
HOMEPercorso della home directory dell'utente corrente
USERNome dell'utente corrente
SHELLShell in uso (es. /bin/bash)
PWDDirectory di lavoro corrente
LANGLingua e localizzazione del sistema
04

Comandi Base della Shell

La shell (tipicamente Bash) è l'interfaccia testuale con cui si interagisce con Linux: comando [opzioni] [argomenti]

§4.1 — Identità e informazioni utente
ComandoDescrizioneEsempio
whoamiMostra il nome dell'utente correntewhoami
idMostra UID, GID e gruppi dell'utente correnteid
id nomeutenteMostra UID e gruppi di un altro utenteid root
pwdMostra il percorso assoluto della directory correntepwd
echoStampa un testo o il valore di una variabileecho $HOME
passwdCambia la password dell'utente correntepasswd
passwd utenteCambia la password di un altro utente (root)passwd mario
§4.2 — Navigazione e gestione file
ComandoDescrizioneEsempio
lsLista il contenuto della directory correntels
ls -lLista dettagliata (permessi, dimensione, data)ls -l /etc
ls -aMostra anche i file nascosti (che iniziano con .)ls -a
ls -laCombinazione: lista lunga + file nascostils -la ~/cane
ls ../dir/*Lista tutto il contenuto di una cartella relativals ../cane/*
cd percorsoCambia directorycd /var/log
cd ~Torna alla home directorycd ~
cd ..Sale di un livello nella gerarchiacd ..
mkdir nomeCrea una nuova directorymkdir progetti
mkdir -pCrea directory e tutti i genitori mancantimkdir -p /opt/app/conf
mkdir {1..N}Crea N directory numerate in un solo comandomkdir {1..10}
touch fileCrea un file vuoto o aggiorna il timestamptouch file.txt
touch file{1..N}Crea N file numerati in un colpo solotouch log{1..5}.txt
cp src dstCopia un filecp file.txt /tmp/
cp -r src dstCopia una directory intera (ricorsivo)cp -r /etc/nginx /backup/
mv src dstSposta o rinomina un file o directorymv vecchio.txt nuovo.txt
rm fileElimina un filerm file.txt
rm -r dirElimina una directory e tutto il suo contenutorm -r /tmp/vecchia/
rm -f fileForza l'eliminazione senza confermarm -f file.txt
rm -rf dirEliminazione forzata e ricorsiva (ATTENZIONE!)rm -rf /tmp/cache/
rm ??Elimina file il cui nome è esattamente 2 caratterirm ??
rm *.extElimina tutti i file con una certa estensionerm *.log
ln -s src linkCrea un link simbolico (soft link)ln -s /etc/nginx/nginx.conf ~/nginx.conf
ln src linkCrea un hard linkln file.txt file_backup.txt
diff file1 file2Confronta due file riga per rigadiff v1.txt v2.txt
⚠️ Regola d'oro con rm e wildcard: ls ?? prima per verificare → rm ?? dopo. Stessa cosa con ls test*rm test*.
§4.3 — Lettura e manipolazione di file di testo
ComandoDescrizioneEsempio
cat fileMostra l'intero contenuto di un filecat /etc/hostname
head fileMostra le prime 10 righe di un filehead /var/log/syslog
head -n N fileMostra le prime N righehead -n 5 file.txt
tail fileMostra le ultime 10 righe di un filetail /var/log/auth.log
tail -n N fileMostra le ultime N righetail -n 20 file.txt
tail -f fileSegue il file in tempo reale (live)tail -f /var/log/syslog
grep patternCerca un pattern (testo) in un filegrep "error" /var/log/syslog
grep -iRicerca case-insensitivegrep -i "error" file.txt
grep -rRicerca ricorsiva in tutte le sottocartellegrep -r "password" /etc/
nano fileApre un editor di testo semplice nel terminalenano /etc/hosts
§4.4 — cut — estrazione di campi

cut estrae porzioni di testo da ogni riga di un file, operando su campi delimitati o posizioni di carattere.

ComandoDescrizioneEsempio
cut -d 'sep' -f NEstrae il campo N usando 'sep' come delimitatorecut -d ':' -f 1 /etc/passwd
cut -c N-MEstrae i caratteri dalla posizione N alla Mcut -c 1-5 file.txt
cat /etc/passwd | cut -d ':' -f 1   # estrae tutti i nomi utente
§4.5 — sed — Stream Editor

sed elabora e trasforma testo riga per riga senza aprire un editor interattivo. Fondamentale per sostituzioni in massa e modifica di file di configurazione.

ComandoDescrizioneEsempio
sed 's/v/n/' fileSostituisce la PRIMA occorrenza per rigased 's/gatto/cane/' file.txt
sed 's/v/n/g' fileSostituisce TUTTE le occorrenze (g = global)sed 's/gatto/cane/g' file.txt
sed 's/v/n/gi' fileSostituzione globale case-insensitivesed 's/errore/ERRORE/gi' log.txt
sed -i 's/v/n/g' fileModifica il file direttamente (in-place)sed -i 's/localhost/127.0.0.1/g' conf
sed -i.bak 's/v/n/g' fileIn-place con backup (crea file.bak)sed -i.bak 's/off/on/g' config.txt
sed -n 'Np' fileStampa solo la riga Nsed -n '5p' file.txt
sed -n 'N,Mp' fileStampa le righe da N a Msed -n '2,6p' file.txt
sed '/pattern/d' fileElimina le righe che contengono il patternsed '/^#/d' config.txt
sed -n '/pattern/p' fileStampa solo le righe che corrispondonosed -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'
§4.6 — find — ricerca nel filesystem

find cerca file e directory secondo criteri precisi: nome, tipo, dimensione, data, permessi, proprietario. È uno degli strumenti più potenti di Linux.

ComandoDescrizioneEsempio
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 fCerca solo file regolarifind /tmp -type f
find percorso -type dCerca solo directoryfind /home -type d
find percorso -type lCerca solo link simbolicifind /usr -type l
find percorso -size +NMCerca file più grandi di N megabytefind / -size +100M
find percorso -mtime -NFile modificati negli ultimi N giornifind /var -mtime -7
find percorso -mtime +NFile modificati più di N giorni fafind /tmp -mtime +30
find percorso -user nomeCerca file appartenenti a un utentefind /home -user sonica_843
find percorso -perm 644Cerca file con permessi esattifind /etc -perm 644
find percorso -emptyCerca file o directory vuotifind /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
§4.7 — date & timestamp

date mostra o imposta la data e l'ora di sistema. Molto usato negli script per generare timestamp e nomi di file dinamici.

ComandoDescrizione
dateMostra 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 +%sTimestamp 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.SignificatoVar.Significato
%YAnno a 4 cifre (2026)%TOra completa (%H:%M:%S)
%yAnno a 2 cifre (26)%ANome giorno (Monday…)
%mMese con zero (01-12)%BNome mese (January…)
%dGiorno con zero (01-31)%sTimestamp Unix
%HOra 24h (00-23)%NNanosecondi
%MMinuti (00-59)%ZTimezone (CEST, UTC)
%SSecondi (00-59)%jGiorno 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
§4.8 — Operatori di redirezione e pipe
OperatoreDescrizioneEsempio
>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 secondols -la | grep ".txt"
<Redirige un file come input di un comandosort < lista.txt
2>Redirige gli errori (stderr) su un filels xyz 2> errori.txt
2>&1Redirige stderr sullo stesso canale di stdoutcomando > out.txt 2>&1
||Esegue il secondo comando SOLO se il primo falliscemkdir /tmp/dir || echo "Errore!"
&&Esegue il secondo comando SOLO se il primo ha successoapt update && apt upgrade
§4.9 — Monitoraggio sistema e processi
ComandoDescrizioneEsempio
topMonitor interattivo in tempo reale di processi, CPU e RAMtop
top -u utenteMostra solo i processi di un determinato utentetop -u sonica_843
ps auxLista tutti i processi in esecuzione (snapshot statico)ps aux
ps aux | grepFiltra i processi per nomeps aux | grep nginx
kill PIDTermina un processo tramite il suo PIDkill 1234
kill -9 PIDForza la terminazione immediata (SIGKILL)kill -9 1234
freeMostra l'utilizzo della memoria RAM e swapfree
free -hStessa cosa con unità leggibili (MB, GB)free -h
df -hSpazio su disco per tutti i filesystem montatidf -h
du -sh dirDimensione totale di una directorydu -sh /var/log
uname -aInformazioni sul kernel e sul sistemauname -a
uptimeTempo di attività del sistema e carico mediouptime
§4.10 — systemctl — gestione dei servizi

systemctl gestisce i servizi (demoni) su sistemi con systemd. Un servizio è un programma che gira in background: server web, SSH, database, firewall ecc.

ComandoDescrizioneEsempio
systemctl start servizioAvvia un serviziosystemctl start ssh
systemctl stop servizioFerma un serviziosystemctl stop nginx
systemctl restart servizioRiavvia un serviziosystemctl restart apache2
systemctl reload servizioRicarica la config senza riavviaresystemctl reload nginx
systemctl status servizioMostra lo stato attualesystemctl status ssh
systemctl enable servizioAbilita avvio automatico al bootsystemctl enable ssh
systemctl disable servizioDisabilita l'avvio automaticosystemctl disable bluetooth
systemctl is-active servizioRisponde 'active' o 'inactive'systemctl is-active nginx
systemctl list-units --failedLista i servizi che hanno fallito
systemctl daemon-reloadRilegge i file di configurazione di systemd
journalctl -u servizioMostra i log di un serviziojournalctl -u ssh
journalctl -u servizio -fSegue i log in tempo realejournalctl -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
§4.11 — ssh — connessione remota sicura

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.

ComandoDescrizioneEsempio
ssh utente@hostConnessione base a un host remotossh sonica_843@192.168.1.10
ssh utente@host -p portaConnessione su una porta diversa dalla 22ssh mario@server.com -p 2222
ssh -i chiave.pem utente@hostConnessione con chiave privatassh -i ~/.ssh/id_rsa mario@server.com
ssh-keygenGenera una coppia di chiavi SSHssh-keygen -t rsa -b 4096
ssh-copy-id utente@hostCopia la chiave pubblica sul server remotossh-copy-id mario@192.168.1.10
scp file utente@host:percorsoCopia un file verso il serverscp backup.tar.gz mario@server:/tmp/
scp utente@host:file .Copia un file dal server in localescp mario@server:/var/log/syslog .
scp -r dir utente@host:percorsoCopia una directory interascp -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
§4.12 — history — cronologia comandi
ComandoDescrizioneEsempio
historyMostra la cronologia completa dei comandihistory
history NMostra gli ultimi N comandihistory 20
history | grepCerca un comando specifico nella cronologiahistory | grep nmap
!NRiesegue il comando numero N della cronologia!42
!!Riesegue l'ultimo comando!!
!stringaRiesegue l'ultimo comando che inizia con 'stringa'!sudo
Ctrl + RRicerca interattiva nella cronologiaCtrl+R poi: nmap
history -cCancella tutta la cronologia della sessione correntehistory -c
cat ~/.bash_history     # il file della cronologia
 comando_segreto        # uno spazio iniziale = non viene registrato in history
§4.13 — chsh — cambiare shell
ComandoDescrizione
chshAvvia la procedura interattiva per cambiare shell
chsh -s /bin/zshImposta zsh come shell di default
chsh -s /bin/bashTorna a bash come shell di default
cat /etc/shellsMostra le shell disponibili e installate
echo $SHELLMostra la shell attualmente in uso
§4.14 — curl — trasferimento dati via URL
ComandoDescrizioneEsempio
curl URLScarica il contenuto e lo stampa a schermocurl https://example.com
curl -o file URLScarica e salva con nome specificatocurl -o pagina.html https://example.com
curl -O URLScarica e salva con il nome originalecurl -O https://esempio.com/file.zip
curl -I URLMostra solo gli header HTTP della rispostacurl -I https://example.com
curl -X POST URLEsegue una richiesta POSTcurl -X POST https://api.esempio.com
curl -d 'dati' URLInvia dati nel corpo della richiesta POSTcurl -d 'nome=mario' https://api.com
curl -H 'Header' URLAggiunge un header HTTP alla richiestacurl -H 'Authorization: Bearer TOKEN' URL
curl -L URLSegue i redirect automaticamentecurl -L https://esempio.com
curl -s URLModalità silenziosa (nessun output di progresso)curl -s https://api.com | grep id
§4.15 — git — controllo versione
ComandoDescrizioneEsempio
git initInizializza un nuovo repositorygit init
git clone URLClona un repository remoto in localegit clone https://github.com/user/repo
git statusMostra lo stato dei filegit status
git add fileAggiunge un file all'area di staginggit add script.sh
git add .Aggiunge tutti i file modificatigit add .
git commit -m 'msg'Crea un commit con un messaggiogit commit -m 'Fix bug'
git log --onelineCronologia compattagit log --oneline
git diffMostra le modifiche non ancora in staginggit diff
git branchLista i branch del repositorygit branch
git checkout -b nomeCrea e passa a un nuovo branchgit checkout -b feature/login
git merge branchUnisce un branch nel branch correntegit merge feature/login
git pullScarica e integra le modifiche dal repo remotogit pull
git pushCarica i commit locali sul repository remotogit push
05

Utenti, Gruppi & Permessi

§5.1 — L'utente root e i privilegi di sistema

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!)
§5.2 — Come diventare root

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
§5.3 — Riepilogo: su vs sudo
Caratteristicasudosu
Password richiestaDell'utente CORRENTEDell'utente di DESTINAZIONE (root)
Durata privilegiSolo per il singolo comandoPer tutta la sessione (fino a exit)
Log e tracciabilitàSì, in /var/log/auth.logNo (meno tracciabile)
ConfigurazioneTramite /etc/sudoers (visudo)Basta conoscere la password di root
Uso consigliatoAmbienti multi-utente, serverAmministrazione diretta, macchine personali
Comando shell rootsudo -i oppure sudo su -su -
§5.4 — Configurazione sudo — visudo
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
§5.5 — Gestione utenti e gruppi
ComandoDescrizioneEsempio
adduser nomeCrea un nuovo utente (interattivo)adduser mario
useradd -m nomeCrea un utente non interattivouseradd -m mario
deluser nomeElimina un utente (mantiene la home)deluser mario
deluser --remove-homeElimina utente e home directorydeluser --remove-home mario
usermod -aG gruppoAggiunge un utente a un gruppousermod -aG sudo mario
usermod -L nomeBlocca un account utenteusermod -L mario
usermod -U nomeSblocca un account utenteusermod -U mario
groupadd gruppoCrea un nuovo gruppogroupadd devops
groups nomeutenteMostra i gruppi di un utentegroups mario
cat /etc/passwdLista tutti gli utenti del sistema
sudo cat /etc/shadowContiene 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
§5.6 — Permessi dei file: rwx, chmod, chown
NumeroSimboloNomeSignificato
4rreadPermesso di lettura
2wwritePermesso di scrittura
1xexecutePermesso di esecuzione
7rwxTutti i permessi (4+2+1)
6rw-Lettura e scrittura (4+2)
5r-xLettura 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
06

Bash Scripting

Uno script Bash è un file di testo contenente una sequenza di comandi che la shell esegue in ordine.

§6.1 — Struttura base e shebang
#!/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
💡 Lo shebang #!/bin/bash deve essere la prima riga assoluta del file — prima di qualsiasi spazio, riga vuota o commento.
§6.2 — Variabili — come funzionano

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!"
§6.3 — Array in Bash

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
§6.4 — Script interattivo — read
read -p "Come ti chiami? " NOME
read -sp "Password: " PASS      # -s = silent (nasconde l'input)
echo "Ciao $NOME!"
§6.5 — Condizionali — if, else, elif
if [ $NUM -gt 10 ]; then
    echo "Maggiore di 10"
elif [ $NUM -eq 10 ]; then
    echo "Esattamente 10"
else
    echo "Minore di 10"
fi
OperatoreTipoSignificato
-eqNumeriUguale (equal)
-neNumeriDiverso (not equal)
-gtNumeriMaggiore di (greater than)
-ltNumeriMinore di (less than)
-geNumeriMaggiore o uguale
-leNumeriMinore o uguale
=StringheUguale a
!=StringheDiverso da
-zStringheStringa vuota (zero length)
-fFileEsiste ed è un file regolare
-dFileEsiste ed è una directory
§6.6 — Ciclo for
# 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
§6.7 — Script di esempio completo
#!/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")"
07

Networking & Sicurezza di Rete

§7.1 — netstat & ss — statistiche di rete

netstat mostra connessioni attive, tabelle di routing e statistiche. Nelle versioni moderne è sostituito da ss (più veloce).

ComandoDescrizione
netstat -aMostra tutte le connessioni e le porte in ascolto
netstat -tMostra solo le connessioni TCP
netstat -uMostra solo le connessioni UDP
netstat -lMostra solo le porte in ascolto (LISTEN)
netstat -nMostra indirizzi e porte in formato numerico
netstat -pMostra PID e nome del processo
netstat -tulnpTCP+UDP, listening, numerico, processi
netstat -rMostra la tabella di routing del kernel
ss -tulnpAlternativa 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
§7.2 — nmap — network mapper

nmap è lo strumento standard per la scansione di reti e host. Usarlo solo su sistemi di cui si ha autorizzazione.

ComandoDescrizioneEsempio
nmap IPScansione base di un hostnmap 192.168.1.1
nmap -sV IPRileva la versione dei servizinmap -sV 192.168.1.1
nmap -O IPTenta di rilevare il sistema operativonmap -O 192.168.1.1
nmap -p N IPScansiona solo la porta Nnmap -p 22 192.168.1.1
nmap -p 1-1000 IPScansiona le porte da 1 a 1000nmap -p 1-1000 10.0.0.1
nmap -p- IPScansiona tutte le 65535 portenmap -p- 10.0.0.1
nmap -sn rete/CIDRPing scan: scopre gli host attivinmap -sn 192.168.1.0/24
nmap -A IPScansione aggressiva: OS, versioni, scriptnmap -A 192.168.1.1
nmap -sS IPSYN scan (stealth): richiede rootsudo nmap -sS 10.0.0.1
nmap -oN file IPSalva l'output in un file di testonmap -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
⚠️ Usare nmap solo su sistemi di cui si possiede l'autorizzazione esplicita. La scansione non autorizzata di reti altrui è illegale.

Script Bash — Progetto GOL

DevShell Portfolio — Script in azione

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

🖥️
DevShell — Progetto GOL CyberSecurity

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
💡 Il sito è su Firebase Hosting. Codice sorgente, esecuzione simulata e descrizione per ogni script del percorso CyberSecurity.