我在启用 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。尽管您可能不应该依赖特定的格式或位置。