PHP exec() 通过浏览器执行时不会执行 shell 命令
Posted
技术标签:
【中文标题】PHP exec() 通过浏览器执行时不会执行 shell 命令【英文标题】:PHP exec() will not execute shell command when executed via browser 【发布时间】:2010-10-07 00:56:37 【问题描述】:我有一个调用 exec() 的 php 脚本来执行将 PDF 转换为 JPG 的命令。此命令在 bash 中运行良好。
要抢占您最初的故障排除猜测,请注意以下几点:
safe_mode = 关闭 包含 PDF 和脚本的目录的权限设置为 777,此目录也是写入 JPG 的位置。 我传递给 exec() 的命令明确指向正在使用的二进制文件(例如 /usr/local/bin/convert)。 display_errors = 开启 error_reporting = E_ALL disable_functions = [空白] 我正在回显 exec() 的输出,但它什么也没有返回。默认运行的命令不返回任何内容。当我从浏览器调用这个 PHP 脚本(访问 http://www.example.com/script.php)时,exec() 不会执行它的参数。
重要提示:我知道我的脚本或构建 bash 命令的方式没有问题,因为从 bash,我可以使用 'php' 执行脚本并且它可以工作(例如'php script.php' 转换文件)
我也尝试过用 system() 切换 exec()。
最后,我以前遇到过这个问题,但不记得我是如何解决的。
我知道我缺少一些东西,所以我希望其他人也像我一样经历过这个并记得如何解决它!
提前感谢您提供的任何帮助。
亚历克斯
【问题讨论】:
传递给转换的参数是什么?它们是否包含文件的完整路径? 在 PHP 5 中确保使用 E_ALL | E_STRICT 用于完整的错误报告。 更新 -- 重要:我发现这是 ImageMagick 的一个问题,并使用 GhostScript(使用更长的命令)而不是使用 ImageMagick 完成了 PDF 到 JPEG 的转换作为一个中间人。 PHP、我的权限或 exec() 没有问题。感谢您的所有意见! 【参考方案1】:将2>&1
添加到命令末尾以将错误从stderr 重定向到stdout。这应该清楚出了什么问题。
【讨论】:
是的,我收到一个奇怪的 ImageMagick 错误:convert: missing an image filename `test.jpg' @ convert.c/ConvertImageCommand/2766。在用谷歌搜索了一下之后,它看起来可能是一个错误的版本。我正在重建最新的稳定版本并在几分钟内进行测试。 2>&1 是什么意思?那叫什么?【参考方案2】:只是一些猜测,可能是您的网络服务器进程用户没有这样做的权限。
【讨论】:
太棒了!这是一个很好的观点。如果使用 exec(通过 php)调用 bash 脚本,请确保 bash 脚本也可以被 Apache 读取。【参考方案3】:由于它在命令行下工作(将在您自己的用户帐户下),所以在我看来,运行 Web 服务器的帐户(通常是“www-data”)没有执行权限转换程序。
【讨论】:
别人如何授予权限?【参考方案4】:您是否考虑过文件权限?在浏览器中,php 是在一个用户下运行的,但是当你在 bash 中运行它时,它很可能是在你的用户权限下运行的。
这是我要检查的第一件事。
艾米
【讨论】:
【参考方案5】:您的 Apache/webserver 用户是否拥有运行 shell 命令的必要权限?
当您从 cl 运行时,您可能以不同的用户身份运行,这可以解释哪个 cl 有效,但通过浏览器无效。
【讨论】:
如何检查是否允许?【参考方案6】:Apache 的用户www-data
需要被授予权限才能使用sudo
执行某些应用程序。
-
运行命令
sudo visudo
。实际上我们想编辑etc/sudoers
中的文件。为此,通过在终端中使用sudo visudo
,它复制(临时)sudoers
文件进行编辑。
在文件的末尾,添加以下ex:-如果我们想使用命令重新启动smokeping并使用mount命令进行其他操作,
www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount
(假设您希望使用超级用户运行restart
和mount
命令
(root) 权限。)
但是,如果您希望使用
超级用户权限,然后添加以下内容而不是上面的内容。您可能不想这样做,而不是ALL
命令,非常危险。
www-data ALL=NOPASSWD: ALL
3.编辑sudoers文件后(通过visudo
我们编辑sudoers
的临时文件,所以保存并退出临时文件(visudo)写入sudoers
文件。(wq!
)
4.就是这样,现在在您的xxx.php
script 中按以下方式使用exec()
。请记住在php脚本中使用命令之前使用sudo
。
例如:-
exec ("sudo /etc/init.d/smokeping restart 2>&1");
因此,在您的问题中,将您希望使用的命令添加到step no (2.)
,因为我添加并根据您的需要更改您的 php 脚本。
【讨论】:
【参考方案7】:这可能是由于通过Web服务器运行脚本和通过bash运行脚本的不同用户。
通常,通过服务器调用的脚本/执行程序与用户“www”一样,并且该用户对您的区域没有任何写入权限。但是当您在 bash 中运行脚本时,您确实具有写入权限。
【讨论】:
【参考方案8】:我已经确定这是 ImageMagick 的问题,而不是 PHP 的问题。我正在尝试一些修复,如果它们不起作用,我最终将使用一些 PHP 共享库(可能是 imagick)来代替。
【讨论】:
【参考方案9】:默认输出设备已更改。
以 www 身份登录(启用后)通过 shell 提供输出,但不通过 php。
【讨论】:
以上是关于PHP exec() 通过浏览器执行时不会执行 shell 命令的主要内容,如果未能解决你的问题,请参考以下文章