管道是否必须写入临时文件?

管道是否必须写入临时文件?

我发现,如果我通过管道在两个进程之间传输大量数据,Linux 会在 /tmp 目录中创建一些临时文件。如果管道操作成功,操作系统会自动删除相应的临时文件。但如果操作失败,tmp 文件仍保留在那里。

出于某种原因,我不希望用户有机会获取我通过管道传输的数据,所以即使我的程序崩溃,我也不希望硬盘上留下任何东西。我该怎么做?

答案1

  1. 管道不将数据存储在磁盘上。/bin/echo foo | grep bar 不创建任何文件。尝试 strace -f sh -c '/bin/echo foo | grep bar' 查看运行管道时 shell 进行的所有系统调用。 echo是 shell 内置命令,因此我建议/bin/echo让 shell 运行可执行文件。

  2. /tmp不必放在磁盘上。它可以安装在 tmpfs 上(即由虚拟内存支持)。请注意,/tmp在这种情况下重新启动将清空,因此请使用它/var/tmp来保留任何您想要保留的内容。

如果您正在做的是将数据放入文件中,则它没有使用管道。如果文件是 fifo,而不是常规文件,那么它只是一个命名的集合点,不包含数据。使用 ls -l 来查找。

请注意,如果您希望阻止用户查看他们拥有的进程中管道的情况,那么您几乎是无能为力的,因为strace可以检查进程与进程外部的任何交互,除了读取/写入 mmapped 共享内存。 ltrace甚至更具侵入性。如果您的程序将在本地用户拥有 root 权限的系统上运行,您根本无法阻止他们。在 Unix 上,root 可以做任何事情,并且拥有强大的工具来实现这一目的。

答案2

真正的管道是内核中的一块内存,是一些进程读写的缓冲区。它不会在任何地方创建文件。

一些应用程序有在使用管道(更快,不占用磁盘,但占用更多内存)和使用临时文件(占用更少的内存,允许您查看临时文件,但速度稍慢)之间切换的选项。 gcc就是这样一个应用程序,但可能还有其他应用程序。

答案3

肮脏的黑客:如果您可以改变这两个过程,则在发送之前加密数据并在接收时解密......

相关内容