使用 PrivateTmp 时,访问系统 tmp 目录中的文件

使用 PrivateTmp 时,访问系统 tmp 目录中的文件

我在启用 PrivateTmp 的情况下使用php-fpm。我必须从 PHP 读取文件,该文件由远程部署代理复制到/tmp目录中。由于启用了 PrivateTmp,我无法直接访问/tmp目录。

启用 PrivateTmp 后是否可以从系统文件夹读取文件/tmp?我尝试创建指向 的符号链接/tmp/var/temp通过 访问文件/var/temp,但没有成功。/var/tmp当前已从 绑定挂载/tmp,我也尝试通过 访问文件,但/var/tmp没有成功。

答案1

阅读手动的 请:

PrivateTmp=
采用布尔参数。如果为 true,则为执行的进程设置一个新的文件系统命名空间,并在其中挂载私有目录/tmp/var/tmp不与命名空间之外的进程共享的目录。这对于保护对进程临时文件的访问很有用,但/tmp使得通过或进程之间的共享变得/var/tmp不可能。

因此您无法从系统范围/tmp/目录中读取。

但是手册的同一部分中有一个解决方法:

... 可以使用指令在同一个私有 /tmp 和 /var/tmp 命名空间内运行两个或多个单元JoinsNamespaceOf=,请参阅systemd.unit(5)了解详情。

因此,如果您的远程部署代理也是从 systemd 单元运行的,您可以将它们合并到它们之间共享的单个 PrivateTmp 中,该 PrivateTmp 仍然与系统的其余部分分开。

如果您不能这样做:请不要将文件存储在系统中/tmp/,而只需将其放置/移动到另一个位置...

答案2

您可以使用nsenter它在网络命名空间内运行命令。

例如,如果您想查看 apache2 服务的 /tmp 内的文件,您可以执行以下操作:

pid=$(systemctl show --property=MainPID --value apache2.service)
nsenter -t $pid -m ls /tmp

这将ls /tmp在 apache2 进程正在运行的挂载命名空间内运行。

此外,私有 tmp 目录当前位于类似这样的路径,/tmp/systemd-private-*-apache2.service-*其中存在*某种类型的 id。尽管您可能不应该依赖特定的格式或位置。

相关内容