首页 文章

PHP:不能exec()wkhtmltopdf:“sh:/ usr / bin / wkhtmltopdf:权限被拒绝”

提问于
浏览
2

我并不是真的进入unix,这就是为什么这件事对我来说有点奇怪 .

操作系统是CentOS 6 .

我几乎阅读了有关wkhtmltopdf的所有主题,但我的问题仍然存在 . 实际上它不是一个wkhtmltopdf问题,而是一个权限问题 .
总结一下:wkhtmltopdf在命令行中工作,但不能用php exec()工作 .
但是wget与php exec()一起正常工作:

我可以在命令行中执行wkhtmltopdf,工作正常:
/usr/bin/wkhtmltopdf "test.de" "/var/www/html/test/test.pdf" 2>&1

我可以用php执行wget,工作正常:
exec('/usr/bin/wget -O /var/www/html/test/test123.txt "test.de" 2>&1', $output, $return_var);

但是我不能用php执行wkhtmltopdf:
exec('/usr/bin/wkhtmltopdf "test.de" "/var/www/html/test/test.pdf" 2>&1', $output, $return_var);

this leads to "sh: /usr/bin/wkhtmltopdf: Permission denied"

我检查了/ usr / bin / wkhtmltopdf并将其与/ usr / bin / wget进行了比较 .
权限相同:rwxr-xr-x或0755
即使我将/ usr / bin / wkhtmltopdf的chmod设置为777并将所有者设置为apache,错误仍然是相同的 .

也许这是百胜问题?!我通过yum和wkhtmltopdf安装了wget . 这是我能想到的唯一区别 .

我用以下内容安装了wkhtmltopdf:

tar -vxjf wkhtmltopdf-0.9.9-static-amd64.tar.bz2 mv wkhtmltopdf-amd64 /usr/bin/wkhtmltopdf chmod +x /usr/bin/wkhtmltopdf

或者它可能是SELinux的问题?我不太了解它,但我读完了我的研究,“httpd_ssi_exec”和“httpd_execmem”可能有所帮助,我把两者都说“是”,但是许可被拒绝的问题仍然存在 .

所以我想知道为什么wget与php和wkhtmltopdf一起工作呢?希望有人可以帮助我,我可以停止生气;)

最好的问候,Alex

P.S . :test.de在我的脚本中是http://test.de,但我不允许发布两个以上的链接 .

4 回答

  • 1

    您可以使用:

    exec('/usr/local/bin/wkhtmltopdf --print-media-type index.html termo590.pdf 2>&1');
    
  • 1

    即使权限是 777 该命令也以www用户身份执行 . 由于www具有非常低的权限级别,所以会有很多限制 . 所以使用setuid File Permission

    setuid表示执行时设置用户ID . 如果setuid位启用了文件,则执行该可执行文件的用户将获得拥有该文件的个人或组的权限 . 因此,您可以以root / high特权用户身份执行该命令 .

  • 0

    如果您不想禁用 SELinux ,则另一种方法是使用cron来运行此命令 . /usr/bin/wkhtmltopdf "test.de" "/var/www/html/test/test.pdf" 2>&1

    1)将参数名称写入php程序中的文件 .

    $Handle = fopen("myfile", 'w');
     fwrite($Handle, "test.de");
     fclose($Handle);
    

    2)创建一个bash脚本来读取该参数名称并将其转换为pdf .

    #!/bin/sh
    arg=$(head -n 1 myfile)   
    /usr/bin/wkhtmltopdf arg "/var/www/html/test/test.pdf" 2>&1
    

    将其另存为pdf_converter.sh

    chmod +x pdf_converter.sh
    

    3)在crontab中配置脚本

    crontab -e 并粘贴此内容

    * * * * * pdf_converter.sh
    
  • 0

    在努力解决Permission Denied问题之后,我终于解决了这个问题,以便其他人遇到此问题:

    Apache的shell用户(www-data)默认只能访问var / www /中的文件

    Shell用户根本没有权限使用exec()在其默认目录(在我的情况下为usr / local / bin)中运行wkhtmltopdf .

    我的解决方法只是将wkhtmltopdf从/ usr / local / bin复制并粘贴到/ var / www / bin(我创建了bin文件夹)并在我的exec中定位该文件

    exec('/var/www/bin/wkhtmltopdf file.htm testfile.pdf');
    

    繁荣! PDF的 .

    现在这可能不是最安全的做法(我不知道在var / www目录中有一个bin文件夹是否存在安全隐患)但我的情况并不重要,因为这是一个测试服务器,对于任何想要的人为了验证他们的其他代码是否有效,它至少应该为您生成一个test.pdf

相关问题