Tutoriel Linux

Mktemp Linux : crear un archivo temporal seguro

Débutant3 min de lecture

Un script que escribe en /tmp/rapport.txt termina creando un problema: otro lanzamiento puede ya estar utilizando este nombre, y un usuario local puede preparar un enlace simbólico en su lugar. mktemp crea el archivo o la carpeta con un nombre impredecible y lo reserva inmediatamente para el script.

Utiliza un archivo temporal para una salida intermedia y luego límpialo con trap. El script mantiene su directorio limpio incluso en caso de error o interrupción.

Carpeta temporal segura en un entorno Linux
Una carpeta temporal creada para el script y luego limpiada correctamente.

No fabriques el nombre con $$

Este antiguo hábito sigue siendo arriesgado:

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

El PID no hace que el nombre sea secreto y el archivo no se crea en el momento en que lo calculas. Entre la construcción del camino y la escritura, otro proceso puede ocupar ese nombre. mktemp crea el objeto antes de devolverte su camino.

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

El patrón debe contener al menos tres X consecutivos en su último componente. Los caracteres se reemplazan al crear. Siempre usa comillas alrededor de la variable: TMPDIR puede contener un espacio.

Crear una carpeta temporal para varios archivos

Una carpeta temporal evita dispersar varios archivos en /tmp. Es útil para un archivo a preparar, una conversión o un informe que produce archivos intermedios.

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

La mayoría de los sistemas crean este directorio con derechos reservados a tu cuenta. Verifícalo cuando el script maneje una clave, una exportación o un archivo que contenga datos sensibles:

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

Limpiar con trap sin borrar un camino incorrecto

Define la función de limpieza justo después de crear la carpeta. Asegúrate de que la variable existe y apunta al directorio esperado antes de llamar a rm -rf.

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

# procesamiento del script aquí

trap ... EXIT inicia la limpieza cuando el shell termina. Las señales HUP, INT y TERM cubren las interrupciones habituales. Una parada brusca con kill -9 no le da tiempo al shell para ejecutar esta función, así que también se debe prever una limpieza controlada para procesos grandes.

  • crea el camino con mktemp, nunca con una fecha o $$;
  • usa mktemp -d si el script produce varios archivos;
  • elimina solo una variable creada y verificada por el script;
  • mantén el archivo temporal si necesitas diagnosticar un fallo, luego elimínalo después del análisis.

La guía sobre el historial de Bash ayuda a evitar que una contraseña dada en una línea de comando permanezca en ~/.bash_history. Para archivar el resultado final, consulta también crear y extraer un archivo tar en Linux.

sudo apt update && sudo apt upgrade