2013-02-19 26 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