Use la mktemputilidad para crear un archivo temporal con un nombre impredecible. No está estandarizado por POSIX, pero está disponible en * BSD y Linux.
> /tmp/predictable.$RANDOMno es una buena opción porque es mayormente predecible¹, lo que abre su secuencia de comandos a un ataque en el que el atacante puede engañar a su secuencia de comandos para que sobrescriba un archivo al que tiene acceso de escritura, o para darles acceso al archivo temporal. Esta es una vulnerabilidad de archivo temporal insegura . mktempno tiene esta vulnerabilidad porque crea el archivo de forma segura (no sobrescribirá un archivo existente, incluso si están involucrados enlaces simbólicos) y usa un nombre suficientemente impredecible para evitar una denegación de servicio.
Si crear un archivo temporal y trabajar con él no es lo suficientemente bueno, cree un directorio temporal mktemp -dy trabaje allí.
mktemptambién tiene cuidado de usar $TMPDIRsi la variable está configurada, volviendo a /tmpsi no está configurada.
Cada vez más distribuciones configuradas TMPDIRpara ser un directorio privado, por ejemplo, /run/1234/tmpdónde 1234está su UID. Esto elimina el riesgo de vulnerabilidades de archivos temporales, a costa de no poder compartir archivos temporales entre usuarios (lo que ocasionalmente es útil, pero no muy a menudo; /tmptodavía está disponible, pero no lo es TMPDIR).
Si necesita un nombre de archivo reproducible, cree un archivo con un nombre bien definido (sin componente aleatorio) en el directorio de inicio del usuario. La convención moderna es la especificación del directorio de usuarios XDG . Si el archivo puede eliminarse sin causar pérdida de datos, use la XDG_CACHE_HOMEvariable de entorno, por defecto ~/.cache. Probablemente debería crear un subdirectorio con el nombre de su aplicación y trabajar allí.
CACHE_DIR="${XDG_CACHE_HOME:-"$HOME/.cache"}"/Wildcard-scripts
[ -d "$CACHE_DIR" ] || mkdir -p -- "$CACHE_DIR"
CACHE_FILE="$CACHE_DIR/tmpfileformyscript"
¹ No solo $RANDOMsolo toma 32767 valores posibles, sino que es fácil de predecir sin siquiera probar muchos valores. El generador de números aleatorios de Bash es un LCG sembrado por el PID y el momento del primer uso. Zsh es la plataforma randsembrada por el tiempo de inicio. ATT Ksh's es la plataforma randsembrada por PID. Mksh's es un LCG con una semilla más compleja, pero aún no de calidad de seguridad. Todos ellos pueden predecirse mediante otro proceso con una probabilidad bastante grande de éxito.
$TMPDIRy~/.cachees exactamente lo que necesitaba. Después de pensarlo un poco más, me di cuenta de que la única razón por la que lo quería/tmpera particionar, por lo que el caché no podía llenar la/homepartición. Pero para este caso de uso que realmente no es un problema completo, entonces un subdirectorio se~/.cacheadapta perfectamente a mis necesidades y evita el problema de seguridad.