Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:Cannot exec()wkhtmltopdf:";sh:/usr/bin/wkhtmltopdf:权限被拒绝;_Php_Linux_Permissions_Exec_Wkhtmltopdf - Fatal编程技术网

PHP:Cannot exec()wkhtmltopdf:";sh:/usr/bin/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

我不是很喜欢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\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