¿Podemos usar carpetas temporales como archivos temporales?
TMP=$(mktemp ... )
exec 3<>$TMP
rm $TMP
cat <&3
que se destruirá automáticamente después de esta salida de shell?
file-descriptors
tmpfs
Bob Johnson
fuente
fuente
Respuestas:
En el caso de un archivo temporal, su ejemplo en la pregunta lo crearía, luego lo desvincularía del directorio (haciéndolo "desaparecer"), y cuando el script cierra el descriptor de archivo (probablemente al finalizar), el espacio ocupado por el archivo sería reclamable por el sistema. Esta es una forma común de manejar archivos temporales en idiomas como C.
Por lo que sé, no es posible abrir un directorio de la misma manera, al menos de ninguna manera que haga que el directorio sea utilizable.
Una forma común de eliminar archivos y directorios temporales al finalizar un script es mediante la instalación de una
EXIT
trampa de limpieza . Los ejemplos de código que se proporcionan a continuación evitan tener que hacer malabarismos con los descriptores de archivos por completo.O puede llamar a una función de limpieza:
La
EXIT
trampa no se ejecutará al recibir laKILL
señal (que no puede ser atrapada), lo que significa que no se realizará ninguna limpieza en ese momento. Sin embargo, se ejecutará cuando finalice debido a una señalINT
oTERM
(si se ejecuta conbash
oksh
, en otros shells, es posible que desee agregar estas señales despuésEXIT
en latrap
línea de comando), o cuando salga normalmente debido a que llega al final del script o ejecuta unexit
llamada.fuente
.
y..
. (Probado en Linux, no sé si eso es coherente en todas las plataformas)exec another-command
obviamente.Escriba una función de shell que se ejecutará cuando finalice su script. En el siguiente ejemplo, lo llamo 'limpieza' y configuro una trampa para que se ejecute en los niveles de salida, como: 0 1 2 3 6
Vea esta publicación para más información.
fuente
cleanup
antes de una salida limpia (0) y al recibir SIGHUP (1), SIGINT (2), SIGQUIT (3) y SIGABRT (6). será no corrercleanup
cuando las salidas de guión debido a SIGTERM, SIGSEGV, SIGKILL, SIGPIPE, etc. Esto es claramente deficiente.Puede introducirlo y luego eliminarlo, siempre que no intente utilizar rutas dentro de él después:
No lo he comprobado, pero lo más probable es que sea el mismo problema cuando utilizo openat (2) en C con un directorio que ya no existe en el sistema de archivos.
Si eres root y tienes Linux, puedes jugar con un espacio de nombres separado y
mount -t tmpfs tmpfs /dir
dentro de él.Las respuestas canónicas (establecer una trampa en EXIT) no funcionan si su script se ve forzado a salir impuro (por ejemplo, con SIGKILL); eso puede dejar datos confidenciales dando vueltas.
Actualizar:
Aquí hay una pequeña utilidad que implementa el enfoque de espacio de nombres. Debería compilarse con
y
CAP_SYS_ADMIN
capacidades de archivo dadas (como root) conCuando se ejecuta (como un usuario normal) como
dejará de compartir su espacio de nombres del sistema de archivos, montará un sistema de archivos tmpfs
/proc/sysvipc
, chdir y ejecutarácommand
con los argumentos dados.command
será no heredar lasCAP_SYS_ADMIN
capacidades.Ese sistema de archivos no será accesible desde otro proceso que no se inicie
command
, y desaparecerá mágicamente (con todos los archivos que se crearon dentro de él) cuandocommand
y sus hijos mueran, sin importar cómo suceda eso. Tenga en cuenta que esto es solo compartir el espacio de nombres de montaje: no hay barreras duras entrecommand
y otros procesos ejecutados por el mismo usuario; que todavía podría colarse dentro de su espacio de nombres ya sea a través deptrace(2)
,/proc/PID/cwd
o por otros medios.El secuestro de lo "inútil"
/proc/sysvipc
es, por supuesto, una tontería, pero la alternativa hubiera sido el spam/tmp
con directorios vacíos que tendrían que ser eliminados o complicarían enormemente este pequeño programa con tenedores y esperas. Alternativamente,dir
se puede cambiar por ej./mnt/chtmp
y que sea creado por root en la instalación; no lo haga configurable por el usuario y no lo configure en una ruta de propiedad del usuario, ya que eso puede exponerlo a trampas de enlaces simbólicos y otras cosas peludas que no vale la pena perder el tiempo.chtmp.c
fuente
rm $PWD
trabajo, shell todavía está en ese directorio. Pero no se pueden poner archivos nuevos en esta "carpeta". Lo único que puede hacer es leer / escribir con el archivo & 3, y 4. Así que esto sigue siendo "archivo temporal", no "carpeta temporal".¿Necesitas un shell específico?
Si zsh es una opción, lea
zshexpn(1)
:Por ejemplo, uso esto en rifle (parte del administrador de archivos del guardabosques) para descifrar un archivo y luego ejecutar rifle en el archivo temporal, que se elimina cuando finaliza el subproceso. (no te olvides de configurar
$TERMCMD
)fuente