Tutoriel Linux

Mktemp Linux : creare un file temporaneo sicuro

Débutant3 min de lecture

Uno script che scrive in /tmp/rapport.txt finisce per creare un problema: un’altra esecuzione potrebbe già utilizzare questo nome, e un utente locale potrebbe preparare un link simbolico al tuo posto. mktemp crea il file o la cartella con un nome imprevedibile e lo riserva immediatamente allo script.

Utilizza un file temporaneo per un output intermedio, poi puliscilo con trap. In questo modo, lo script mantiene pulita la propria directory anche in caso di errore o interruzione.

Cartella temporanea sicura in un ambiente Linux
Una cartella temporanea creata per lo script e poi pulita correttamente.

Non fabbricare il nome con $$

Questa vecchia abitudine è ancora rischiosa:

tmp="/tmp/rapport-$$.txt"
echo "risultato" > "$tmp"

Il PID non rende il nome segreto e il file non viene creato nel momento in cui lo calcoli. Tra la costruzione del percorso e la scrittura, un altro processo potrebbe occupare questo nome. mktemp crea l’oggetto prima di restituirti il suo percorso.

tmp_file=$(mktemp -p "${TMPDIR:-/tmp}" rapport.XXXXXX) || exit 1
printf '%sn' "risultato" > "$tmp_file"

Il modello deve contenere almeno tre X consecutivi nel suo ultimo componente. I caratteri vengono sostituiti durante la creazione. Mantieni sempre le virgolette attorno alla variabile: TMPDIR può contenere uno spazio.

Creare una cartella temporanea per più file

Una cartella temporanea evita di spargere più file in /tmp. È utile per un’archiviazione da preparare, una conversione o un rapporto che produce file intermedi.

workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" salvataggio.XXXXXX) || exit 1
printf '%sn' "dati" > "$workdir/lista.txt"
tar -czf "$workdir/rapporto.tar.gz" "$workdir/lista.txt"

La maggior parte dei sistemi crea questa directory con diritti riservati al tuo account. Controllalo quando lo script gestisce una chiave, un’export o un’archiviazione contenente dati sensibili:

stat -c '%a %U:%G %n' "$workdir"
ls -la "$workdir"

Pulire con trap senza cancellare un percorso errato

Definisci la funzione di pulizia subito dopo la creazione della cartella. Verifica che la variabile esista e punti alla directory attesa prima di richiamare rm -rf.

workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" mio-script.XXXXXX) || exit 1
cleanup() {
  [ -n "${workdir:-}" ] && [ -d "$workdir" ] && rm -rf -- "$workdir"
}
trap cleanup EXIT HUP INT TERM

# trattamento dello script qui

trap ... EXIT avvia la pulizia quando la shell termina. I segnali HUP, INT e TERM coprono le interruzioni abituali. Un arresto forzato con kill -9 non lascia alla shell il tempo di eseguire questa funzione, quindi è necessario prevedere anche una pulizia controllata per i grandi trattamenti.

  • crea il percorso con mktemp, mai con una data o $$;
  • utilizza mktemp -d se lo script produce più file;
  • elimina solo una variabile creata e verificata dallo script;
  • mantieni il file temporaneo se devi diagnosticare un fallimento, poi eliminalo dopo l’analisi.

Guida su la cronologia di Bash aiuta ad evitare che una password fornita su una riga di comando rimanga in ~/.bash_history. Per archiviare il risultato finale, consulta anche creare ed estrarre un archivio tar su Linux.