【发布时间】:2013-02-19 17:37:45
【问题描述】:
我在通过服务挂钩部署时遇到了一些问题,我认为这是权限问题,但我会先说明所有事实。
服务器: Arch Linux 上带有 PHP-FPM 的 Nginx
Nginx 以 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作为错误的回购名称发送到您的服务器,这可能会造成一些损害。逃跑~ -
是的,我只是在锁定它之前让它工作。我将限制对 github 的访问并转义有效负载。
-
我编辑了脚本以检查有效 IP、变量是否存在以及存储库是否存在于我的服务器上。还转义了输入。
标签: php git github nginx git-post-receive