Linux / Comando mktemp: crear archivos y directorios temporales de forma segura
mktemp crea archivos o directorios temporales de forma atómica con un nombre único difícil de predecir y muestra la ruta. Esto puede reducir colisiones de nombres y condiciones de carrera con enlaces simbólicos en comparación con la creación de nombres directamente con el ID del proceso.
Este artículo explica el uso de plantillas, la creación de directorios temporales, la selección de la ubicación con TMPDIR, la limpieza usando trap de shell y los usos de -u que se deben evitar.
¿Qué es el comando mktemp?
mktemp reemplaza de manera aleatoria los X consecutivos en una plantilla, crea el archivo o directorio con ese nombre y luego muestra la ruta. Al especificar una plantilla, normalmente se requieren 3 o más X consecutivos en el último componente de la ruta. La ruta generada puede incluir espacios, por lo que siempre debe usarse entre comillas.
Sintaxis básica
mktemp [OPCIONES] [PLANTILLA]
Si el nombre de archivo o ruta contiene espacios, se debe poner entre comillas, y los nombres que comienzan con un guion se deben especificar después de -- si es posible. Las opciones soportadas pueden variar según la distribución y la versión de GNU Coreutils, por lo que consulte la descripción del sistema actual con mktemp --help y man mktemp.
Uso básico de mktemp
Crear un archivo temporal
Si se omite la plantilla, se crea un archivo único según la política del directorio temporal del sistema y se muestra la ruta.
tmp_file=$(mktemp) || exit 1
printf '%s\n' "$tmp_file"
Especificar el formato del nombre
Los últimos X consecutivos se convertirán en una cadena única. Si se necesita una extensión, se puede agregar después de la plantilla o usar --suffix.
mktemp report-XXXXXXXX.csv
mktemp --suffix=.log app-XXXXXXXX
Crear un directorio temporal
-d crea un directorio. En GNU, los permisos iniciales permiten lectura y escritura al propietario y, para directorios, también acceso; la máscara umask solo puede restringirlos más. Esto no impide el acceso de administradores con los privilegios necesarios ni sustituye la revisión del directorio padre.
tmp_dir=$(mktemp -d) || exit 1
printf '%s\n' "$tmp_dir"
Verificar la ruta creada
mktemp devuelve la ruta del archivo temporal creado de forma segura a la salida estándar. No intente adivinar el nombre al crearlo ni confíe solo en el resultado de -u.
tmpfile=$(mktemp)
printf '%s\n' "$tmpfile"
test -f "$tmpfile"
echo $?
Si la creación tiene éxito, verá una ruta y el estado 0 del chequeo. La ruta cambia en cada ejecución. En un script real, compruebe la asignación inmediatamente con || exit 1, como en los otros ejemplos, antes de usar la variable. Al terminar, retire únicamente el archivo que acaba de crear, con la variable entre comillas.
Opciones principales
| Opciones | Descripción |
|---|---|
-d, --directory |
Crea un directorio en lugar de un archivo temporal. |
-p DIR, --tmpdir=DIR |
Usa la plantilla en función del directorio especificado. |
--tmpdir |
Si se usa sin argumentos, utilizará TMPDIR o el directorio temporal predeterminado. |
--suffix=SUFFIX |
Agregar un sufijo después del nombre generado. |
-q, --quiet |
Oculta el diagnóstico de fallo de creación, pero mantiene el estado de salida. |
-u, --dry-run |
Solo imprime el nombre y no lo crea. No debe usarse con fines de seguridad debido a condiciones de carrera. |
Las opciones largas facilitan entender su significado y también ayudan a revisar scripts. Sin embargo, en scripts donde la portabilidad es importante, primero verifique si el sistema objetivo soporta esas opciones de extensión GNU.
Ejemplos de uso práctico
Limpiar archivos temporales con trap
Los ejemplos con trap son scripts Bash independientes: no los pegue en una shell interactiva con otras trampas ya configuradas. Registre la limpieza después de comprobar la creación. La trampa EXIT limpia al salir de la shell. Las trampas de HUP, INT y TERM mostradas limpian al capturar esas señales, pero no fuerzan por sí solas la terminación del script: no añada trabajo posterior que dependa del temporal después de una señal. SIGKILL y una caída del sistema impiden ejecutar la limpieza.
tmp_file=$(mktemp) || exit 1
trap 'rm -f -- "$tmp_file"' EXIT HUP INT TERM
printf '%s\n' 'temporary data' > "$tmp_file"
Usar un directorio de trabajo temporal
Si se necesitan varios archivos intermedios, es más fácil de gestionar crear un solo directorio temporal y usar nombres fijos dentro de él.
work_dir=$(mktemp -d) || exit 1
trap 'rm -rf -- "$work_dir"' EXIT HUP INT TERM
input=$work_dir/input
output=$work_dir/output
Seleccionar el directorio padre deseado
Si se requiere un cambio de nombre atómico en el mismo sistema de archivos o si las políticas de espacio y seguridad son diferentes, especifique la ubicación con -p. El directorio debe existir previamente.
mkdir -p "$HOME/.cache/myapp"
cache_file=$(mktemp -p "$HOME/.cache/myapp" cache-XXXXXXXX) || exit 1
Comparación con comandos relacionados con mktemp
| Comando / método | Rol principal | Situaciones adecuadas |
|---|---|---|
mktemp |
Crear un nombre único y crear el elemento de inmediato | Archivos y directorios temporales seguros |
touch |
Crear un archivo con un nombre fijo especificado | Archivo normal sin riesgo de colisión |
mkdir |
Crear un directorio con un nombre fijo especificado | Ruta permanente o predefinida |
mktemp -u |
Solo se imprimen nombres no utilizados | No es adecuado para la creación de archivos de seguridad |
Precauciones al usar
No crear archivos con el resultado de -u
Otro proceso puede acaparar la misma ruta entre el momento en que se imprime el nombre y la creación real del archivo. Permita que los archivos temporales sean creados directamente por mktemp en lugar de -u.
Encierre las variables del comando de limpieza entre comillas
Si una ruta vacía o que contiene espacios se expande incorrectamente, se pueden eliminar archivos incorrectos. Confirme que la creación fue exitosa y utilice como rm -- "$variable".
Verifique la ubicación de almacenamiento de datos sensibles
Depende del sistema si el directorio temporal es un sistema de archivos en memoria o en disco, y si se incluye en respaldos, intercambios o instantáneas. Verifique por separado la política de datos sensibles.
FAQ
¿Por qué mktemp es más seguro que usar nombres de archivos temporales con ID de proceso?
Porque elige un nombre difícil de predecir y crea el archivo en un solo paso, reduciendo la posibilidad de que otros lo tomen y evitando condiciones de carrera con enlaces simbólicos.
¿Cómo se crea un directorio temporal?
Utilice mktemp -d y guarde la ruta devuelta en una variable, luego úsela entre comillas.
¿Se eliminan automáticamente los archivos temporales creados?
En general, no se eliminan automáticamente. En scripts de shell, registre la limpieza al finalizar usando trap.
¿Cuándo se usa TMPDIR?
--tmpdir se puede usar para seleccionar la ubicación de los archivos temporales en el uso o funcionamiento básico de las plantillas. Verifique el comportamiento real en la ayuda de la versión instalada.
La Lista de comandos de uso frecuente en Linux ayuda a distinguir las herramientas de creación. Las reglas de plantillas y opciones se detallan en la Documentación oficial de GNU Coreutils mktemp y en el Manual oficial de GNU Coreutils.




