【问题标题】:PHP exec fails when called from a browser but not from CLI从浏览器而不是 CLI 调用 PHP exec 失败
【发布时间】:2012-10-27 14:02:23
【问题描述】:

我有一个简单的 PHP 脚本:

exec('git pull origin master', $shell_output, $output);
print_r($shell_output);
print_r($output)

当我通过 CLI php git.php 调用它时,它工作正常。我得到了预期的输出,返回值为 0。当我通过 Web 浏览器访问该页面时,它失败并返回值为 1。

我已将文件权限设置为 777,并确保 php.ini 不会阻止 exec() 函数。

【问题讨论】:

    标签: php git webhooks


    【解决方案1】:

    CLI 使用当前登录的用户(您)的凭据运行,它很可能与 Web 服务器进程使用的不同。做一个exec('whoami')等来验证。

    【讨论】:

    • 当前用户和运行apache的用户在同一个组,文件有777权限。这不应该缓解这个问题吗?
    • 难道 git 不需要知道是谁在发出git 命令来确定 SSH 密钥等吗?您是从公共回购中撤出吗?
    • 哦!我现在明白了。我的用户有一个 sss 密钥设置来访问 repo,但运行 apache 的用户没有。
    • 有什么建议可以解决这个问题吗?有没有办法为www-data 创建一个 ssh 密钥,或者通过另一个用户运行 git 命令?
    • 很遗憾,我不知道这方面的最佳实践。但是对我来说,通过公共 HTTP 请求执行 git 命令似乎不是一个非常常见/安全的用例。你想达到什么目的?
    【解决方案2】:

    在 Ates Goral 的帮助下,我解决了这个问题。

    为了调试问题,我运行了:

    sudo -u www-data php git.php

    查看脚本在www-data 用户下运行时的行为。有两个问题:

    www-data 没有自己的公钥。我创建了一个并将其添加到 github 存储库中。 .git 文件夹不能被 www-data 读取。这已通过 chowning 目录以授予我和 apache 都属于的组 www-data 的权限来解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 2010-11-10
      相关资源
      最近更新 更多