Tutoriel Linux

Mktemp Linux: crear un archivo temporal seguro

Débutant3 min de lecture

Un script que escribe en /tmp/rapport.txt termina por crear 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 el directorio con un nombre impredecible y lo reserva inmediatamente para el script.

Utilice un archivo temporal para una salida intermedia, y luego bórrelo con trap. De este modo, el script mantiene su directorio limpio incluso en caso de error o interrupción.

Directorio temporal seguro en un entorno Linux
Un directorio temporal creado para el script y luego limpiado correctamente.

No fabrique 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 calcula. Entre la construcción de la ruta y la escritura, otro proceso puede ocupar ese nombre. mktemp crea el objeto antes de devolverle su ruta.

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

El modelo debe contener al menos tres X consecutivos en su último componente. Los caracteres se reemplazan al momento de la creación. Mantenga siempre las comillas alrededor de la variable: TMPDIR puede contener un espacio.

Crear un directorio temporal para varios archivos

Un directorio temporal evita dispersar varios archivos en /tmp. Esto es útil para un archivo que preparar, una conversión o un reporte que produce archivos intermedios.

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

La mayoría de los sistemas crean este directorio con derechos reservados a su cuenta. Verifíquelo cuando el script manipule 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

Defina la función de limpieza justo después de la creación del directorio. Verifique que la variable exista y que apunte 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 abrupta con kill -9 no deja al shell tiempo para ejecutar esta función, por lo que también se debe prever una limpieza controlada para los grandes procesos.

  • crea el camino con mktemp, nunca con una fecha o $$;
  • use mktemp -d si el script produce varios archivos;
  • borrar únicamente una variable creada y verificada por el script;
  • mantenga el archivo temporal si debe diagnosticar un fallo, luego elimínelo 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, consulte también crear y extraer un archivo tar en Linux.

sudo apt update && sudo apt upgrade