【发布时间】:2012-05-13 04:21:38
【问题描述】:
在迁移到 EC2 之前,我会将提交推送到 bitbucket 存储库并让 post-receive 挂钩将它们拉到服务器:提交后,会调用 url http://mywebsite.com/update.php,其中 update.php 是:
<?php `git pull`; ?>
这曾经像一个魅力。但是,它不适用于 EC2,我不确定为什么。
我尝试了以下方法:
-
sudo chmod +x update.php这应该使 update.php 可执行。 -
将 update.php 更改为
<?php `sudo git pull`; ?> -
将 update.php 更改为
<?php `sudo -s`; `git pull`; ?> -
将 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 pull 和php 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