在*nix系统中创建临时命名管道

10

我有一些需要处理的大规模临时命名管道任务。

最初,我只是简单地想生成随机数,然后将其附加为<number>.fifo作为命名管道的名称。

但是,我发现了这篇文章:在Python中创建临时FIFO(命名管道)?

似乎有些我不知道的东西可能会导致一些安全问题。

因此,我的问题是,生成命名管道的最佳方法是什么?

请注意,即使我参考了与Python相关的文章,我并不是只想在Python中提问。

更新:

由于我想使用命名管道连接不相关的进程,我的计划是首先通过shell让进程A调用进程B,并捕获stdout以获取管道的名称,然后两者都知道该打开什么。

在这里,我只担心泄漏管道名称是否会成为问题。在之前,我从未想过这一点,直到我读到那篇Python文章。


你在考虑哪些安全问题?你会把FIFO的名称存储在哪里?为什么不能使用普通匿名管道? - Basile Starynkevitch
@BasileStarynkevitch 因为它需要进程间通信,而这些进程之间没有关系。这里的安全问题似乎是恶意攻击者?实际上我并不太理解。我担心是因为我看到了那篇帖子。 - Jason Hu
但是你可以使用随机名称,问题在于如何共享(或在哪里存储)这些名称。您应该编辑您的问题以进一步解释。 - Basile Starynkevitch
@BasileStarynkevitch,我读完那篇文章后感到很困惑。似乎随机化也可能存在错误。我更新了我的问题。 - Jason Hu
顺便说一句,我对mkfifo的大规模使用持怀疑态度。你需要十几个还是一百万个?(在某个特定时刻,我猜内核会将FIFO的数量限制在几十万个左右)。 - Basile Starynkevitch
@BasileStarynkevitch 我改变了一点想法,所以现在不需要太多了。最多可能会有几百个,应该没问题。 - Jason Hu
2个回答

6
如果你必须使用命名FIFO并需要确保不会发生重叠/覆盖,你最好使用mktempmkfifo的某些组合。
尽管mktemp本身不能创建FIFO,但可以用于创建唯一的临时目录,然后将FIFO放入其中。 GNU mktemp文档提供了一个示例。

使用mktemp()的问题在于,一些系统会在链接时警告其使用,如果您的构建目标是没有警告,则这可能会成为一个麻烦。我在这里寻找解决该问题的方法;但这并不符合我的要求。 - Jonathan Leffler
@JonathanLeffler 或许可以使用 mkstemp() 函数,怎么样? - yossarian
我得出结论,创建一个函数 int mkptemp(char *pattern, mode_t mode) 可能是最好的选择,它可以完成与 mkdtemp() 相同的工作——创建一个具有随机名称的“管道”(FIFO),该名称将存储在 pattern 参数中。我还没有实现它,但可以很容易地修改 mkstemp() 的实现以创建一个 FIFO 而不是文件。mkfifo() 系统调用不会在断开的符号链接末尾创建 FIFO——就像 mkdir() 系统调用一样,如果文件系统中存在该名称,则会失败。我会使用 p 代替 f,因为 f 同时也暗示了“文件”。 - Jonathan Leffler

1

或者,您可以创建一些包含随机字母的名称。您可以从/dev/random(或/dev/urandom,读取random(4))中读取一些随机字节,例如种子PRNG(例如由srandom种子化的random(3)),并/或混合PID和时间等。

由于命名的fifo(7)是文件,因此应在它们上使用权限系统(和/或ACL)。特别是,您可能会创建一个命令Linux用户来运行所有进程,并将FIFO限制为仅所有者可读等。

当然,在所有情况下,您需要安全地“存储”或“传输”这些FIFO名称。

如果您在某些bash脚本中启动程序,则可以考虑使用mktemp(1)来创建您的FIFO名称:

fifoname=$(mktemp -u -t yourprog_XXXXXX).fifo-$RANDOM-$$
mkfifo -m 0600 $fifoname

(也许在某个循环中)。我猜如果脚本在专用用户中运行(然后通过某个管道或文件传递$fifoname,而不是作为程序参数),那应该足够安全。

最近的renameat2(2)系统调用可能会有帮助(RENAME_EXCHANGE的原子性)。

顺便说一下,你可能需要一些SElinux。记住,打开的文件描述符 - 包括你的FIFO - 在proc(5)中作为符号链接可用!

附言:这完全取决于你有多偏执。一个经过良好系统管理的Linux系统可以相当安全...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接