2013-02-19 92 views
1

我有一些问题部署通过服务钩子,我认为这是一个权限问题,但我会先说明所有事实。Github服务钩子:通过PHP post-receive

服务器:Nginx的 w,基于Arch Linux的

的Nginx/PHP-FPM运行为用户HTTP和具有该目录的所有权由脚本来更新。我还为HTTP创建了一个SSH密钥并将其安装在GitHub上。其他命令似乎可以通过shell_exec正常工作,但无法完成重置或拉取操作,也无法从输出中返回任何输出。任何帮助,将不胜感激。谢谢!

钩子脚本(PHP):

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);  
    } 
} 
+1

我可以发''; rm -rf $ HOME“作为虚假回购商品名称,这可能会造成一些损害。 Escape〜 – Amelia 2013-02-19 21:43:47

+0

是的,我只是在锁定它之前才开始工作。我将限制对github的访问并逃脱有效载荷。 – seagoj 2013-02-19 23:08:29

+0

我编辑脚本以检查有效IP,变量是否存在,以及存储库是否存在于我的服务器上。也逃脱了输入。 – seagoj 2013-02-20 01:17:32

回答

2

您应该检查你的命令,在运行环境中有可能Git是不是在这种环境中使用的路径。

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

+0

我可以运行没有问题的git状态。这只是似乎失败的重置和拉动。 – seagoj 2013-02-19 19:53:21

+0

你能找出你的命令运行的是什么用户id(“id”命令),$ HOME的值是什么(echo $ HOME),它可能不会从正确的位置读取密钥 – 2013-02-19 19:58:59

+0

id: uid = 33 (http)gid = 33(http)groups = 33(http) $ HOME: /srv/http 这两者似乎都是预期值。 – seagoj 2013-02-19 20:20:16