C’è un vecchio adagio tra i sistemisti: “Se devi fare un’operazione per la terza volta, scrivi uno script”.
L’automazione non serve solo a risparmiare tempo, ma a ridurre l’errore umano e a trasformare la gestione dell’infrastruttura da reattiva (intervengo quando qualcosa si rompe) a proattiva (il sistema si ripara da solo o mi avvisa prima di rompersi).
In questo articolo, esploreremo una serie di script “salvavita” pronti all’uso, testati sul campo per risolvere i problemi più comuni nell’amministrazione di server Linux e ambienti Windows.
1. Il “Watchdog” di Connettività (Bash)
Le interfacce di rete o i tunnel VPN (come WireGuard o OpenVPN) possono bloccarsi per micro-disconnessioni del provider. Invece di accorgerti del problema quando un utente non riesce a collegarsi, puoi usare un “cane da guardia” che verifica la connessione e riavvia il servizio autonomamente.
Questo script pinga un indirizzo affidabile (es. i DNS di Google). Se il ping fallisce per 3 volte di fila, riavvia l’interfaccia di rete e registra l’evento in un log.
#!/bin/bash
# Nome: vpn-watchdog.sh
TARGET="8.8.8.8"
LOGFILE="/var/log/network-watchdog.log"
SERVICE="wg-quick@wg0" # Sostituisci con il tuo servizio (es. networking, openvpn)
# Esegue 3 ping. Redirige l'output nel vuoto per non sporcare la shell
ping -c 3 $TARGET > /dev/null 2>&1
# $? legge il codice di uscita dell'ultimo comando. 0 = Successo, 1 = Fallito
if [ $? -ne 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Connessione a $TARGET fallita. Riavvio $SERVICE..." >> $LOGFILE
systemctl restart $SERVICE
else
# Opzionale: commenta questa riga in produzione per non riempire i log inutilmente
echo "$(date '+%Y-%m-%d %H:%M:%S') - Connessione OK." >> $LOGFILE
fi
Implementazione: Salvalo in /usr/local/bin/vpn-watchdog.sh, rendilo eseguibile (chmod +x) e aggiungilo al tuo crontab di root per girare ogni 5 minuti (*/5 * * * * /usr/local/bin/vpn-watchdog.sh).
2. Allarme Spazio Disco in Esaurimento (Bash)
Un server con la partizione di root (/) piena al 100% andrà inevitabilmente in kernel panic o corromperà i database in esecuzione. Questo script controlla l’utilizzo del disco e, se supera una soglia definita, invia una notifica (in questo caso tramite Webhook a Telegram, Slack o Make.com).
#!/bin/bash
# Nome: disk-alert.sh
THRESHOLD=90 # Soglia di allarme al 90%
PARTITION="/" # Partizione da monitorare
WEBHOOK_URL="https://tuo-webhook-url.com"
# Estrae la percentuale di utilizzo della partizione, rimuovendo il simbolo %
CURRENT_USAGE=$(df -h $PARTITION | awk 'NR==2 {print $5}' | sed 's/%//g')
if [ "$CURRENT_USAGE" -gt "$THRESHOLD" ]; then
MESSAGE="⚠️ ALLARME: Lo spazio sul server per la partizione $PARTITION ha raggiunto il $CURRENT_USAGE%!"
# Invia la notifica via POST (formato JSON)
curl -X POST -H "Content-Type: application/json" \
-d "{\"text\": \"$MESSAGE\"}" $WEBHOOK_URL
fi
Consiglio di Sicurezza
Non inserire mai token API in chiaro negli script se risiedono in cartelle accessibili ad altri utenti. Usa un file di configurazione separato con permessi
600(leggibile solo da root) ed esporta le variabili.
3. Pulizia Automatica dei File Temporanei (PowerShell)
In ambiente Windows Server (o sulle workstation dei dipendenti), le cartelle temporanee, le cache dei log applicativi o i vecchi backup di IIS tendono a saturare i dischi nel corso dei mesi.
Questo script PowerShell è letale ed efficiente: cerca in una directory specifica tutti i file più vecchi di “X” giorni e li elimina forzatamente.
# Nome: AutoCleanup.ps1
$TargetFolder = "C:\inetpub\logs\LogFiles"
$DaysToKeep = 30
$CurrentDate = Get-Date
# Calcola la data limite
$ExpirationDate = $CurrentDate.AddDays(-$DaysToKeep)
# Cerca e distruggi
Get-ChildItem -Path $TargetFolder -Recurse |
Where-Object { -not $_.PSIsContainer -and $_.LastWriteTime -lt $ExpirationDate } |
Remove-Item -Force
Write-Output "Pulizia completata. File più vecchi di $DaysToKeep giorni rimossi da $TargetFolder."
Implementazione: Esegui lo script tramite Utilità di pianificazione (Task Scheduler) impostando un trigger settimanale. Ricorda di eseguire il task con privilegi più elevati (“Esegui con i privilegi massimi”) e di impostare le policy di esecuzione correttemente (Set-ExecutionPolicy RemoteSigned).
4. Backup delle Configurazioni (Bash + Tar)
Se ti modifichi le configurazioni di un server (/etc/nginx, /etc/postfix, file del firewall) e commetti un errore, tornare indietro senza un backup può costarti ore. Questo mini-script crea un archivio compresso della cartella /etc e lo salva aggiungendo il timestamp al nome del file, ruotando i backup più vecchi di 7 giorni.
#!/bin/bash
# Nome: config-backup.sh
BACKUP_DIR="/opt/backups/etc"
SOURCE_DIR="/etc"
DATE=$(date +%Y-%m-%d_%H-%M)
# Crea la directory di backup se non esiste
mkdir -p $BACKUP_DIR
# Crea l'archivio tar.gz
tar -czf "$BACKUP_DIR/etc_backup_$DATE.tar.gz" $SOURCE_DIR > /dev/null 2>&1
# Elimina i backup più vecchi di 7 giorni per non saturare il disco
find $BACKUP_DIR -type f -name "*.tar.gz" -mtime +7 -exec rm {} \;
echo "Backup di $SOURCE_DIR completato: etc_backup_$DATE.tar.gz"
Conclusioni: L’Importanza dei Log
L’automazione è cieca. Uno script che esegue operazioni in background deve sempre lasciare una traccia scritta di ciò che fa. Un errore comune è creare automatismi brillanti ma “silenziosi”. Se uno script di pulizia cancella per sbaglio la directory sbagliata, senza un file di log (generato tramite >> /var/log/mio-script.log o Write-Output in Windows) non saprai mai cosa è successo, a che ora, e perché.
Tratta i tuoi script come veri e propri servizi di sistema: falli loggare, monitorali e testa sempre in un ambiente di staging prima di affidargli compiti di produzione.
