【问题标题】:Allow Apache to execute git pull允许 Apache 执行 git pull
【发布时间】:2012-10-16 02:59:08
【问题描述】:

还没有弄清楚。我已经看到了一些答案,但没有一个有帮助。

我正在尝试使用 Github Webhooks 让 github 在我的服务器上点击一个 url,并让服务器在点击后立即拉下新提交的项目。我有一个包含以下内容的 php 脚本:

<?php `git pull git@github.com:my-user/myrepo.git`; ?>

但是,该脚本在命中时是以用户 apache 运行的,所以我尝试了:

chown -R apache:apache .

它仍然有一个权限被拒绝的错误。

然后我尝试编辑 sudoers 文件并更改以下内容:

Host_Alias      LOCAL=127.0.0.1
apache          LOCAL=NOPASSWD: /var/www/html/git-hook.php

这仍然行不通。

如何做到这一点?如果我跑:

 sudo php git-hook.php

它工作得很好,所以 php 文件中的代码没有任何问题。我只想让它自动化。

有什么想法吗?

编辑:

我也忘了提。我什至创建了一个文件夹 /home/apache/.ssh 并复制了 git pull 的公钥和相同的结果。

【问题讨论】:

  • 在 sudoers 中有 apache 用户?它的 git sudo 正在运行(通过 PHP),而不是 git-hook.php
  • 产生相同的结果。不确定我是否理解您评论的最后一部分“它的 git sudo 正在运行(通过 PHP),而不是 git-hook.php”
  • 我的意思不是以运行 git 的 root 运行 php,而是以运行 git 的 apache 运行 php(因此您需要在 sudoers 中编辑 /var/www/html/git-hook.php 行)。有什么可以在 apache 错误日志中阐明更多信息?
  • 将我的 sudoers 文件修改为 apache LOCAL=NOPASSWD: /usr/bin/php,现在我从日志中收到 sudo: sorry, you must have a tty to run sudo,另外我看到一组奇怪的:Could not create directory '/var/www/.ssh'. Host key verification failed. fatal: The remote end hung up unexpectedly
  • 不应该是apache LOCAL=NOPASSWD: /usr/bin/git——apache用户可以通过sudo运行的命令吗?

标签: php git shell webhooks


【解决方案1】:

更改您的 PHP 以通过 sudo 运行 git

<?php `sudo git pull git@github.com:my-user/myrepo.git`; ?>

然后更改您的 suoders 以允许 git 由 apache 用户运行

apache ALL = NOPASSWD: /usr/bin/git

【讨论】:

  • 如果 git pull 命令必须以 apache 用户身份运行,它将如何授权,因为 ssh auth 只有在您从相应用户执行操作时才会起作用?
【解决方案2】:

已经有 Git Wrappers 和库。也许您可以尝试其中一种: https://github.com/kbjr/Git.php 和/或 http://www.gitphp.org/projects/gitphp/wiki

【讨论】:

  • 对于我需要的东西来说似乎有点矫枉过正。我只需要能够执行一个简单的 git pull 命令,并且只有在 Github 使用 webhook 访问服务器时。
【解决方案3】:

我是为一个开发站点做这个的——我不建议为一个 prd 站点做这个,尽管我想不出有什么特别危险的地方,只要脚本不带参数..

我创建了一个执行 git pull 的 php 脚本。在 Web 浏览器中,我导航到该脚本,并且由 deisgners 等推送的任何更改都会自动部署。 http://.../gitpullscript/gitpullscript.php

这通过创建 apache 用户拥有的 git checkout 来工作。您可以通过在属于 apache 用户(本例中为 www-data)的文档根目录之外的某个位置创建一个目录来执行此操作。然后一个 git clone 到那个目录,所以所有的文件都属于 www-data。然后将我想要的目录软链接到我的文档根目录中,以便可以在网络浏览器中访问它们。

www-data 不在 git 组中,并且存储库已设置为每个人都可以读取(但不能写入).. 因此 www-data 可以拉但不能推送

在项目层次结构中,我创建了一个目录来保存 gitpull 脚本。我使用 .htaccess 来密码保护这个目录。 <?php exec('cd /var/www-data/projects/myrepo; git pull');

mkdir /var/www-data sudo chown www-data-www-data su www-data mkdir /var/www-data/projects cd /var/www-data/projects git clone my-repo

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 2017-08-11
    • 2018-09-05
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2011-09-15
    • 2014-11-21
    相关资源
    最近更新 更多