我有一些问题部署通过服务钩子,我认为这是一个权限问题,但我会先说明所有事实。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);
}
}
我可以发''; rm -rf $ HOME“作为虚假回购商品名称,这可能会造成一些损害。 Escape〜 – Amelia 2013-02-19 21:43:47
是的,我只是在锁定它之前才开始工作。我将限制对github的访问并逃脱有效载荷。 – seagoj 2013-02-19 23:08:29
我编辑脚本以检查有效IP,变量是否存在,以及存储库是否存在于我的服务器上。也逃脱了输入。 – seagoj 2013-02-20 01:17:32