Respuestas:
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 mkfifo
o la función subyacente crea un nuevo archivo en el lugar especificado o falla. Algo así : >foo
es inseguro porque si el atacante puede predecir el resultado, mktemp
entonces el atacante puede crear el archivo de destino por sí mismo. Pero mkfifo foo
fallaría en tal escenario.
Si necesita portabilidad POSIX completa, mkfifo -m 600 /tmp/myfifo
es 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"
trap "rm -rf '$tempdir'" EXIT HUP INT TERM
? ¿Puede trap hacer su propia expansión variable?
$tempdir
en el momento en que trap
se 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 de tempdir
contiene una comilla simple, mientras que mi código siempre funciona.
$tempdir
fue declarado localmente y debe definirse globalmente para que trap tenga acceso a él. Tiene sentido ahora ...
$tempdir
valor 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 mktemp
para crear un directorio de forma segura, luego colocar su canalización con nombre dentro de ese directorio, y hacer una rm -R $dir
para deshacerse de él al final.
mktemp
directorio, 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":
mkfifo $(mktemp -ut pipe.XXX)
-u
opción "no se recomienda".
-t
, pero mientras funcione de manera confiable, iría con él.
-t
se desaconseja?
mkstemp()
función ( linux.die.net/man/3/mkstemp ). El -t
cambio no se desaconseja, es -p
mi mal.
Puede usar mktemp
para crear un archivo temporal, luego eliminarlo y crear una tubería con el mismo nombre.
Por ejemplo:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPE
antes de mkfifo
evitar el problema 'inseguro' asociado de hacer TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
?
mkfifo
es 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.
mktemp
página del manual llama a la -u
opción 'insegura'?
mktemp -d
, todavía obtuve algunos puntos por su aporte. Gracias por toda su ayuda, ¡realmente lo aprecio!
mktemp -u
no 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 mkfifo
o mknod
en Unix, donde dos procesos separados pueden acceder a la tubería por nombre: un proceso puede abrirlo como lector y el otro como escritor.
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe
La tubería con nombre se puede eliminar como cualquier archivo:
rm my_pipe
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
NamedPipe se puede usar un archivo normal para leer solo una vez.
mkfifo
. No aborda mi pregunta sobre las canalizaciones con nombre temporales , más de mkdir
lo que abordaría la creación de directorios temporales.
mktemp
abordan para crear de forma segura una tubería con nombre?
mktemp
resultado mismo (por supuesto, eliminando primero el archivo temporal y luego ejecutándolo mkfifo
en el mismo). mktemp
También se puede utilizar para crear un directorio temporal, intente con el -t -d
interruptor.