Ubuntu系统下如何查找特定程序对应的真实tmp目录路径?
疑问答复
通过Apache运行的PHP代码,shell_exec()确实以www-data用户身份执行,正常情况下触发的子进程会和Apache共享同一个私有/tmp挂载命名空间,理论上可以访问到TCPDF生成的临时文件。你遇到的pdfunite执行失败,大概率是pdfunite本身被沙箱机制隔离导致,和用户身份无关。
可行解决方案(无需更换自定义临时目录)
方案1:替换非沙箱版本的pdfunite
目前Ubuntu默认会通过snap安装poppler-utils(包含pdfunite),snap自带的沙箱隔离会阻断其访问Apache的私有/tmp路径,替换为apt源的常规版本即可解决:sudo snap remove poppler-utils sudo apt install poppler-utils方案2:直接传入私有tmp的真实路径
无需改动系统配置,直接在PHP代码中获取当前进程可访问的/tmp对应的真实文件系统路径,传给pdfunite使用即可:// 获取当前进程/tmp目录对应的真实绝对路径 $real_tmp_path = realpath('/tmp'); // 拼接所有PDF文件的完整路径 $input_pdfs = [ $real_tmp_path . '/part1.pdf', $real_tmp_path . '/part2.pdf' ]; $output_pdf = $real_tmp_path . '/merged.pdf'; // 调用pdfunite shell_exec('pdfunite ' . implode(' ', $input_pdfs) . ' ' . $output_pdf);方案3:关闭Apache的PrivateTmp特性(不推荐,会降低系统安全性)
如果确认不需要临时目录隔离,可以直接关闭该机制,让Apache直接使用全局/tmp目录:- 编辑Apache的systemd覆盖配置:
sudo systemctl edit apache2.service - 写入以下配置:
[Service] PrivateTmp=false- 重载配置并重启服务生效:
sudo systemctl daemon-reload sudo systemctl restart apache2- 编辑Apache的systemd覆盖配置:
内容的提问来源于stack exchange,提问作者TRiG
相关产品推荐
相关产品推荐

