PHP:Cannot exec()wkhtmltopdf:";sh:/usr/bin/wkhtmltopdf:权限被拒绝;
我不是很喜欢unix,这就是为什么这个东西对我来说有点奇怪 操作系统是CentOS 6 我几乎阅读了所有关于wkhtmltopdf的主题,但我的问题仍然存在。实际上这不是一个wkhtmltopdf问题,而是一个权限问题。PHP:Cannot exec()wkhtmltopdf:";sh:/usr/bin/wkhtmltopdf:权限被拒绝;,php,linux,permissions,exec,wkhtmltopdf,Php,Linux,Permissions,Exec,Wkhtmltopdf,我不是很喜欢unix,这就是为什么这个东西对我来说有点奇怪 操作系统是CentOS 6 我几乎阅读了所有关于wkhtmltopdf的主题,但我的问题仍然存在。实际上这不是一个wkhtmltopdf问题,而是一个权限问题。 总而言之:wkhtmltopdf可以在命令行中工作,但不能与php exec()一起工作。 但是wget可以与php exec()配合使用: 我可以在命令行中执行wkhtmltopdf,工作正常: /usr/bin/wkhtmltopdf“test.de”“/var/www/h
总而言之: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\u var)代码>
但是我不能用php执行wkhtmltopdf:
exec('/usr/bin/wkhtmltopdf“test.de”“/var/www/html/test/test.pdf”2>&1',$output,$return\u var)代码>
这会导致“sh:/usr/bin/wkhtmltopdf:权限被拒绝”
我检查了/usr/bin/wkhtmltopdf并将其与/usr/bin/wget进行了比较。
权限相同:rwxr-xr-x或0755
即使我将/usr/bin/wkhtmltopfd的chmod设置为777并将所有者设置为apache,错误仍然是一样的
也许这是个问题?!
因为我不是通过yum和wkhtmltopdf安装wget的。这是我能想到的唯一区别
我安装了wkhtmltopdf,其中包含以下内容:
tar-vxjf wkhtmltopf-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不工作?
希望有人能帮我,我就不会为此生气了;)
致以最良好的祝愿,
亚历克斯
注意:test.de在我的脚本中,但我不允许发布超过两个链接。即使权限是777
作为www用户执行命令。由于www的权限级别非常低,因此会有很多限制。因此请使用
setuid表示在执行时设置用户ID。如果setuid bit打开一个文件,执行该可执行文件的用户将获得拥有该文件的个人或组的权限。因此,您可以作为root/高权限用户执行该命令。如果您不想禁用SELinux
另一种方法是使用cron来运行该命令。/usr/bin/wkhtmltopf“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
您可以使用:
exec('/usr/local/bin/wkhtmltopdf --print-media-type index.html termo590.pdf 2>&1');
经过与“拒绝许可”问题的斗争,我终于破解了它,因此对于其他任何有此问题的人:
默认情况下,Apache的shell用户(www数据)只能访问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谢谢您的回答,但如果我设置了“chmodu+s/usr/bin/wkhtmltopdf“,它没有效果。它仍然被拒绝许可。但我发现,SELinux阻止了它。如果将强制模式设置为permissive,则可以使用wkhtmltopdf创建PDF。但是我不想禁用SELinux..另一个解决方案是使用二进制包装器
。同样,它需要suid
。您是如何解决这个问题的?我也面临同样的问题,你是对的;我们不应该禁用SELinux。这是一个主要的问题,当涉及到共享目录。我的情况不同:我是VPS上的第二用户,权限有限。通过命令行,脚本工作正常slyit的返回错误-数组([0]=>sh:/usr/local/bin/wkhtmltopf:Permission denied)126