【问题标题】:PHP exec() will not execute shell command when executed via browserPHP exec() 通过浏览器执行时不会执行 shell 命令
【发布时间】: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() 没有问题。感谢您的所有意见!

标签: php system 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 执行某些应用程序。

    1. 运行命令sudo visudo。实际上我们想编辑etc/sudoers中的文件。为此,通过在终端中使用sudo visudo,它复制(临时)sudoers文件进行编辑。
    2. 在文件的末尾,添加以下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。

          【讨论】:

            猜你喜欢
            • 2012-12-26
            • 2012-09-26
            • 2017-05-06
            • 1970-01-01
            • 2023-03-28
            • 2014-08-20
            • 2013-08-25
            • 2013-09-07
            • 1970-01-01
            相关资源
            最近更新 更多