当前位置: 首页 > 面试题库 >

在Python中创建临时FIFO(命名管道)?

羿季
2023-03-14
问题内容

如何在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创建的文件上运行它时。


问题答案:

os.mkfifo()``OSError: [Errno 17] File exists如果文件已经存在,将失败,但不会出现异常,因此这里没有安全性问题。使用的安全性问题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(如果他们具有适当的权限),如果错误/异常处理不当,可能会导致程序崩溃。



 类似资料:
  • 问题内容: 如何在node.js中创建命名管道? PS:目前,我正在按如下方式创建命名管道。但是我认为这不是最好的方法 问题答案: 看起来,Node核心不支持名称管道-从Ben Noordhuis 11/10/11开始: Windows具有命名管道的概念,但是自您提到以来,我假设您的意思是UNIX FIFO。 我们不支持它们,可能永远也不会(在非阻塞模式下的FIFO可能会死锁事件循环),但是如果您

  • 问题内容: 有客观的更好的方法在bash脚本中创建临时文件吗? 我通常只要给他们起名就可以使用它们,例如tempfile-123,因为脚本结束后它将被删除。除了覆盖当前文件夹中可能的tempfile-123之外,这样做是否有其他缺点?还是以更谨慎的方式创建临时文件有什么好处? 问题答案: 该手册页解释了它相当好: 传统上,许多shell脚本使用pid作为后缀来命名程序名称,并将其用作临时文件名。这

  • 问题内容: 我目前正在为一家餐馆开发门户应用程序。使用的后端数据库是Mysql,而我正在使用Spring JDBC支持来编写数据访问逻辑。 我的某些DAO充满了多个查询,并且正获得多达数千行的代码。我认为我可以通过将一些逻辑移到SQL- PSM过程中来减少大小和复杂性(因为Java中的数据绑定和粘合代码是令人讨厌的事情)。 但是,我对Db没有DDL权限,因此无法创建该过程。 我想知道是否有一种方法

  • 创建并且编辑快速蒙版 要使用“快速蒙版”模式快速地创建并编辑选区,请从某个选区开始,然后从中添加或删减选区,以形成蒙版。也可以完全在“快速蒙版”模式下创建蒙版。受保护区域和未受保护区域以不同颜色进行区分。当离开“快速蒙版”模式时,未受保护区域成为选区。 注意:当在“快速蒙版”模式中工作时,“通道”面板中出现一个临时快速蒙版通道。但是,所有的蒙版编辑是在图像窗口中完成。 使用任一选区工具,选择要更改

  • 问题内容: 我正在尝试从正在传递的文件内容中创建一个zip文件,例如 这样可以正确写入zip,但是当您打开zip时,其中的文件称为“-”。有什么方法可以指定在zip中应该包含管道输入数据的文件名吗? 问题答案: 从我可以收集到的信息来看,您不能同时使用该命令,这意味着您既不能指定文件名也不能通过管道传递内容。您可以通过管道传输内容,结果文件为,也可以通过管道传输文件名。 这并不意味着使用其他技术是

  • 问题内容: 我想在Oracle数据库中创建一个临时表 就像是 在SQL Server中 然后用选择语句填充它 是否有可能? 谢谢 问题答案: 是的,Oracle有临时表。这是描述它们的AskTom文章的链接,这是oracle的官方CREATE TABLE文档。 但是,在Oracle中,只有临时表中的 数据 是临时的。该表是其他会话可见的常规对象。在Oracle中频繁创建和删除临时表是一种不好的做法