![单进程可访问的临时文件](https://linux22.com/image/32263/%E5%8D%95%E8%BF%9B%E7%A8%8B%E5%8F%AF%E8%AE%BF%E9%97%AE%E7%9A%84%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6.png)
我想创建一个只能由创建它的进程(及其子进程)访问的文件,并且当进程退出时该文件就会消失,理想情况下永远不会将文件持久保存到磁盘。举个例子,我想创建/mylocation/myfile.txt
,其中该文件只能从当前进程读取,而不能从任何其他进程读取,甚至不能从同一用户读取。我很高兴使用除 之外的一些神奇位置/mylocation
,例如 下的某处/prod/PID
,但它需要适用于任何文件名。
背景是我正在使用一个现有的库,它从$FOO/mypassword
.多个进程在同一用户帐户下运行,但具有不同的秘密密码。我希望从其他进程安全地将密码传达给图书馆。我很欣赏理想的解决方案是使用不同的用户帐户或让库不从文件中读取密码,但我无法控制这些方面。
答案1
好吧,这取决于“文件”的含义以及库如何访问它。以下是我想到的一些方法(两种方法):
- 使用正常意义上的临时文件
mkstemp
。mkstemp
返回未链接文件的文件描述符号。然后您可以创建$FOO/mypasswd
为 的符号链接/proc/self/fd/returned_number
。文件存在一个小窗口(在打开和取消链接之间),并且以同一用户身份运行的其他程序可以打开它,并保存文件描述符以便稍后读取密码。如果您的临时目录位于 tmpfs 上,您可以确定它不会被写入磁盘。 - 如果不需要
seek
密码文件,请使用pipe
/pipe2
创建文件描述符,然后使用符号链接继续执行上述操作。您需要分叉一个子进程来处理将密码输入管道的情况。 - 您可能可以滥用 FUSE 来做到这一点。
- 您可以使用(或其他动态链接器技巧)通过拦截 //来
LD_PRELOAD
“修复”库,并从正常的地方向其提供密码。open
read
close
这些都不是真的免受其他进程的影响。例如,以同一用户身份运行的其他进程可以ptrace
直接从内存中读取您的进程并读取密码。
答案2
#!/bin/bash
exec 3<>file
rm file
exec program
准确地说:存在竞争条件。并且程序必须使用文件描述符。如果必须传递文件路径,请使用/proc/self/fd/3
.但理论上,其他进程也可以通过此 proc 路径访问该文件(即使已删除)。