在迁移到 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:权限被拒绝
所以我chmod -R 777 .git
以root用户身份运行命令。
现在我可以通过命令行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 密钥的问题。