为什么EC2没有通过post-receive hook从bitbucket / github中提取更新?

时间:2012-05-03 15:54:56

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

在转移到EC2之前,我会将提交推送到bitbucket repo并使用post-receive挂钩将它们拉到服务器:提交后,调用url http://mywebsite.com/update.php,其中up​​date.php为:< / p>

    <?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`; ?>
    
  5. 我认为它与权限有关,因为当我通过ssh访问我的实例时,我可以运行“git pull”作为ec2-user。此外,当我是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)。

         

    许可被拒绝(公钥)。

         

    致命:远程端意外挂断

    所以看起来这是为用户设置一个ssh密钥(可能是apache),它通过浏览器运行shell脚本。

2 个答案:

答案 0 :(得分:2)

  1. PHP文件通常不需要可执行才能运行
  2. 尝试直接运行PHP脚本(而不是仅运行git pull) - 更重要的是,尝试以PHP运行的用户身份运行PHP脚本(可能是www-dataapache,等等 - 不太可能ec2-user)像(作为根):sudo -u php_user php -q /path/to/update.php
  3. 提高error_reportingdisplay_errors的详细程度 - 还要检查日志文件。
  4. 最后sudo(你的脚本中有什么)只有在sudoers中设置才有效 - 这可能不适合php用户。
  5. 用户php正在运行:

    1. 在Apache的httpd.conf(UserGroup指令中)
    2. 在您的VirtualHost设置中(例如,如果使用suExec - 查找SuexecUserGroup指令)
    3. 在您的PHP-FPM池配置(/etc/php-fpm.d/)中,如果您使用php-fpm作为您的php进程管理器(usergroup指令池)。
    4. 您应该更改文件的所有权(chmod)以匹配您的php用户的所有权(而不是更改权限(即chown)。 PHP文件通常应具有644权限和目录755权限。除了测试(或有时是临时目录)之外,应该避免使用777 - 如果您修复了所有权,则不需要这样的宽松权限。

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

      要获取可以让你登录git服务器的密钥(我不熟悉bitbucket)我认为必须满足以下条件之一(只有一个,而不是全部):

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

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

      1. 使用正确的所有权和权限创建目录/var/www/.ssh(以便php可以写入它)。
      2. 尝试从服务器到git仓库(或运行git clone - 可能git pull可能也可以像php的用户一样工作) - 并接受git服务器提供的密钥。
      3. 我认为您在最初设置服务器以使用bitbucket时做了与上面类似的操作(如果没有,请参阅the documentation

答案 1 :(得分:0)

(代表OP发布)

解决了它。这就是我做的。要进行故障排除,我添加了

echo `whoami`;

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

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

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

我有点担心我是否因为文件权限和/etc/sudoers所做的所有问题而留下任何安全漏洞但是此时我很高兴让它工作。理想情况下,我想让命令在没有sudo的情况下运行,因为它似乎更安全,但这可能是一旦找到一个足够好的解决问题的解决方案之一就会发生的事情之一