【问题标题】:Why is EC2 not pulling updates from bitbucket/github via post-receive hook?为什么 EC2 不通过 post-receive 挂钩从 bitbucket/github 提取更新?
【发布时间】:2012-05-13 04:21:38
【问题描述】:

在迁移到 EC2 之前,我会将提交推送到 bitbucket 存储库并让 post-receive 挂钩将它们拉到服务器:提交后,会调用 url http://mywebsite.com/update.php,其中 update.php 是:

    <?php `git pull`; ?>

这曾经像一个魅力。但是,它不适用于 EC2,我不确定为什么。

我尝试了以下方法:

  1. sudo chmod +x update.php 这应该使 update.php 可执行。

  2. 将 update.php 更改为

     <?php `sudo git pull`; ?>
    
  3. 将 update.php 更改为

     <?php `sudo -s`; `git pull`; ?>
    
  4. 将 update.php 更改为

     <?php `sudo -s git pull`; ?>
    

我认为这与权限有关,因为当我通过 ssh 在我的实例上时,我可以以 ec2-user 的身份运行“git pull”。另外,当我是 root 用户时,“git pull”也有效。

我怎样才能让它工作?我认为这与权限有关。

更新

我进行了一些故障排除(感谢@cyberx86 的提示)并发现以下内容:

我能够通过运行php update.php 在命令行上执行更新钩子,这在我是 root 的情况下有效,但在我是 ec2-user 时无效。错误日志显示

错误:无法打开 .git/FETCH_HEAD:权限被拒绝

所以我以 root 用户身份运行命令 chmod -R 777 .git

现在我可以在命令行上通过git pullphp update.php 提取更新,但是当我通过 post-receive 钩子或将浏览器指向 url/update.php 时它不起作用.错误日志显示

主机密钥验证失败。^M
致命:远端意外挂断

我认为这意味着无论哪个用户在通过浏览器访问该命令时运行该命令都没有设置 ssh 密钥,因此看起来 shell 命令正在运行,但远程存储库不允许该用户拉取。

根据@cyberx86 的建议,我检查了 /etc/passwd 中的用户,虽然没有 PHP 用户,但有一个名为 apache 的用户:apache:x:48:48:Apache:/var/www:/sbin/nologin 然后我运行 sudo -u apache php -q update.php 并收到以下消息

无法创建目录“/var/www/.ssh”。

无法确定主机“bitbucket.org (207.223.240.181)”的真实性。

RSA 密钥指纹已编辑

您确定要继续连接(是/否)?是的

未能将主机添加到已知主机列表 (/var/www/.ssh/known_hosts)。

权限被拒绝(公钥)。

致命:远端意外挂断

因此,这似乎是为通过浏览器运行 shell 脚本的用户(可能是 apache)设置一个 ssh 密钥的问题。

【问题讨论】:

  • a) PHP 文件通常不需要可执行才能运行 b) 尝试直接运行您的 PHP 脚本(而不是仅仅运行 git pull) - 更重要的是,尝试将您的 PHP 脚本作为用户 PHP 以(可能是 www-data、apache 等 - 不太可能是 ec2-user)的身份运行(以 root 身份):sudo -u php_user php -q /path/to/update.php。 c) 增加您的 error_reporting 和 display_errors 的详细程度 - 同时检查您的日志文件。 d) 最后 sudo 只有在 sudoers 中设置时才有效 - 它可能不适合 php 用户。
  • @cyberx86 感谢您的建议;你应该把它写下来作为答案。我们快要到了;只需要弄清楚如何使用 ssh 身份设置浏览器用户。有没有办法确定运行 php 脚本的是 apache 用户?应该是apache,但是/etc/passwd里面有26个条目
  • 这个问题在 ServerFault 上可能会更好——这不是一个真正的编程问题,并且(特别是因为它在 2 天内没有得到回答)将受益于不同的眼睛旧金山。

标签: git github amazon-ec2 bitbucket git-post-receive


【解决方案1】:
  1. PHP 文件通常不需要可执行才能运行
  2. 尝试直接运行您的 PHP 脚本(而不仅仅是运行git pull) - 更重要的是,尝试在用户 PHP 运行时运行您的 PHP 脚本(可能是 www-dataapache 等 - 不太可能ec2-user) 类似(以 root 身份):sudo -u php_user php -q /path/to/update.php
  3. 增加error_reportingdisplay_errors 的详细程度 - 同时检查您的日志文件。
  4. 最后,sudo(您的脚本中的内容)只有在 sudoers 中设置时才有效 - 这可能不适合 php 用户。

用户 php 正在运行:

  1. 在 Apache 的 httpd.conf 中(UserGroup 指令)
  2. 在您的 VirtualHost 设置中(例如,如果使用 suExec - 查找 SuexecUserGroup 指令)
  3. 如果您使用 php-fpm 作为 php 进程管理器(池的 usergroup 指令),请在您的 PHP-FPM 池 (/etc/php-fpm.d/) 的配置中。

您应该更改文件的所有权(chown)以匹配您的 php 用户,而不是更改权限(即 chmod)。 PHP 文件通常应该有 644 权限和目录 755 权限。除了测试(或有时是临时目录)之外,应该避免使用 777 - 如果您修复了所有权,您将不需要这种宽松的权限。

最后,似乎有两个问题: 1.您没有为您的 php 用户设置密钥来连接到 git 服务器和 2. 您没有 git 服务器密钥的副本(即验证您正在连接到正确的服务器)。

要获得让您登录 git 服务器的密钥(我不熟悉 bitbucket),我认为需要以下其中一项(仅一项,而不是全部):

  • 您已经有一个 SSH 密钥(用于 root 用户),您可以将其提供给您的 PHP 用户
  • 您将在服务器上为 PHP 用户生成一个新密钥,并将其上传到 bitbucket
  • 您将在 bitbucket 上生成一个新密钥,并将其下载到您的服务器,并将其添加到您的 PHP 用户密钥中。

获取 git 服务器的密钥应该更简单:

  1. 使用正确的所有权和权限创建目录 /var/www/.ssh(以便 php 可以写入)。
  2. 尝试以 php 用户的身份从您的服务器通过 SSH 连接到 git 存储库(或运行 git clone - git pull 也可以正常工作) - 并接受 git 服务器提供的密钥。

我假设您在最初设置服务器以使用 bitbucket 时执行了与上述类似的操作(如果没有,请参阅 the documentation

【讨论】:

    【解决方案2】:

    (代表 OP 发布)

    解决了。这就是我所做的。为了解决问题,我添加了

    echo `whoami`;
    

    更新.php,当我通过浏览器运行它时,它显示了用户名(不是用户 apache,而是在虚拟主机文件中设置的另一个用户)。我还注意到,在/etc/passwd 中,该用户名作为对 /bin/bash 的访问权限(与用户 apache 不同,该用户仅限于 /sbin/nologin),但该用户名对 shell 的访问权限在 sudoers 文件中受到限制。该文件在用户的 sudo 权限末尾包含 !SHELL,所以我只是使用 visudo 删除了它,现在它可以工作了。

    我在 Stack Overflow 和 Server Fault 上找到了一些相关的帖子:onetwothree

    我在第三个链接中使用了简化版的方法,但是我使用了一个shell命令而不是指向一个shell脚本。

    我有点担心我是否留下了任何安全漏洞,因为我一直在摆弄文件权限和/etc/sudoers,但现在我很高兴让它正常工作。理想情况下,我想让命令在没有 sudo 的情况下运行,因为这似乎会更安全,但这很可能是一旦找到足够好的问题解决方案就永远无法解决的事情之一.

    【讨论】:

      猜你喜欢
      • 2013-10-03
      • 1970-01-01
      • 2012-03-17
      • 2013-06-26
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      相关资源
      最近更新 更多