¿Hay formas objetivamente mejores de crear archivos temporales en scripts de bash?
Normalmente solo los nombro lo que se me ocurre, como tempfile-123, ya que se eliminará cuando termine el script. ¿Hay alguna desventaja en hacer esto además de sobrescribir un posible archivo temporal 123 en la carpeta actual? ¿O hay alguna ventaja en crear un archivo temporal de una manera más cuidadosa?
tempfile(1)
en sistemas que lo tengan.Respuestas:
La
mktemp(1)
página del manual lo explica bastante bien:En un script, invoco mktemp algo como
que crea un directorio temporal en el que puedo trabajar y en el que puedo nombrar de forma segura los archivos reales como algo legible y útil.
mktemp
no es estándar, pero existe en muchas plataformas. Las "X" generalmente se convertirán en algo aleatorio, y más probablemente sea más aleatorio; sin embargo, algunos sistemas (busybox ash, por ejemplo) limitan esta aleatoriedad más significativamente que otrosPor cierto, la creación segura de archivos temporales es importante para algo más que solo secuencias de comandos de shell. Por eso Python tiene tempfile , Perl tiene File :: Temperatura , rubí tiene de archivo temporal , etc ...
fuente
mktemp
es en combinación conbasename
, como asímktemp -dt "$(basename $0). XXXXXXXXXX"
. Si se usa sinbasename
usted, puede obtener un error como este mktemp: plantilla no válida, `/tmp/MOB-SAN-JOB1-183-ScriptBuildTask-7300464891856663368.sh.XXXXXXXXXX ', contiene un separador de directorio .mktemp -dt "$(basename $0).XXXXXXXXXX"
Es la forma correcta.$0
, hay muchos espacios en la tierra de OS X.mktemp -dt "$(basename "$0").XXXXXX"
trap "rm -rf $mydir" EXIT
Sí, usa mktemp .
Creará un archivo temporal dentro de una carpeta diseñada para almacenar archivos temporales, y le garantizará un nombre único. Produce el nombre de ese archivo:
fuente
Es posible que desee mirar
mktemp
Para más detalles: man mktemp
fuente
Los archivos temporales generalmente se crean en el directorio temporal (como
/tmp
) donde todos los demás usuarios y procesos tienen acceso de lectura y escritura (cualquier otro script puede crear los nuevos archivos allí). Por lo tanto, el script debe tener cuidado al crear los archivos, como usarlos con los permisos correctos (por ejemplo, leer solo para el propietario, verhelp umask
:) y el nombre de archivo no debe adivinarse fácilmente (idealmente al azar). De lo contrario, si los nombres de archivo no son únicos, puede crear conflictos con el mismo script ejecutado varias veces (por ejemplo, condición de carrera) o algún atacante podría secuestrar alguna información confidencial (por ejemplo, cuando los permisos son demasiado abiertos y el nombre de archivo es fácil de adivinar) o crear / reemplazar el archivo con su propia versión del código (como reemplazar los comandos o consultas SQL dependiendo de lo que se esté utilizando) almacenado).Puede usar el siguiente enfoque para crear el directorio temporal:
o archivo temporal:
Sin embargo, todavía es predecible y no se considera seguro.
Según
man mktemp
, podemos leer:Por lo tanto, para estar seguro, se recomienda usar el
mktemp
comando para crear un archivo o directorio temporal único (-d
).fuente
${0##*/}
y$$
ampliar, o vincular a alguna documentación al respecto.mktemp
es probablemente el más versátil, especialmente si planea trabajar con el archivo por un tiempo.También puede usar un operador de sustitución de procesos
<()
si solo necesita el archivo temporalmente como entrada para otro comando, por ejemplo:fuente