在转移到EC2之前,我会将提交推送到bitbucket repo并有一个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访问我的实例时,我可以运行“git pull”作为ec2-user.此外,当我是root用户时,“git pull”也能正常工作.
我怎样才能让它发挥作用?我认为这与权限有关.
更新
我做了一些故障排除(感谢@ cyberx86提示)并找到了以下内容:
我能够通过运行php update.php在命令行上执行更新钩子,它起作用的原因我是root用户,但不是当我是ec2用户时.错误日志显示
error: cannot open .git/FETCH_HEAD: Permission denied
所以我以root用户身份运行命令chmod -R 777 .git.
现在我可以通过命令行上的git pull和php update.php来获取更新,但是当我通过post-receive钩子或者将浏览器指向url / update.php时它不起作用.错误日志显示
Host key verification failed.^M
fatal: The remote end hung up unexpectedly
我认为这意味着无论用户在通过浏览器访问时运行该命令都没有设置ssh密钥,因此看起来shell命令正在运行,但远程存储库不允许该用户拉动.
根据@ cyberx86的建议,我检查了/ etc / passwd中的用户,虽然没有PHP用户,但有一个名为apache的用户:apache:x:48:48:Apache:/ var / www:/ sbin / nologin然后我运行sudo -u apache php -q update.php并得到以下消息
Could not create directory ‘/var/www/.ssh’.
The authenticity of host ‘bitbucket.org (207.223.240.181)’ can’t be established.
RSA key fingerprint is REDACTED
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/var/www/.ssh/known_hosts).
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
因此,似乎需要为用户(可能是apache)设置一个ssh密钥,该密钥通过浏览器运行shell脚本.
最佳答案 > PHP文件通常不需要可执行才能运行
>尝试直接运行PHP脚本(而不是仅运行git pull) – 更重要的是,尝试运行PHP脚本,因为PHP运行的用户(可能是www-data,apache等 – 不太可能是ec2-user)喜欢(以root身份):sudo -u php_user php -q /path/to/update.php.
>增加error_reporting和display_errors的详细程度 – 还要检查日志文件.
>最后sudo(你的脚本中有什么)只有在sudoers中设置时才有效 – 这可能不适合php用户.
用户php正在运行,因为:
>在Apache的httpd.conf(用户,组指令)中
>在VirtualHost设置中(例如,如果使用suExec – 查找SuexecUserGroup指令)
>如果使用php-fpm作为php进程管理器(池的用户和组指令),则在PHP-FPM池的配置(/etc/php-fpm.d/)中.
您应该更改文件的所有权(chown)以匹配php用户的所有权(而不是更改权限(即chmod). PHP文件通常应具有644权限和目录755权限.除了测试(或有时是临时目录)之外,应该避免使用777 – 如果您修复了所有权,则不需要这样的宽松权限.
最后,似乎有两个问题:
1.您没有为php用户连接到git服务器的密钥设置
2.您没有git服务器密钥的副本(即,验证您是否正在连接到正确的服务器).
要获得可以让你登录到git服务器的密钥(我不熟悉bitbucket),我认为必须满足以下条件之一(只有一个,而不是全部):
>您已经有一个SSH密钥(对于用户root),您可以为PHP用户提供
>您将在PHP服务器上为PHP用户生成一个新密钥,并将其上传到bitbucket
>您将在bitbucket上生成一个新密钥,并将其下载到您的服务器,并将其添加到您的PHP用户密钥中.
获取git服务器的密钥应该更简单:
>使用正确的所有权和权限创建目录/var/www/.ssh(以便php可以写入它).
>尝试从你的服务器到git repo(或运行git clone – git pull可能也可以工作)作为php的用户 – 并接受git服务器提供的密钥.
我假设您在最初设置服务器以使用bitbucket时执行了与上述类似的操作(如果没有,请参阅the documentation)