tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
A diferencia de la creación de archivos normal, que es propensa a ser secuestrada por un archivo existente o un enlace simbólico, la creación de una canalización de nombre mkfifoo la función subyacente crea un nuevo archivo en el lugar especificado o falla. Algo así : >fooes inseguro porque si el atacante puede predecir el resultado, mktempentonces el atacante puede crear el archivo de destino por sí mismo. Pero mkfifo foofallaría en tal escenario.
Si necesita portabilidad POSIX completa, mkfifo -m 600 /tmp/myfifoes seguro contra el secuestro pero propenso a una denegación de servicio; sin acceso a un generador de nombre de archivo aleatorio fuerte, necesitaría administrar los intentos de reintento.
Si no le importan los sutiles problemas de seguridad relacionados con los archivos temporales, puede seguir una regla simple: crear un directorio privado y mantener todo allí.
tmpdir=
cleanup () {
if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
if [ -n "$1" ]; then kill -$1 $$; fi
}
tmpdir=$(mktemp -d)
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
mkfifo "$tmpdir/pipe"
Gilles 'SO- deja de ser malvado'
fuente
trap "rm -rf '$tempdir'" EXIT HUP INT TERM? ¿Puede trap hacer su propia expansión variable?$tempdiren el momento en quetrapse evalúa el comando, no en el momento en que se activa la trampa. En este caso, no hace ninguna diferencia, excepto que su código se rompe horriblemente si el valor detempdircontiene una comilla simple, mientras que mi código siempre funciona.$tempdirfue declarado localmente y debe definirse globalmente para que trap tenga acceso a él. Tiene sentido ahora ...$tempdirvalor tampoco cambie, lo cual es aceptable básicamente para todos los propósitos. Solo tenga cuidado de no usar el mismo nombre para crear múltiples archivos /Una alternativa más segura es usar
mktemppara crear un directorio de forma segura, luego colocar su canalización con nombre dentro de ese directorio, y hacer unarm -R $dirpara deshacerse de él al final.fuente
mktempdirectorio, ya que era realmente la única respuesta aceptable. En caso de que no lo haya notado, @Gilles ya publicó esta respuesta en profundidad.Utilice la opción "ejecución en seco":
fuente
-uopción "no se recomienda".-t, pero mientras funcione de manera confiable, iría con él.-tse desaconseja?mkstemp()función ( linux.die.net/man/3/mkstemp ). El-tcambio no se desaconseja, es-pmi mal.Puede usar
mktemppara crear un archivo temporal, luego eliminarlo y crear una tubería con el mismo nombre.Por ejemplo:
fuente
$TMPPIPEantes demkfifoevitar el problema 'inseguro' asociado de hacerTMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE?mkfifoes realmente seguro, a diferencia de la creación de archivos habitual desde el shell. Si no fuera así, crear un archivo y luego eliminarlo no ayudaría en absoluto (de hecho, facilitaría enormemente el trabajo del atacante al no requerir que adivine el nombre del archivo). Entonces, la respuesta de dogbane funciona, pero la creación de archivos intermedios es una complicación inútil.mktemppágina del manual llama a la-uopción 'insegura'?mktemp -d, todavía obtuve algunos puntos por su aporte. Gracias por toda su ayuda, ¡realmente lo aprecio!mktemp -uno es seguro al crear un archivo normal, ya que proporciona la protección contra la denegación de servicio (si el nombre que genera es lo suficientemente impredecible) pero no impide que un atacante cree el archivo bajo la nariz del programa. Crear un fifo en lugar de un archivo normal es un caso de uso raro que la página del manual no aborda.Use
mkfifoomknoden Unix, donde dos procesos separados pueden acceder a la tubería por nombre: un proceso puede abrirlo como lector y el otro como escritor.La tubería con nombre se puede eliminar como cualquier archivo:
NamedPipe se puede usar un archivo normal para leer solo una vez.
http://www.linuxjournal.com/article/2156
fuente
mkfifo. No aborda mi pregunta sobre las canalizaciones con nombre temporales , más demkdirlo que abordaría la creación de directorios temporales.mktempabordan para crear de forma segura una tubería con nombre?mktempresultado mismo (por supuesto, eliminando primero el archivo temporal y luego ejecutándolomkfifoen el mismo).mktempTambién se puede utilizar para crear un directorio temporal, intente con el-t -dinterruptor.