1

我有一个 PHP 文件,hook.php看起来像这样:

<?php `cd .. && git pull`;

该文件位于/var/www/oliverash.me/site/. 但是,需要拉取的 git 仓库是/var/www/oliverash.me/. ./site是 Apache 将其视为文档根目录的文件夹。

当我在浏览器中运行该文件时,它似乎并没有拉取存储库。

我也尝试过回显结果,但页面是空白的。

<?php echo `cd .. && git pull`;

4

4 回答 4

5

我不能发表评论来回复你,但我假设你正在运行一个 *nix 系统。如果您的 apache/php 守护进程没有访问权限,您将获得权限被拒绝.git/.git/您可以递归地更改目录的所有者/组。或者做一个chmod -R o+rw .git/*给每个人(即不是所有者,不是组)在 git 目录中读写的权限,这应该清除你得到的权限错误。

编辑 只需重新阅读问题,因此可能不需要以下内容,但以防万一。

但是,这样做,您需要记住,任何有权访问您的服务器的人都可以通过http://myurl/.git/etc 访问这些服务器。因此,作为安全预防措施,我会添加一个.htaccess文件,例如:

order deny, allow
deny from all

.git目录中,这样 apache 将拒绝从 Web 浏览器访问其中的所有内容。

于 2012-10-15T06:52:02.603 回答
1

你肯定有一个权限问题,也许是几个。

  1. php页面将以apache用户身份执行
  2. 该用户必须能够写入有问题的 git 存储库
  3. 该用户必须能够进行有问题的拉动
  4. 您没有指定拉取的来源是什么,但如果它是例如 git: 或 ssh: repo,那么该用户将需要权限(密钥、用户名/密码等)来访问远程执行从拉。
  5. 刚刚看到它想要 /var/www/.ssh - 所以你使用的是 ssh:// 远程,这很好,但由于它作为用户 apache 运行(/var/www 是用户 apache 的主目录),它正在寻找/var/www/.ssh 中的键,它没有找到,因此失败。解决方案:
    1. 使用 sudo 切换到具有 perms 的用户并以该用户身份运行 git pull(在您的 php 中,执行 'sudo git pull',并在您的 /etc/sudoers 中放置一行允许用户 apache 运行 'git pull ' 命令)
    2. 设置一个 .ssh/config 文件,该文件指定一个Host是远程的,一个User用于登录的,一个Identity是远程允许 ssh 进入并执行拉取的私钥的路径。
于 2012-10-16T14:49:36.030 回答
1

在根目录或您可以访问它的任何地方创建 webhook.php

$result = exec("cd /path/to/repo && git pull origin branch");

确保权限是 775 并且您的文件的用户和您的站点目录是 www-data 所有者

于 2020-09-11T12:21:55.150 回答
0

您在这里执行命令的用户有问题。

根据您的各种评论,系统命令以名为 apache(homedir is /var/www) 的用户身份执行。whoami您可以通过在 PHP 脚本中运行命令来验证这一点:

<?php echo `whoami`;

该用户apache通常是您的网络服务器在其下运行的用户,然后运行 ​​PHP,然后运行 ​​shell 命令。

显然您想以其他用户的身份运行该命令,但到目前为止您还没有共享哪一个用户的信息。

在正确的用户下运行 shell 命令,问题应该会消失。

在 linux 系统上,在不同用户下运行其他命令的命令称为sudo另一个su

或者,您可以使用 suexec 在与 webserver 用户不同的用户下执行 PHP。

在任何情况下,您都需要确保您有一个能够执行 git 命令的用户。我不知道你是如何自己测试的,我知道的最好方法是 ssh 进入服务器,手动执行 git pull 并收集所需的数据,如用户名、主目录等。

于 2012-10-16T14:24:23.623 回答