python security file fifo mkfifo

Crear un FIFO temporal(named pipe) en Python?



security file (5)

¿Por qué no usar simplemente mkstemp() ?

Por ejemplo:

import tempfile import os handle, filename = tempfile.mkstemp() os.mkfifo(filename) writer = open(filename, os.O_WRONLY) reader = open(filename, os.O_RDONLY) os.close(handle)

¿Cómo se puede crear un FIFO temporal (named pipe) en Python? Esto debería funcionar:

import tempfile temp_file_name = mktemp() os.mkfifo(temp_file_name) open(temp_file_name, os.O_WRONLY) # ... some process, somewhere, will read it ...

Sin embargo, tengo dudas debido a la gran advertencia en Python Docs 11.6 y la posible eliminación porque está en desuso.

EDITAR : Es notable que he probado tempfile.NamedTemporaryFile (y por extensión tempfile.mkstemp ), pero os.mkfifo arroja:

OSError -17: el archivo ya existe

cuando lo ejecuta en los archivos que han creado mkstemp / NamedTemporaryFile.


¿Qué hay de usar

d = mkdtemp() t = os.path.join(d, ''fifo'')


Efectivamente, todo lo que hace mkstemp es ejecutar mktemp en un bucle y sigue intentando crear exclusivamente hasta que tenga éxito (consulte el código fuente stdlib here ). Puedes hacer lo mismo con os.mkfifo :

import os, errno, tempfile def mkftemp(*args, **kwargs): for attempt in xrange(1024): tpath = tempfile.mktemp(*args, **kwargs) try: os.mkfifo(tpath, 0600) except OSError as e: if e.errno == errno.EEXIST: # lets try again continue else: raise else: # NOTE: we only return the path because opening with # os.open here would block indefinitely since there # isn''t anyone on the other end of the fifo. return tpath else: raise IOError(errno.EEXIST, "No usable temporary file name found")


Si es para usar dentro de su programa, y ​​no con elementos externos, eche un vistazo al módulo Queue . Como beneficio adicional, las colas de python son seguras para subprocesos.


os.mkfifo() fallará con la excepción OSError: [Errno 17] File exists si el archivo ya existe, por lo que no hay ningún problema de seguridad aquí. El problema de seguridad con el uso de tempfile.mktemp() es la condición de carrera en la que un atacante puede crear un archivo con el mismo nombre antes de abrirlo usted mismo, pero dado que os.mkfifo() falla si el archivo ya existe, esto es no es un problema.

Sin embargo, dado que mktemp() está en desuso, no debes usarlo. Puede usar tempfile.mkdtemp() lugar:

import os, tempfile tmpdir = tempfile.mkdtemp() filename = os.path.join(tmpdir, ''myfifo'') print filename try: os.mkfifo(filename) except OSError, e: print "Failed to create FIFO: %s" % e else: fifo = open(filename, ''w'') # write stuff to fifo print >> fifo, "hello" fifo.close() os.remove(filename) os.rmdir(tmpdir)

EDITAR: Debo dejar en claro que, solo porque la vulnerabilidad mktemp() es evitada por esto, todavía hay otros problemas de seguridad usuales que deben ser considerados; por ejemplo, un atacante podría crear el fifo (si tenían permisos adecuados) antes de que tu programa lo hiciera, lo que podría causar que tu programa falle si los errores / excepciones no se manejan adecuadamente.