You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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目录:

    1. 编辑Apache的systemd覆盖配置:sudo systemctl edit apache2.service
    2. 写入以下配置:
    [Service]
    PrivateTmp=false
    
    1. 重载配置并重启服务生效:
    sudo systemctl daemon-reload
    sudo systemctl restart apache2
    

内容的提问来源于stack exchange,提问作者TRiG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:36:05