Use la mktemp
utilidad para crear un archivo temporal con un nombre impredecible. No está estandarizado por POSIX, pero está disponible en * BSD y Linux.
> /tmp/predictable.$RANDOM
no 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 . mktemp
no 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 -d
y trabaje allí.
mktemp
también tiene cuidado de usar $TMPDIR
si la variable está configurada, volviendo a /tmp
si no está configurada.
Cada vez más distribuciones configuradas TMPDIR
para ser un directorio privado, por ejemplo, /run/1234/tmp
dónde 1234
está 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; /tmp
todaví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_HOME
variable 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 $RANDOM
solo 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 rand
sembrada por el tiempo de inicio. ATT Ksh's es la plataforma rand
sembrada 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.
$TMPDIR
y~/.cache
es 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/tmp
era particionar, por lo que el caché no podía llenar la/home
partición. Pero para este caso de uso que realmente no es un problema completo, entonces un subdirectorio se~/.cache
adapta perfectamente a mis necesidades y evita el problema de seguridad.