我发现,如果我通过管道在两个进程之间传输大量数据,Linux 会在 /tmp 目录中创建一些临时文件。如果管道操作成功,操作系统会自动删除相应的临时文件。但如果操作失败,tmp 文件仍保留在那里。
出于某种原因,我不希望用户有机会获取我通过管道传输的数据,所以即使我的程序崩溃,我也不希望硬盘上留下任何东西。我该怎么做?
答案1
管道不将数据存储在磁盘上。/bin/echo foo | grep bar 不创建任何文件。尝试
strace -f sh -c '/bin/echo foo | grep bar'
查看运行管道时 shell 进行的所有系统调用。echo
是 shell 内置命令,因此我建议/bin/echo
让 shell 运行可执行文件。/tmp
不必放在磁盘上。它可以安装在 tmpfs 上(即由虚拟内存支持)。请注意,/tmp
在这种情况下重新启动将清空,因此请使用它/var/tmp
来保留任何您想要保留的内容。
如果您正在做的是将数据放入文件中,则它没有使用管道。如果文件是 fifo,而不是常规文件,那么它只是一个命名的集合点,不包含数据。使用 ls -l 来查找。
请注意,如果您希望阻止用户查看他们拥有的进程中管道的情况,那么您几乎是无能为力的,因为strace
可以检查进程与进程外部的任何交互,除了读取/写入 mmapped 共享内存。 ltrace
甚至更具侵入性。如果您的程序将在本地用户拥有 root 权限的系统上运行,您根本无法阻止他们。在 Unix 上,root 可以做任何事情,并且拥有强大的工具来实现这一目的。
答案2
真正的管道是内核中的一块内存,是一些进程读写的缓冲区。它不会在任何地方创建文件。
一些应用程序有在使用管道(更快,不占用磁盘,但占用更多内存)和使用临时文件(占用更少的内存,允许您查看临时文件,但速度稍慢)之间切换的选项。 gcc
就是这样一个应用程序,但可能还有其他应用程序。
答案3
肮脏的黑客:如果您可以改变这两个过程,则在发送之前加密数据并在接收时解密......