31

Python で一時 FIFO (名前付きパイプ) を作成するにはどうすればよいですか? これはうまくいくはずです:

import tempfile

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

ただし、 Python Docs 11.6の大きな警告と、非推奨であるため削除される可能性があるため、躊躇しています。

編集:私が試したことは注目に値しますtempfile.NamedTemporaryFile(そして拡張によってtempfile.mkstemp)が、os.mkfifoスローします:

OSError -17: ファイルは既に存在します

mkstemp/NamedTemporaryFile が作成したファイルに対して実行すると。

4

6 に答える 6

29

os.mkfifo()OSError: [Errno 17] File existsファイルが既に存在する場合は例外で失敗するため、セキュリティ上の問題はありません。using のセキュリティ上の問題tempfile.mktemp()は、攻撃者が自分でファイルを開く前に同じ名前のファイルを作成できる競合状態ですがos.mkfifo()、ファイルが既に存在する場合は失敗するため、これは問題ではありません。

ただし、mktemp()非推奨であるため、使用しないでください。代わりに使用できますtempfile.mkdtemp()

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)

編集:mktemp()脆弱性がこれによって回避されるという理由だけで、考慮する必要がある他の通常のセキュリティ問題がまだあることを明確にする必要があります。たとえば、エラー/例外が適切に処理されない場合、プログラムがクラッシュする前に攻撃者が fifo を作成する可能性があります (適切なパーミッションがあれば)。

于 2009-09-16T02:09:15.307 に答える
3

プログラム内で使用し、外部では使用しない場合は、Queue モジュールを見てください。追加の利点として、python キューはスレッドセーフです。

于 2009-09-16T01:42:29.407 に答える
-1

mkstemp()を使用しないのはなぜですか?

例えば:

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)
于 2009-09-16T01:37:37.860 に答える