git pull通过PHP exec IIS

时间:2011-11-14 03:35:28

标签: php git ssh exec pull

很容易诊断出我遇到过的最困难的问题。我似乎无法打电话:

exec('call git pull', $output);

该过程会挂起,并倾向于使用IIS。

exec('call git status', $output); //works fine

这就是我所做的:

  • 生成的RSA密钥已添加到github(密码为空)
  • 每个人都有mysite/.git/Program Files/git/bincmd.exe
  • 的权限
  • 尝试使用'斜杠'问题
  • 在其他帖子中提到的ssl证书修复程序
  • 尝试使用https://而不是SSH
  • 尝试向stderr 2>NUL2>&1
  • 输送管道

显然,存在一个权限问题exec调用cmd.exe,而git.exe又调用sh.exe,后者又调用git-pull连接到github,后者又使用git-send-pack可能ssh-keygen和GOD知道还有什么。

我猜'sh.exe'确定当前用户是IUSR,无法找到要通过身份验证的RSA密钥。

如果我能弄明白如何exec IUSR帐户,我会尝试过。

如果我能弄明白如何cmd.exe git bash而不是git(通过exec),我会尝试过。

以下是最简单的问题:

如何通过PHP的{{1}}方法从我的github repo中提取?

这个问题肯定与SSH有关,但我完全在尝试的一切结束。

帮助!

10 个答案:

答案 0 :(得分:14)

我今天遇到了同样的问题,并使用进程监视器查看发生了什么,并发现由于某些原因,sh.exeC:\Windows\SysWOW64\config\systemprofile\.ssh中查找了密钥。所以我将C:\Users\Administrator\.ssh中的所有内容复制到该文件夹​​中,并且完美无缺。

答案 1 :(得分:1)

有许多php git库/工具。 https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#git-php

我个人一直在使用GLIP(php中的git库)http://fimml.at/#glip

进行攻击

我在github上有一个源代码叉,我添加了一个归档函数。 基本上我动态创建一个git命令并使用php的passthru方法来调用它。 或许查看我的代码可能会给你一些见解。这是提交 https://github.com/fontvirus/glip/commit/89127f7f9a4dc61697929f36684533406f348ffe

答案 2 :(得分:1)

我正在运行Windows Server 2012,但无法让Iamz的解决方案正常运行。

我在C:\中搜索了“.ssh”,发现C:\Program Files (x86)\Git\.ssh处有另一个.ssh文件夹。我将所有内容从C:\Users\Administrator\.ssh复制到此文件夹,设置权限以允许IUSR访问,一切都是犹太教。

答案 3 :(得分:0)

您必须直接向cmd.exe授予权限。根据Windows的版本以及应用程序池设置的方式,可能是IIS_IUSR,IUSR和/或NETWORK SERVICE。将具有完全权限的用户添加到cmd.exe。

我当然不建议这样做,因为它有直接的安全隐患。也就是说,我还没有找到任何其他方法在Windows中实现它。

答案 4 :(得分:0)

您需要使用proc_open,因此会看到最有可能与权限相关的问题。

这是script I use

<?php

//error_reporting(E_ALL);
ignore_user_abort(true);

function syscall ($cmd, $cwd) {
    $descriptorspec = array(
        1 => array('pipe', 'w'), // stdout is a pipe that the child will write to
    );
    $resource = proc_open($cmd, $descriptorspec, $pipes, $cwd);
    if (is_resource($resource)) {
        $output = stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        proc_close($resource);
        return $output;
    }
}

// GitHub will hit us with POST (http://help.github.com/post-receive-hooks/)
if (!empty($_POST['payload'])) {

    // pull from master
    $result = syscall('git pull', '/var/www/example.com');

    // send us the output
    mail('team@example.com', 'GitHub hook `git pull` result', $result);

    // clear APC
    if (apc_clear_cache('opcode') == false) {
        mail('root', 'Unable to apc_clear_cache()', '');
    }

}

?>

答案 5 :(得分:0)

我能够通过遵循这里的许多内容来部分地完成这项工作。我运行了一个运行

的批处理脚本

ssh-agent -s
ssh-add -l

看看我有什么钥匙。在运行这些命令之前,我使用正确的ssh密钥将HOME=/c/Users/Username环境变量设置为我的用户。 (我正在使用unix路径,因为我使用Git Bash运行它)

答案 6 :(得分:0)

我对窗户的环境不太了解

但主要问题是“.php文件”,调用exec命令没有管理员权限(或* NIX操作系统中的root)

在我的环境中,我知道该文件以root身份拥有权限(比如sudo) 另一种方法是创建具有权限777的新用户组,并将该文件分配给该用户的组

希望这个帮助

答案 7 :(得分:0)

我今天早些时候遇到过这个问题并以不同的方式解决了这个问题。

我的问题是IUSR没有将ssh密钥或git凭证文件放入的主文件夹。

我创建了一个.sh文件,在调用git之前更改了HOME变量,将我的密钥放在适当的位置就好像是它的主文件夹一样,然后用sh.exe运行.sh

#!/bin/bash
export HOME="/c/some/location"
git pull

答案 8 :(得分:0)

Iamz解决方案的另一个变体是使用目录C:\Windows\System32\config\systemprofile\.ssh

我通过在我的IIS服务器上运行以下脚本来达到此目的,该脚本立即表示C:\Windows\System32\config\systemprofile\.ssh缺失(请根据您的机器设置$ path_of_git和$ path_to_repo):

<?php
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin
   1 => array("pipe", "w"),  // stdout
   2 => array("pipe", "w"),  // stderr
);
$path_of_git = 'c:\\path\\to\\git';
$path_to_repo = 'C:\\inetpub\\repo';
$process = proc_open($path_of_git.' fetch', $descriptorspec, $pipes, $path_to_repo, null);
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
echo '<pre>'.htmlspecialchars($stdout).'</pre>';
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
echo '<pre style="color:red;">'.htmlspecialchars($stderr).'</pre>';
echo '<p>return value=' . proc_close($process) . '</p>';
?>

所有这一切,我仍然受到权限问题的困扰,所以我发现在每个git命令之前声明HOME是IUSR可以轻松到达的其他地方我很有用,用git sh执行整个事情。例如:

\pathToGit\bin\sh -c "export HOME='/c/somewhereIUSRCanGetTo/';git fetch"

其中C:\somewhereIUSRCanGetTo\.ssh\包含私钥和allowed_hosts文件

答案 9 :(得分:0)

将.ssh文件夹移至userprofile目录。您可以在此全局变量$ _SERVER [&#39; USERPROFILE&#39;]中看到您的应用配置文件目录。 就我而言,它是C:\ Windows \ system32 \ config \ systemprofile。 然后为用户提供读/写此文件夹(.ssh)的权限:IIS_IUSRS,IUSR