4

在迁移到 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:权限被拒绝

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

现在我可以通过命令行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 密钥的问题。

4

2 回答 2

2
  1. PHP 文件通常不需要可执行文件即可运行
  2. 尝试直接运行您的 PHP 脚本(而不仅仅是运行git pull) - 更重要的是,尝试在用户 PHP 运行时运行您的 PHP 脚本(可能是www-data,apache等 - 不太可能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 ( User,Group指令)
  2. 在您的 VirtualHost 设置中(例如,如果使用 suExec - 查找SuexecUserGroup指令)
  3. user如果您使用 php-fpm 作为 php 进程管理器(池的andgroup指令),请在您的 PHP-FPM 池 (/etc/php-fpm.d/) 的配置中。

而不是更改权限(即chmod),您应该更改chown文件的所有权()以匹配您的 php 用户的所有权。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 时做了与上述类似的事情(如果没有,请参阅文档

于 2012-05-05T18:05:18.030 回答
0

(代表 OP 发布)

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

echo `whoami`;

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

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

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

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

于 2013-05-26T09:50:57.737 回答