我有一些任务需要大量的临时命名管道来处理。
最初,我只是认为生成随机数,然后将其作为<number>.fifo
追加为命名管道的名称。
但是,我发现了这篇文章:Create a temporary FIFO (named pipe) in Python?
似乎有些事情我不知道可能会在那里引起一些安全问题。
所以我的问题是,生成命名管道的最佳方法是什么?
请注意,尽管我引用了与Python相关的帖子,但我并不是真的只想在Python中提问。
更新:
由于我想使用命名管道来连接不相关的进程,我的计划是首先通过shell进行进程A调用进程B,并捕获stdout以获取管道的名称,然后两者都知道要打开的内容。
在这里,我只是担心泄漏管道名称是否会成为一个问题。在我从未想过它之前,直到我读到Python帖子。
答案 0 :(得分:2)
如果您必须使用命名的FIFO并且需要确保不会发生重叠/覆盖,那么最好的选择可能是使用mktemp
和mkfifo
的某种组合。
虽然mktemp
本身无法创建FIFO,但它可用于创建唯一的临时目录,然后您可以将其放入。
GNU mktemp documentation有一个例子。
答案 1 :(得分:0)
或者,您可以创建一些包含随机字母的名称。您可以从/dev/random
(或/dev/urandom
,读取random(4))读取一些随机字节,例如:播种PRNG(例如srandom
播种的random(3)),和/或混合PID和时间等。
由于名为fifo(7)的文件是文件,因此您应该对它们使用权限系统(和/或ACL)。特别是,您可以创建一个命令Linux用户来运行所有进程并将FIFO限制为只有所有者可读,等等。
当然,在所有情况下,您都需要&#34;存储&#34;或&#34;传输&#34;安全地使用这些FIFO名称。
如果您在某个bash
脚本中启动程序,可以考虑使用mktemp(1)将您的fifo名称设为:
fifoname=$(mktemp -u -t yourprog_XXXXXX).fifo-$RANDOM-$$
mkfifo -m 0600 $fifoname
(也许在某个循环中)。如果脚本在专用用户中运行(然后在某个管道或文件中传递$fifoname
,而不是作为程序参数),我认为它足够安全。
最近的renameat2(2)系统调用可能会有所帮助(RENAME_EXCHANGE
的原子性)。
PS。这一切都取决于你是多么偏执。一个良好的系统管理的Linux系统可以非常安全......