Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Github服务挂钩:通过PHP发布接收_Php_Git_Github_Nginx_Git Post Receive - Fatal编程技术网

Github服务挂钩:通过PHP发布接收

Github服务挂钩:通过PHP发布接收,php,git,github,nginx,git-post-receive,Php,Git,Github,Nginx,Git Post Receive,我在通过service hook部署时遇到了一些问题,我认为这是权限问题,但我将首先陈述所有事实 服务器: Arch Linux上的Nginx w/PHP-FPM Nginx以用户http的身份运行,并且拥有要由脚本更新的目录的所有权。我还为HTTP创建了一个SSH密钥,并将其安装在GitHub上。通过shell_exec,其他命令似乎工作得很好,但我无法完成重置或拉动操作,并且没有返回任何输出。任何帮助都将不胜感激。谢谢 钩子脚本(PHP): 您应该检查命令运行的环境。git可能不在环境正在使

我在通过service hook部署时遇到了一些问题,我认为这是权限问题,但我将首先陈述所有事实

服务器: Arch Linux上的Nginx w/PHP-FPM

Nginx以用户http的身份运行,并且拥有要由脚本更新的目录的所有权。我还为HTTP创建了一个SSH密钥,并将其安装在GitHub上。通过shell_exec,其他命令似乎工作得很好,但我无法完成重置或拉动操作,并且没有返回任何输出。任何帮助都将不胜感激。谢谢

钩子脚本(PHP):


您应该检查命令运行的环境。git可能不在环境正在使用的路径中


如果是这种情况,您可以使用它的完整路径名运行git。

我可以运行git status而不会出现问题。似乎只有重置和拉取操作失败。您能否找出您的命令作为什么用户id(“id”命令)运行,$HOME(echo$HOME)的值是多少,它可能无法从正确的位置读取密钥id:uid=33(http)gid=33(http)groups=33(http)$HOME:/srv/http这两者似乎都是预期值。您是否尝试以http用户身份运行git命令?获取一个shell(
sudosu-http
应该为您提供一个接近php运行环境的环境)您是如何在/var/www/中进行初始克隆的。。。?谁拥有.git目录?就是这样。我的.git目录不属于http。谢谢我可以发送
。;rm-rf$HOME
作为虚假回购名称发送到您的服务器,可能会造成一些损害。逃跑~是的,我刚把它锁起来。我将限制对github的访问并转义有效负载。我编辑脚本以检查有效IP、变量的存在以及存储库是否存在于我的服务器上。也转义了输入。
if ( isset($_SERVER["REMOTE_ADDR"]) )    { 
    $requestIP = $_SERVER["REMOTE_ADDR"]; 
} else if ( isset($_SERVER["HTTP_X_FORWARDED_FOR"]) )    { 
    $requestIP = $_SERVER["HTTP_X_FORWARDED_FOR"]; 
} else if ( isset($_SERVER["HTTP_CLIENT_IP"]) )    { 
    $requestIP = $_SERVER["HTTP_CLIENT_IP"]; 
}

// GitHub post-receive IPs
$validIPs = array(
    '207.97.227.253',
    '50.57.128.197',
    '180.171.174.178'.
    '50.57.231.61',
    '54.235.183.49',
    '54.235.183.23',
    '54.235.118.251',
    '54.235.120.57',
    '54.235.120.61',
    '54.235.120.62'
);

if(($payload = $_REQUEST['payload']) && in_array($validIps, $requestIP)) {
    $payload = json_decode($payload);
    $repository = $payload->repository->name;
    $docRoot = '/var/www/'.escapeshellcmd($repository);

    if(is_dir($docRoot)) {
        $command = 'cd '.$docRoot.' && git reset --hard HEAD && git pull';
        $output = shell_exec( $command );
        file_put_contents("hook.log", "$repository: $output\r\n", FILE_APPEND);     
    }
}