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

时间:2014-03-21 13:54:32

标签: php linux permissions exec wkhtmltopdf

我并不是真的进入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);

这会导致“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没有? 希望有人可以帮助我,我可以停止生气;)

最好的问候, 亚历

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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以使用:

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

答案 2 :(得分: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

答案 3 :(得分: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' S。

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