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

Joy*_*abu 5 systempath systemd

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

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

HBr*_*ijn 5

请阅读手册

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

所以不,你不能从系统范围的/tmp/目录中读取。

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

...通过使用该JoinsNamespaceOf=指令,可以在同一个私有 /tmp 和 /var/tmp 命名空间中运行两个或多个单元,有关详细信息,请参阅systemd.unit(5)

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

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


Tha*_*yne 5

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

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

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

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

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