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

(假设您希望使用超级用户运行restartmount 命令 (root) 权限。)

但是,如果您希望使用 超级用户权限,然后添加以下内容而不是上面的内容。您可能不想这样做,而不是ALL 命令,非常危险。

www-data ALL=NOPASSWD: ALL

3.编辑sudoers文件后(通过visudo我们编辑sudoers的临时文件,所以保存并退出临时文件(visudo)写入sudoers文件。(wq!

4.就是这样,现在在您的xxx.phpscript 中按以下方式使用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 命令的主要内容,如果未能解决你的问题,请参考以下文章

在linux上调用php exec函数

怎么用php命令执行php代码

PHP的exec()函数无返回值排查方法[转]

常用的PHP命令执行函数及利用方式

php执行外部命令函数:exec()passthru()system()shell_exec()对比

PHP通过exec执行git pull