【问题标题】:Executing git commands via php over http通过 php 通过 http 执行 git 命令
【发布时间】:2015-11-14 00:24:45
【问题描述】:

操作系统 - Ubuntu 14.04

我正在使用 GIT webhooks 进行部署。

我已将部署密钥添加到 git 存储库,现在我想在本地存储库发生推送时触发 git pull origin master 命令。

这是我通过浏览器调用的test.php 文件:

<?php       
    //echo "THis is a test file on a test repo for testing the deploy functionality using github webhooks!!!!";
    echo exec('whoami');
    echo exec('sh -x /var/www/proj/test/git.sh');
?>

这是git.sh shell 文件:

#!/bin/bash
cd /var/www/proj-dir/test
git pull origin master

当我使用php test.php 在终端上运行此程序时,我得到了预期的正确结果:

 ubuntu From github.com:repo/test
 * branch            master     -> FETCH_HEAD
 Already up-to-date.

ubuntu 用于whoami,后跟git pull 输出。

现在,当我通过浏览器调用相同的http://example.com/test.php 时,问题出现了将用户更改为 www-data 但没有用。
检查了 apache 日志,当我通过浏览器执行时出现权限错误

  Please make sure you have the correct access rights and the repository exists. + cd /var/www/proj/deploy-test + git pull origin master 

主机密钥验证失败。致命:无法从远程存储库中读取。请确保您具有正确的访问权限并且存储库存在。

我需要进行哪些更新才能使文件通过浏览器请求工作?

如果我需要更新 sudoers 文件,应该更新什么?

更新
我将.ssh 键添加到var/www/ 目录,因为那是apache 用户的家。但我还是得到了

git pull origin master
error: cannot open .git/FETCH_HEAD: Permission denied

我还为 www-data 用户添加了一行,以便能够执行 sh 文件。

 www-data ALL=(anthony) NOPASSWD: /var/www/mysite/vendor/tmd/auto-git-pull/scripts/git-pull.sh

参考here还是不行
将 .git 文件夹的权限更新为 www-data 用户

sudo chown www-data:www-data /var/www/proj/test/.git

【问题讨论】:

  • 您需要确保请求拉取的是正确的用户。哪些用户具有从 repo 中提取的权限?看来你需要是 ubuntu。
  • 是的ubuntu,但我相信当通过http 访问时,www-data 的 apache 用户需要具有执行脚本的权限。在浏览了许多帖子后,我了解到我可能需要更新 www-data 的 sudoers 文件以获得正确的权限。如果我的方向错了,请纠正
  • 难道你不能只是 chmod 脚本,所以组/其他有执行权。看来您的脚本正在执行中。
  • 试过了,我将用户切换到www-data 获取 php 和 shell 文件,但没有成功!由于浏览器上的 whoami 表示用户尝试运行的是 www-data,我得到了 www-data,对吗?否则我可能会有错误的假设
  • @nicoX 我让它工作了,但我不确定所涉及的安全隐患。我不得不将.git文件夹的权限更改为www-data:www-data。这工作正常,但我尝试在我的 shell 文件中添加sudo ubuntu,但它给了我sudo: no tty present and no askpass program specified。我会要求添加一个带有答案的解决方案,以便我可以给你几点并关闭线程。

标签: php git github apache2 git-pull


【解决方案1】:

这似乎不是 PHP 问题,而是 git 配置问题。为用户 ubuntu 而不是为用户 www-data 正确配置了 Git。

你可以尝试让 PHP 像 ubuntu 一样运行,但这似乎不是最简单的,也不是正确的。我建议为 www-data 用户正确配置 git。

我怀疑您可以通过在终端上运行来重现该问题:

# become www-data user
sudo su www-data
# actions from your git.sh file
cd /var/www/proj-dir/test
git pull origin master

在确认您确实有重现场景后,您可以尝试为www-data 用户解决问题。

git config --list 以任一用户身份运行时的输出可能会有所不同。有关该分数的更多帮助,请参阅https://git-scm.com/book/en/Getting-Started-First-Time-Git-Setup

也可能是文件权限/所有权差异导致了问题。为了排除,我建议您使用git clone ... 作为用户www-data 在文件系统的其他路径中创建新的克隆和工作副本。然后再次查看git pull 现在是否按预期工作。

无论如何,您都可以考虑为www-data 提供自己的工作副本(无论权限问题如何)。这也将避免不得不处理工作副本中可能导致合并问题的未提交更改。从 PHP / git.sh 自动/无人值守处理这些可能很麻烦。

建议的工作流程将是:在您当前的工作目录中开发为ubuntu,并在您的更改中使用add/commit/push。然后让 PHP 将 pull 作为它自己(作为 www-data)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2018-11-21
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多