Punti chiave
- Esecuzione rapida e fallimentare della shell: rende più rigorosa l’esecuzione utilizzando l’opzione -Eeuo pipefail, in modo che gli script terminino immediatamente in caso di errori, variabili mancanti o passaggi della pipeline non riusciti, e utilizzare trap su EXIT per la pulizia automatica.
- Automazione idempotente: previene la deriva della configurazione e l’esecuzione di operazioni duplicate utilizzando controlli di stato condizionali (if), il blocco dei file (flock) e le modalità obbligatorie –dry-run.
- Sicurezza delle credenziali: non inserire mai secret in modo statico nei file .sh; inseriscili in modo dinamico tramite variabili d’ambiente, keychain del sistema operativo (secret-tool, security) o token vault a breve durata.
- Compatibilità multipiattaforma: standardizza i percorsi relativi utilizzando SCRIPT_DIR con risoluzione dei collegamenti simbolici, tieni conto delle differenze tra le utility BSD e GNU e correggere i caratteri di fine riga CRLF su Windows WSL.
- Test automatizzati e preventivi: previeni gli errori relativi ai percorsi contenenti spazi utilizzando virgolette strette per le variabili (ad es., “$VAR”) e verifica la validità del codice tramite il linting di ShellCheck e i controlli sui pull request nell’ambito della CI.
- Esecuzione non interattiva di RMM: progetta script in background senza richieste interattive (ad es., read -p), passa flag espliciti di esecuzione silenziosa (-y) e presupponi contesti di esecuzione come root/SYSTEM.
Puoi scoprire su come automatizzare le attività con gli script Bash scrivendo script di shell ripetibili per il provisioning, i backup, la rotazione dei log e i controlli di sistema, invece di eseguire i comandi manualmente. Questa guida illustra le best practice, i modelli e le misure di sicurezza che garantiscono l’esecuzione sicura dell’automazione su larga scala, oltre a spiegare come applicarle su Linux, macOS e Windows.
Questa guida spiega come automatizzare le attività IT tramite script Bash, illustrando le principali best practice quali la registrazione degli eventi, la gestione degli errori e il controllo delle versioni. Mostra inoltre come applicare i modelli di idempotenza e una gestione sicura delle credenziali per garantire la sicurezza dell’automazione su larga scala, oltre a tecniche di test e consigli multipiattaforma per l’esecuzione di Bash su Linux, macOS e Windows tramite WSL. La guida è rivolta agli MSP e ai team IT interni impegnati nella creazione di flussi di lavoro automatizzati affidabili e verificabili
Che cos’è la programmazione con gli script Bash?
La programmazione con script Bash consiste nella scrittura di script di shell per la Bourne Again SHell (BASH) al fine di automatizzare le attività di routine. Puoi scrivere comandi, strutture di controllo e funzionalità in file .sh in testo semplice che vengono eseguiti dall’interprete bash. Per molti team, l’automazione tramite script Bash è alla base dell’amministrazione di Linux e della gestione quotidiana degli endpoint.
Puoi automatizzare tramite script le operazioni di provisioning degli utenti, i backup, la rotazione dei log, l’inventario di sistema e il riavvio dei servizi, invece di digitare i comandi manualmente. In questo modo ridurrai gli errori di battitura e grantirai che ogni esecuzione segua la stessa logica. Quando archivi gli script nel sistema di controllo delle versioni, otterrai anche una traccia di controllo e una risoluzione più rapida dei problemi.
Che tu sia un MSP che gestisce numerosi clienti o un responsabile IT interno incaricato di un parco macchine eterogeneo, l’automazione tramite Bash ti fa risparmiare tempo e riduce i rischi operativi. Per informazioni sulla sintassi e sulle funzionalità di Bash, consulta il manuale GNU Bash.
Best practice per lo scripting Bash
L’adozione dell’automazione tramite Bash è solo il primo passo verso la creazione di flussi di lavoro operativi ripetibili. Per garantire l’affidabilità degli script su larga scala, sono necessarie misure di controllo che rendano i risultati prevedibili e verificabili. Queste best practice per la scrittura di script in Bash costituiscono una base solida.
Incorpora la registrazione degli eventi e la gestione degli errori negli script
La registrazione e la gestione degli errori dovrebbero essere una prassi standard in ogni script. Senza di essi, i malfunzionamenti passano inosservati e perdi il contesto necessario per risolvere rapidamente i problemi.
Crea una semplice funzionalità di registrazione che acquisisca i timestamp, i nomi degli script e i codici di uscita, per poi invia le voci a syslog o a una piattaforma di registrazione centralizzata. Aggiungi un meccanismo di intercettazione degli errori per rilevare i malfunzionamenti, registrarne la causa e inviare un avviso a un canale monitorato dal tuo team.
Rendi l’esecuzione più rigorosa impostando -Eeuo pipefail, in modo che le uscite diverse da zero, le variabili non definite e gli errori in qualsiasi punto della pipeline causino l’interruzione immediata dello script. L’uso di || true è accettabile solo quando vuoi ignorare deliberatamente un errore; registra tali casi in modo che i revisori ne comprendano l’intento. Accompagna le operazioni rischiose con messaggi chiari prima e dopo, in modo da rendere più comprensibili i runbook e le analisi post-evento.
Assicurati sempre di ripulire dopo eventuali errori con trap: quando gli script falliscono rapidamente, i file di blocco o le directory temporanee rimasti possono bloccare le esecuzioni successive. Utilizza una trap EXIT per garantire la pulizia indipendentemente dal modo in cui lo script termina:
# Create temp directory and ensure it wipes on exit
TMP_DIR=”$(mktemp -d)”
cleanup() {
rm -rf “$TMP_DIR”
# Release any held lockfiles here
}
trap cleanup EXIT
Definisci i flussi di lavoro relativi al controllo delle versioni e alla revisione tra pari
Il controllo delle versioni non è facoltativo quando estendi l’automazione tramite script Bash. Git offre cronologia, possibilità di ripristino e tranciabilità, e consente la revisione tra pari per individuare eventuali problemi prima della messa in produzione.
Di seguito sono riportati alcuni consigli sul controllo delle versioni e sulla revisione tra pari:
- Conserva gli script in un repository dedicato denominato “scripts/”, con sottocartelle ben definite per dominio, come “users”, “backup” o “conformità”.
- Richiedi pull request per ogni modifica e assegna almeno un revisore.
- Utilizza strategie di ramificazione quali rami di funzionalità di breve durata e un ramo principale protetto.
- Imporre l’inserimento nei messaggi di commit di riferimenti ai ticket o alle descrizioni delle modifiche, a fini di tracciabilità.
Standardizza i nuovi modelli di script con intestazioni relative a responsabile, scopo, dipendenze e codici di uscita previsti. Collega il repository al sistema di integrazione continua (CI) per eseguire il linting, i test unitari o le simulazioni su ogni pull request, in modo da individuare tempestivamente eventuali regressioni.
Integra idempotenza e sicurezza
Per considerare Bash come un framework di automazione, integra l’idempotenza e la gestione rigorosa delle informazioni riservate. Questi due pilastri impediscono il ripetersi degli effetti collaterali e l’esposizione delle credenziali durante le esecuzioni di routine.
Applicare i modelli di idempotenza per un’automazione sicura
Idempotenza significa che l’esecuzione dello stesso script più volte porta allo stesso stato. Ci si arriva grazie a clausole di sicurezza, controlli da parte dello stato e simulazioni che verificano la correttezza delle azioni prima che queste abbiano luogo.
Verifica lo stato attuale prima di modificarlo. Ad esempio, verifica che un utente esista prima di creare l’account, oppure confermare che un pacchetto sia già installato prima di tentare l’installazione. Utilizza i blocchi sui file o i controlli dell’ID processo (PID) per impedire l’esecuzione simultanea di operazioni che potrebbero entrare in conflitto tra loro.
Di seguito sono riportati alcuni modelli comuni di idempotenza:
- Verifica lo stato attuale tramite test condizionali, ad esempio:
| if id -u “$username” >/dev/null 2>&1; then SCRIPT_DIR=”$(cd — “$(dirname “$0″)” >/dev/null 2>&1 && pwd)” –dry-run |
or
| if [[ -d /opt/app ]]; then # directory exists fi |
- Aggiungi un’opzione –dry-run che visualizzi i comandi invece di eseguirli, in modo che i revisori possano verificare la logica.
- Utilizza i blocchi sui file tramite flock o lockfiles per impedire che esecuzioni parallele agiscano sullo stesso oggetto.
Standardizzando questi modelli nell’ambito dell’automazione con Bash, eviterai modifiche duplicate, aggiornamenti parziali e deviazioni nella configurazione.
Gestire le credenziali in modo sicuro negli script Bash
Inserisci le credenziali in modo statico è un rischio che non puoi correre. Utilizza archivi gestiti e l’inserimento effimero, in modo che le credenziali non vengano mai conservate in chiaro né nei log.
Ti consigliamo di prendere in considerazione le seguenti tecniche per la gestione delle credenziali:
- Utilizza gli strumenti keyring del sistema operativo per recuperare le informazioni riservate durante l’esecuzione, come secret-tool su Linux o la CLI di sicurezza su macOS.
- Leggi i valori delle variabili dell’ambiente inserite dal tuo sistema CI/CD o di orchestrazione con ambiti limitati.
- Integra un vault come HashiCorp Vault utilizzando strumenti CLI o chiamate API con token a breve durata.
- Non inserire mai nomi utente, password o token nei file di script, nei valori predefiniti o nei log.
Collega l’accesso a criteri basati sui ruoli e ruota le credenziali secondo un calendario prestabilito. Questo garantisce la soddisfazione dei revisori e limita l’entità del danno in caso di fuga di un token.
Implementa i flag per i test e le simulazioni
Esegui i test in ambiente locale e nella pipeline di integrazione continua (CI) prima che i tuoi script vengano applicati all’ambiente di produzione. Senza un ciclo di test, anche un errore logico di lieve entità può interrompere le finestre delle patch o delle modifiche.
Lint con ShellCheck per individuare errori di sintassi e di logica che bash ignora tranquillamente. Puoi eseguirlo localmente o in CI utilizzando il progetto ufficiale disponibile su GitHub.
Nota sull’espansione delle variabili: inserisci sempre le variabili tra virgolette (ad esempio, “$VAR” invece di $VAR). Le variabili non racchiuse tra virgolette sono soggette alla suddivisione in parole e al globbing, il che causa il malfunzionamento degli script o comportamenti dannosi ogni volta che i nomi dei percorsi contengono spazi (ad esempio, Program Files o User Profiles).
Aggiungi test di tipo unitario per le funzionalità principali, simulando gli input e verificando gli output o le modifiche al file system.
Aggiungi una modalità –dry-run che visualizzi le azioni che lo script eseguirebbe, quindi configura il tuo sistema di CI in modo che esegua sia i test di linting che quelli in modalità dry-run su ogni pull request. Per le modifiche che comportano un rischio maggiore, pianifica esecuzioni notturne in un ambiente di test e richiedere la promozione manuale all’ambiente di produzione per ridurre il rischio di implementazione.
Suggerimenti multipiattaforma per l’automazione tramite script Bash
Bash funziona su Linux, macOS e Windows tramite il sottosistema Windows per Linux (WSL), ma le differenze nei percorsi, nelle shell e negli strumenti possono causare problemi. Prevedi queste variazioni in modo che l’automazione tramite script Bash funzioni allo stesso modo ovunque la esegui.
Consiglio dell’esperto: se i tuoi script vengono richiamati tramite collegamenti simbolici (come spesso accade nelle configurazioni Linux /usr/local/bin), il comando dirname da solo potrebbe restituire il percorso del collegamento anziché quello effettivo dello script. Risolvi i collegamenti simbolici in modo dinamico con “readlink” o “realpath”:
SCRIPT_DIR=”$(cd — “$(dirname “$(readlink -f “$0” 2>/dev/null || echo “$0″)”)” >/dev/null 2>&1 && pwd)”
Quando si scrivono script multipiattaforma:
- normalizza i percorsi ricavando le directory degli script con:
SCRIPT_DIR=”$(cd — “$(dirname “$0″)” >/dev/null 2>&1 && pwd)”, quindi fai riferimento ai file relativi a partire da $SCRIPT_DIR. - Rileva il sistema operativo con uname o $OSTYPE, quindi installa o richiama le dipendenze in base al risultato.
- Per uniformare il comportamento degli strumenti nelle utilità BSD fornite con macOS, installare GNU coreutils tramite Homebrew e richiamare gsed, gdate oppure utilizzare gli alias g*.
Su Windows WSL, presta attenzione alle terminazioni di riga CRLF e alla conversione dei percorsi tra i file system di Windows e Linux. Su macOS, la shell predefinita potrebbe essere zsh, quindi imposta lo shebang su #!/usr/bin/env bash e assicurati che Bash sia installato.
Account per l’esecuzione non interattiva di RMM
Quando distribuisci script Bash tramite un RMM o un agente endpoint, questi vengono eseguiti in una shell non interattiva senza TTY (terminale).
- Non richiedere mai l’inserimento di dati da parte dell’utente: Evita comandi come “read -p” o opzioni di conferma interattiva.
- Inserisci in modo fisso i flag silenziosi: passa sempre i parametri non interattivi ai gestori di pacchetti e alle utilità (ad esempio, apt-get install -y o curl -sS).
- Supponi il contesto root/SYSTEM: assicurati che il percorso sia impostato esplicitamente in base agli ambienti di sistema, anziché fare affidamento sulle variabili d’ambiente locali ~/.bashrc dell’utente.
Conclusione sul framework Bash
Combina la registrazione, la gestione degli errori e il controllo delle versioni con l’idempotenza e la protezione dei segreti per trasformare gli script ad hoc in un framework di automazione affidabile. Aggiungi i test locali e di integrazione, oltre ai controlli multipiattaforma, e la tua automazione Bash garantirà risultati coerenti su Linux, macOS e Windows WSL.
Se stai creando una raccolta di script, documenta i proprietari, le dipendenze e le procedure di rollback, quindi applica queste best practice per la scrittura di script Bash a ogni nuova aggiunta.
Sei pronto ad automatizzare più rapidamente e a recuperare ore di lavoro di routine?
Con la piattaforma di gestione degli endpoint NinjaOne, puoi eseguire script Bash su richiesta, secondo una pianificazione prestabilita o in base a condizioni definite dai criteri su tutto il parco dispositivi, grazie alle funzionalità integrate di registrazione e pianificazione. Avvia una prova gratuita di NinjaOne per provare l’automazione Bash sui tuoi endpoint.
