【问题标题】:PHP exec() git fetch failing with return value 255PHP exec() git fetch 失败,返回值 255
【发布时间】:2015-04-14 18:39:11
【问题描述】:

我已经修改了这个 github 项目的一个版本 https://github.com/lkwdwrd/git-deploy [我修改它是因为我的服务器(Mediatemple Grid Server)上没有解析 JSON 并且我还添加了自定义日志记录] 脚本使用 git hooks 自动部署 github repos .

脚本在一段时间内运行良好,但最近停止运行。

我已将问题隔离到git fetch 命令。这是我正在使用的确切代码:

exec( 'git fetch ' . $this->_remote . ' ' . $this->_branch, $fetch_output, $fetch_return_var );

$fetch_output 数组是空白的,$fetch_return_var 是 255。所以我认为 255 真的意味着 -1,这是 git 命令的错误。

但是,当 SSH 连接到服务器并以相同的用户身份运行时,我能够成功执行此命令,并且使用与正在构建的 exec() 函数的第一个参数完全相同的字符串。

所以现在我迷路了。

  • 通过 SSH 手动运行命令和使用 exec() 之间是否存在有效区别?
  • 有什么方法可以得到返回给 exec() 的实际 git fetch 错误?
  • 这可能是我的主机更改了某种服务器配置,我应该联系他们吗?

提前致谢


更新:

感谢@Matthias Huttar,我将exec() 更改为proc_open() 调用,让我可以看到STDERR 的输出[不知道为什么它没有通过exec() 记录,但我认为这是因为它是一个git fetch] 的子进程。这个输出是:

error: cannot fork() for git-remote-https: Resource temporarily unavailable

所以我认为我的服务器环境存在问题。不过我还不确定。

【问题讨论】:

    标签: php git exec


    【解决方案1】:

    如果您的 git fetch 出现错误,那么输出很可能不会写入 stdout 而是写入 stderr。 exec 只会给你标准输出的输出并忽略标准错误。

    exec( 'git fetch ' . $this->_remote . ' ' . $this->_branch.' 2>&1', $fetch_output, $fetch_return_var );
    

    很可能会显示您的错误。我的怀疑是您从 php 调用的 git 进程作为不同的用户(例如您的 apache 服务器的用户)运行,因此 nit 可以访问您的 ssh 密钥(或用户名/密码)。如果是这种情况,您的错误消息将是“权限被拒绝”。解决方案是为该用户生成一个新的默认 ssh 密钥,并在 github 中授予此密钥访问权限(“部署密钥”是 github 的调用方式)

    【讨论】:

    • 确认我运行了exec('whoami') 并且脚本以与我登录时相同的用户身份运行。 & 并且 git repo 不使用 ssh 但只是远程的 https 不应该有我不认为的密钥错误。
    • 似乎将其添加到命令末尾仍然不会从$fetch_output 返回任何内容,而是将$fetch_return_var 更改为254(这是旧值减1?!)
    • 如何运行该脚本?它是由 Apache 运行还是由 shell 执行?如果您使用普通 https,存储库是否完全公开(不需要 http 作者)?另一种选择是使用 process open 而不是 exec 这样您就可以分别获取 stdout 和 stderr 。 (意味着你最后不需要 2>&1
    • 我相信该脚本是由 Apache 运行的。 Github 将有效负载发送到一个 url,脚本解析该有效负载并完成它的工作。是的,repo 是公开的,任何人都可以使用 http url 进行克隆。进程打开是指proc_open()
    • 是的,我的意思是 proc_open。这至少应该为您提供有关错误的线索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2010-11-10
    • 2018-02-13
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多